花了将近两天的时间,终于把Zephyr的开发环境配好了。太麻烦了,虽然有刘工帖子的助力,但配置过程依旧出现很多状况,不得不借助于DeepSeek解决。有时候DeepSeek也解决不了,得自己思考换个思路解决。磕磕绊绊的,总是断解决了。主要就是下载、安装工具链那一块,我最后是自己单独下载后解压过去才解决的。
环境的问题解决了,接下来是开发上问题。这个方面,怎么说呢,又到了我最不喜欢的环节。在进行开发时需要一边做配置、一边写代码。这个配置主要指的是配置设备树那一块。由于没有类似eclipse那样的集成开发环境,我暂时用的是普通文本编辑器来编写代码,非常不方便。后来想到用VSCode来写。虽然VSCode的Zephyr插件的工作环境还没配置好,但能用VSCode编程,比普通文本编辑器还是好多了。至少能有颜色标注关键字等,代码更容易阅读和检查。
测试程序依旧参照了刘工发的帖子,只是里面我想试试gpio toggle,学习在Zephyr下怎么操作GPIO。结果还是不太好,在处理GPIO Toggle上,不像STM32那样,可以快速定位相关的函数。因为是边学习边开发,在Zephyr下如何查找库支持的函数,竟然成为一件比较难的事情了。比如我希望在每次访问DHT11的时候利用板载LED作为指示灯的时候,查找类似Toggle这个样的PIN处理函数,就没成功。最后用的是比较蠢的办法,生命一个变量保存Toggle状态,并利用这个状态,使用gpio_pin_configure函数,在实例化的时候,使用不同的参数来驱动LED亮灭。虽然这个法子比较蠢,但最后还是成功实现了自己的测试意图。唉,查找系统提供的支持函数,有点难。
主程序代码如下:
#include <zephyr/kernel.h>
#include <zephyr/sys/printk.h>
#include <zephyr/device.h>
#include <zephyr/drivers/gpio.h>
#include "dht11.h"
#define DHT11_PIN 16
#define LED_PIN 19
#define LEDG_NODE DT_ALIAS(ledg)
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET_OR(LEDG_NODE, gpios, {0});
static bool led_state = false;
int main(void)
{
int ret;
uint8_t humidity, temperature;
printk("DHT11 Test starting...\n");
const struct device *gpio_dev = DEVICE_DT_GET(DT_NODELABEL(gpioa));
ret = dht11_init(gpio_dev, DHT11_PIN);
if (ret < 0) {
printk("DHT11 init failed: %d\n", ret);
return 0;
}
printk("DHT11 initialized\n");
ret = gpio_pin_configure(gpio_dev, LED_PIN, GPIO_OUTPUT_INACTIVE );
if (ret < 0) {
printk("LED init failed: %d\n", ret);
return ret;
}
while (1) {
led_state = !led_state;
gpio_pin_configure(gpio_dev, LED_PIN, led_state ?GPIO_OUTPUT_ACTIVE: GPIO_OUTPUT_INACTIVE );
ret = dht11_read(gpio_dev, DHT11_PIN, &humidity, &temperature);
if (ret == 0) {
printk("H=%d%% T=%d°C OK\n", humidity, temperature);
} else {
printk("Read failed: %d\n", ret);
}
k_sleep(K_SECONDS(3));
}
return 0;
}使用“gpio_pin_configure(gpio_dev, LED_PIN, led_state ?GPIO_OUTPUT_ACTIVE: GPIO_OUTPUT_INACTIVE );”
使用gpio_pin_configure函数完成绿色指示灯Toggle交替亮灭的处理。
DHT11那一块,照着刘工写的就可以正常读出温湿度数据。
我要赚赏金
