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 <rtthread.h>
#include <rtdevice.h>
#include <board.h>#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。大功告成!
RT-Thread 驱动 PIN 设备相关推荐
- xpt 2046的触摸屏 rt thread设备驱动框架
1 基于rtt 开发触摸屏驱动 准备使用rtt 框架 , 驱动xpt 2046的触摸屏, 翻阅大量资料发现, 大部分文章强调的是时序图, 而且很多代码要么直接操作寄存器, 要么是io 口模拟, 只能用 ...
- 使用RT Thread设备框架封装一个I2C设备——DS3231
使用RT Thread设备框架封装一个I2C设备--DS3231 前言 ENV配置 I2C测试 将ds3231封装成一个字符设备 结语 前言 学习rt thread的I2C的时候,恰巧手上的板子留了d ...
- RT-Thread Pin设备驱动API应用介绍
概要 本文主要涉及Pin驱动相关的API接口的简要介绍及使用示例,有兴趣深入了解Pin驱动程序框架可参考:RT-Thread pin设备驱动代码结构剖析 PIN设备的操作方法 应用程序通过RT-Thr ...
- RT-Thread pin设备驱动代码结构剖析
硬件测试平台:正点原子潘多拉STM32L4开发板 OS内核版本:4.0.0 注意:下面的示例代码是从原子提供的例程中摘录,因此可能与最新的RT-Thread源码有出入(因为RT-Thread源码在不断 ...
- 基于GD32F103C8T6添加RT Thread nano设备框架并添加串口设备(以控制台console( uart0 )为例)
最近没事琢磨了一下使用设备框架的问题.因为将串口注册到设备框架可以应用十分丰富的软件包. 于是就整理了一下手上的工程,重新将工程梳理了一遍. 像这样是十分清爽了,其中RTOS是操作系统源代码 并且学习 ...
- rt thread studio使用QBOOT和片外flash实现OTA升级
我们这里要使用单片机外部flash作为OTA的下载分区,外部flash硬件连接关系 PB3-->SPI3_CLK PB4-->SPI3_MISO PB5-->SPI3_MOSI PE ...
- RT Thread之 Uart2 操作
官网连接:https://docs.rt-thread.org/#/rt-thread-version/rt-thread-standard/programming-manual/device/uar ...
- stm32f407单片机rt thread 片外spi flash OTA升级配置示例
参考地址https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/ 第一步,生成Boot ...
- tt协议号服务器,TTIot: TTIoT云端物联网Iot组件;面向JAVA;netty;mqtt;异步推送;以事件为驱动;为设备提供安全可靠的连接通信能力;...
TTIoT云端物联网组件;面向JAVA;以事件为驱动;为设备提供安全可靠的连接通信能力 TTIoT简介 TTIOT的Broker采用MQTT协议与设备进行交互,可以应用在数据采集.能源监控.智能生活. ...
最新文章
- 众多新点子推动比特币现金BCH普及
- eclipse打开jar包出现乱码问题解决方法
- 单例设计模式-静态内部类-基于类初始化的延迟加载解决方案及原理解析
- jenkins 部署文档
- 基于JAVA+SpringMVC+Mybatis+MYSQL的在线学习系统
- 【实践】图片主题模型在推荐系统的应用实践.pdf(附下载链接)
- minio在不同平台下的启动命令
- Git问题解决方案:不建议在没有为偏离分支指定合并策略时执行pull操作(Pulling without specifying how to reconcile divergent branches)
- 华为设备DHCP/DHCP中继及DHCPv6/DHCPv6中继详解
- 微正指纹识别算法MZFinger5.0
- rabbitmq 消息确认机制ACK
- 跨月作废发票,红字冲红注意事项 如何整理上交发票
- ARANGODB INSTALL
- 关于支付宝申请APP支付和网页支付在申请时需要的材料
- 区块链论文8(ContractGuard分析写作手法)
- A股日内回转交易意义何在?
- 计算机制作表格英语怎么说,表格用英语怎么说
- 3D打印成型成型原理有哪些?性价比高的教学3D打印机如何选购?
- linux学习(一)虚拟机界面全屏
- 嵌入式常用两类电源研究(DC-DC和LDO)
热门文章
- 计算机房在单位的作用,你们单位计算机房工作人员临时不在,单位人事部小陈,路过计算机房闻...
- Linux 系统安装 telnet
- 往数据库里面插入data数据
- 做人要心正,待人要心诚
- 37互娱,2019秋招提前批,web后端工程师
- php八进制十六进制,php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码...
- 一分钟搞明白什么是维度,什么是事实,什么是度量,什么是粒度
- Spring 框架分析
- python判断年份是否为闰年
- 【论文阅读】Regional Semantic Contrast and Aggregation for Weakly Supervised Semantic Segmentation