在GPIO方面,可以轻松的实现blink案例。
1、拷贝示例工程:
cp -r D:\luglZephyrproject\zephyr\samples\basic\blinky\ .\stm32c562_blink
2、进入工程执行编译
cd .\stm32c562_blink\
3、编译,指定开发板为nucleo_c562re
west build -b nucleo_c562re


4、下载:
west flash

可以看到开发板上的led闪灯了,用串口助手连接上,可以看到打印日志如下:

【拓展】
在开发板的CN8的IO都是可以配置为普通GPIO来使用。

我使用PA0,PA1,PA4分配驱动三个LED灯。
【实现步骤】
1、在工程的boards下面新建nucleo_c562re.overlay
2、添加设备树,内容如下:
#include <zephyr/dt-bindings/gpio/gpio.h>
/ {
aliases {
led1 = &led_2;
led2 = &led_3;
led3 = &led_4;
};
};
&leds {
led_2: led_2 {
gpios = <&gpioa 0 GPIO_ACTIVE_HIGH>;
label = "PA0_LED";
};
led_3: led_3 {
gpios = <&gpioa 1 GPIO_ACTIVE_HIGH>;
label = "PA1_LED";
};
led_4: led_4 {
gpios = <&gpioa 4 GPIO_ACTIVE_HIGH>;
label = "PA4_LED";
};
};在leds中定义了led2->led4分别对应PA0\PA1\PA4。指定gpioa为PA。然后在aliases 再重新对应led1-led3。
3、修改main.c
/*
* Copyright (c)2016 Intel Corporation
* SPDX-License-Identifier: Apache-2.0
*
* Flowing LED: PA0 (alias led1) -> PA1 (alias led2) -> PA4 (alias led3)
* Board LD1 (alias led0, PA5) is NOT touched here.
*/
#include <stdio.h>
#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>
#define SLEEP_TIME_MS 500
#define LED_COUNT 3
#define LED1_NODE DT_ALIAS(led1)
#define LED2_NODE DT_ALIAS(led2)
#define LED3_NODE DT_ALIAS(led3)
#if !DT_NODE_HAS_STATUS(LED1_NODE, okay) || \
!DT_NODE_HAS_STATUS(LED2_NODE, okay) || \
!DT_NODE_HAS_STATUS(LED3_NODE, okay)
#error "overlay not effective: led1/led2/led3 aliases missing"
#endif
static const struct gpio_dt_spec leds[] = {
GPIO_DT_SPEC_GET(LED1_NODE, gpios), /* PA0 */
GPIO_DT_SPEC_GET(LED2_NODE, gpios), /* PA1 */
GPIO_DT_SPEC_GET(LED3_NODE, gpios), /* PA4 */
};
int main(void)
{
int ret;
for (size_t i = 0; i < LED_COUNT; i++) {
if (!gpio_is_ready_dt(&leds[i])) {
printk("LED%u device not ready\n", (unsigned)i);
return 0;
}
ret = gpio_pin_configure_dt(&leds[i], GPIO_OUTPUT_INACTIVE);
if (ret < 0) {
printk("LED%u configure failed: %d\n", (unsigned)i, ret);
return 0;
}
}
printk("flowing-LED startup: PA0 -> PA1 -> PA4, step %dms\n", SLEEP_TIME_MS);
size_t idx = 0;
while (1) {
for (size_t i = 0; i < LED_COUNT; i++) {
(void)gpio_pin_set_dt(&leds[i], (i == idx) ?1 :0);
}
printk("LED[%u] ON\n", (unsigned)idx);
idx = (idx +1) % LED_COUNT;
k_msleep(SLEEP_TIME_MS);
}
return 0;
}编译下载后,打开日志打印如下:

实际工程效果:

【总结】
此次体验了,官方的示例,也进行了自定义的GPIO的操作,我们看到相比传传的开发方式,Zephyr可以有更多的灵活性。
我要赚赏金
