本示例在 STM32 NUCLEO-F411RE 开发板进行,由于 RT-Thread 项目中已包含对应的 BSP,也就是 bsp/stm32/stm32f411-st-nucleo 工程目录,因此我们在此基础上进行开发即可。
用 RT-Thread 控制 STM32 的 GPIO 有两种方法:
本示例使用 RT-Thread 的 pin 设备进行开发。
应用程序通过 RT-Thread 提供的 PIN 设备管理接口来访问 GPIO,相关接口如下所示:
函数 | 描述 |
---|---|
rt_pin_mode() |
设置引脚模式 |
rt_pin_write() |
设置引脚电平 |
rt_pin_read() |
读取引脚电平 |
rt_pin_attach_irq() |
绑定引脚中断回调函数 |
rt_pin_irq_enable() |
使能引脚中断 |
rt_pin_detach_irq() |
脱离引脚中断回调函数 |
定义在
上述 API 的用法这里就不介绍了,小伙伴们自己看手册吧~
RT-Thread 提供的引脚编号需要和芯片的引脚号区分开来,它们并不是同一个概念,引脚编号由 PIN 设备驱动程序定义,和具体的芯片相关。有 2 种方式可以获取引脚编号:使用宏定义、查看 PIN 驱动文件。
如果使用 rt-thread/bsp/stm32
目录下的 BSP 则可以使用下面的宏获取引脚编号:
GET_PIN(port, pin)
获取引脚号为 PF9 的 LED0 对应的引脚编号的示例代码如下所示:
#define LED0_PIN GET_PIN(F, 9)
如果使用其他 BSP 则需要查看 PIN 驱动代码 drv_gpio.c 文件确认引脚编号。此文件里有一个数组存放了每个 PIN 脚对应的编号信息,如下所示:
static const struct pin_index pins[] =
{
#if defined(GPIOA)
__STM32_PIN(0 , A, 0 ),
__STM32_PIN(1 , A, 1 ),
__STM32_PIN(2 , A, 2 ),
__STM32_PIN(3 , A, 3 ),
__STM32_PIN(4 , A, 4 ),
__STM32_PIN(5 , A, 5 ),
...
}
以 __STM32_PIN(0 , A, 0 )
为例,前面的 0 为 RT-Thread 使用的引脚编号,A 为端口号,后面的 0 为引脚号,所以 PA0 对应的引脚编号为 0。
示例代码的主要步骤如下:
LED 部分电路原理图,连接到 STM32 的 PA5 引脚。
USER KEY 部分电路原理图,连接到 STM32 的 PC13 引脚。
applications/user_key_sample.c 代码
#include
#include
#include
#define LED2_PIN GET_PIN(A, 5)
#define USER_BTN_PIN GET_PIN(C, 13)
void user_key_isr(void *args)
{
rt_kprintf("key pressed\n");
rt_pin_write(LED2_PIN, !rt_pin_read(LED2_PIN));
}
static int user_key_sample(void)
{
rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT);
rt_pin_write(LED2_PIN, PIN_LOW);
rt_pin_mode(USER_BTN_PIN, PIN_MODE_INPUT_PULLUP);
rt_pin_attach_irq(USER_BTN_PIN, PIN_IRQ_MODE_FALLING, user_key_isr, RT_NULL);
rt_pin_irq_enable(USER_BTN_PIN, PIN_IRQ_ENABLE);
return 0;
}
//MSH_CMD_EXPORT(user_key_sample, user key sample);
INIT_DEVICE_EXPORT(user_key_sample);
在 applications/SConscript 中添加 user_key_sample.c
import rtconfig
from building import *
cwd = GetCurrentDir()
CPPPATH = [cwd, str(Dir('#'))]
src = Split("""
main.c
user_key_sample.c
""")
group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)
Return('group')
执行 scons
编译,将目标文件下载到 STM32。大功告成!