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

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

  1. 使用 HAL 库的函数
  2. 使用 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。

示例代码

说明

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

  1. 设置 LED2 对应引脚为输出模式,并给一个默认的低电平状态;
  2. 设置 USER 按键对应引脚为输入模式,然后绑定中断回调函数并使能中断;
  3. 按下 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 设备相关推荐

  1. xpt 2046的触摸屏 rt thread设备驱动框架

    1 基于rtt 开发触摸屏驱动 准备使用rtt 框架 , 驱动xpt 2046的触摸屏, 翻阅大量资料发现, 大部分文章强调的是时序图, 而且很多代码要么直接操作寄存器, 要么是io 口模拟, 只能用 ...

  2. 使用RT Thread设备框架封装一个I2C设备——DS3231

    使用RT Thread设备框架封装一个I2C设备--DS3231 前言 ENV配置 I2C测试 将ds3231封装成一个字符设备 结语 前言 学习rt thread的I2C的时候,恰巧手上的板子留了d ...

  3. RT-Thread Pin设备驱动API应用介绍

    概要 本文主要涉及Pin驱动相关的API接口的简要介绍及使用示例,有兴趣深入了解Pin驱动程序框架可参考:RT-Thread pin设备驱动代码结构剖析 PIN设备的操作方法 应用程序通过RT-Thr ...

  4. RT-Thread pin设备驱动代码结构剖析

    硬件测试平台:正点原子潘多拉STM32L4开发板 OS内核版本:4.0.0 注意:下面的示例代码是从原子提供的例程中摘录,因此可能与最新的RT-Thread源码有出入(因为RT-Thread源码在不断 ...

  5. 基于GD32F103C8T6添加RT Thread nano设备框架并添加串口设备(以控制台console( uart0 )为例)

    最近没事琢磨了一下使用设备框架的问题.因为将串口注册到设备框架可以应用十分丰富的软件包. 于是就整理了一下手上的工程,重新将工程梳理了一遍. 像这样是十分清爽了,其中RTOS是操作系统源代码 并且学习 ...

  6. rt thread studio使用QBOOT和片外flash实现OTA升级

    我们这里要使用单片机外部flash作为OTA的下载分区,外部flash硬件连接关系 PB3-->SPI3_CLK PB4-->SPI3_MISO PB5-->SPI3_MOSI PE ...

  7. RT Thread之 Uart2 操作

    官网连接:https://docs.rt-thread.org/#/rt-thread-version/rt-thread-standard/programming-manual/device/uar ...

  8. stm32f407单片机rt thread 片外spi flash OTA升级配置示例

    参考地址https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/ 第一步,生成Boot ...

  9. tt协议号服务器,TTIot: TTIoT云端物联网Iot组件;面向JAVA;netty;mqtt;异步推送;以事件为驱动;为设备提供安全可靠的连接通信能力;...

    TTIoT云端物联网组件;面向JAVA;以事件为驱动;为设备提供安全可靠的连接通信能力 TTIoT简介 TTIOT的Broker采用MQTT协议与设备进行交互,可以应用在数据采集.能源监控.智能生活. ...

最新文章

  1. 众多新点子推动比特币现金BCH普及
  2. eclipse打开jar包出现乱码问题解决方法
  3. 单例设计模式-静态内部类-基于类初始化的延迟加载解决方案及原理解析
  4. jenkins 部署文档
  5. 基于JAVA+SpringMVC+Mybatis+MYSQL的在线学习系统
  6. 【实践】图片主题模型在推荐系统的应用实践.pdf(附下载链接)
  7. minio在不同平台下的启动命令
  8. Git问题解决方案:不建议在没有为偏离分支指定合并策略时执行pull操作(Pulling without specifying how to reconcile divergent branches)
  9. 华为设备DHCP/DHCP中继及DHCPv6/DHCPv6中继详解
  10. 微正指纹识别算法MZFinger5.0
  11. rabbitmq 消息确认机制ACK
  12. 跨月作废发票,红字冲红注意事项 如何整理上交发票
  13. ARANGODB INSTALL
  14. 关于支付宝申请APP支付和网页支付在申请时需要的材料
  15. 区块链论文8(ContractGuard分析写作手法)
  16. A股日内回转交易意义何在?
  17. 计算机制作表格英语怎么说,表格用英语怎么说
  18. 3D打印成型成型原理有哪些?性价比高的教学3D打印机如何选购?
  19. linux学习(一)虚拟机界面全屏
  20. 嵌入式常用两类电源研究(DC-DC和LDO)

热门文章

  1. 计算机房在单位的作用,你们单位计算机房工作人员临时不在,单位人事部小陈,路过计算机房闻...
  2. Linux 系统安装 telnet
  3. 往数据库里面插入data数据
  4. 做人要心正,待人要心诚
  5. 37互娱,2019秋招提前批,web后端工程师
  6. php八进制十六进制,php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码...
  7. 一分钟搞明白什么是维度,什么是事实,什么是度量,什么是粒度
  8. Spring 框架分析
  9. python判断年份是否为闰年
  10. 【论文阅读】Regional Semantic Contrast and Aggregation for Weakly Supervised Semantic Segmentation