RT-Thread 驱动 PIN 设备

网友投稿 568 2022-09-07

RT-Thread 驱动 PIN 设备

本示例在 STM32 NUCLEO-F411RE 开发板进行,由于 RT-Thread 项目中已包含对应的 BSP,也就是 bsp/stm32/stm32f411-st-nucleo 工程目录,因此我们在此基础上进行开发即可。

用 RT-Thread 控制 STM32 的 GPIO 有两种方法:

使用 HAL 库的函数使用 RT-Thread 的 pin 设备

本示例使用 RT-Thread 的 pin 设备进行开发。

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()​

脱离引脚中断回调函数

定义在

头文件:components/drivers/include/drivers/pin.h源文件:components/drivers/misc/pin.c

上述 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。

示例代码

说明

示例代码的主要步骤如下:

设置 LED2 对应引脚为输出模式,并给一个默认的低电平状态;设置 USER 按键对应引脚为输入模式,然后绑定中断回调函数并使能中断;按下 USER 按键切换 LED2 的亮灭状态。

电路

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 rtconfigfrom building import *cwd = GetCurrentDir()CPPPATH = [cwd, str(Dir('#'))]src = Split("""main.cuser_key_sample.c""")group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)Return('group')

执行 ​​scons​​ 编译,将目标文件下载到 STM32。大功告成!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Devops 技术:Fabric 还是 Ansible
下一篇:遭遇换帅等意外,国足40强赛征程多坎坷!
相关文章

 发表评论

暂时没有评论,来抢沙发吧~