这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【Zephyr|NUCLEO-C562RE】2GPIO操作

共1条 1/1 1 跳转至

【Zephyr|NUCLEO-C562RE】2GPIO操作

高工
2026-06-10 13:14:40     打赏

在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

image.png

image.png

4、下载:

west flash

image.png

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

image.png


【拓展】

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

image.png

我使用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;
}

编译下载后,打开日志打印如下:

image.png

实际工程效果:

leds_demo_small.gif

【总结】

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




关键词: NUCLEO-C562RE     Zephyr     GPIO    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]