RT-Thread 第 5 课时:设备驱动框架|PIN 引脚 UART 串口实战

张开发
2026/4/20 1:01:23 15 分钟阅读

分享文章

RT-Thread 第 5 课时:设备驱动框架|PIN 引脚  UART 串口实战
一、课时目标理解 RT-Thread 设备模型设备注册 / 打开 / 读写精通 PIN 驱动LED / 按键输入查询 中断精通 UART 串口驱动收发数据、FinSH 配置掌握标准驱动写法一套代码兼容多芯片看懂 BSP 板级配置会简单改引脚二、核心概念RT-Thread 设备驱动框架2.1 为什么要用设备框架裸机痛点换芯片就要重写 GPIO、串口代码寄存器一堆可读性差没法统一管理、没法上层软件复用RT-Thread 做法统一设备模型 标准 API 底层 BSP 适配应用层只调用pin/uart标准函数不碰寄存器。2.2 设备分类常用字符设备PIN、UART、I2C、SPI块设备SD 卡、Flash网络设备网卡、WiFi2.3 标准调用流程设备注册 → 应用打开 → 配置参数 → 读写操作 → 关闭三、实战 1PIN 设备驱动GPIO 标准操作3.1 常用 PIN API// 设置引脚模式 void rt_pin_mode(rt_base_t pin, rt_uint8_t mode); // 写引脚电平 void rt_pin_write(rt_base_t pin, rt_uint8_t value); // 读引脚电平 rt_uint8_t rt_pin_read(rt_base_t pin); // 引脚中断绑定 rt_err_t rt_pin_attach_irq(rt_base_t pin, rt_uint8_t mode, void (*hdr)(void*), void* args); void rt_pin_irq_enable(rt_base_t pin, rt_uint8_t enable);引脚宏说明GET_PIN(port, num)例GET_PIN(A,5)→ PA53.2 基础实操标准 API 闪 LED#include rtthread.h #include rtdevice.h #define LED_PIN GET_PIN(A,5) void led_thread(void *arg) { rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); while(1) { rt_pin_write(LED_PIN, PIN_LOW); rt_thread_mdelay(500); rt_pin_write(LED_PIN, PIN_HIGH); rt_thread_mdelay(500); } } int main(void) { rt_thread_t t rt_thread_create(led, led_thread, RT_NULL, 512, 20, 10); rt_thread_startup(t); return 0; }3.3 进阶按键中断标准 PIN 中断#include rtthread.h #include rtdevice.h #define KEY_PIN GET_PIN(A,0) #define LED_PIN GET_PIN(A,5) // 中断回调 void key_irq_cb(void *args) { rt_pin_write(LED_PIN, !rt_pin_read(LED_PIN)); } int main(void) { rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); rt_pin_mode(KEY_PIN, PIN_MODE_INPUT_PULLUP); // 绑定下降沿中断 rt_pin_attach_irq(KEY_PIN, PIN_IRQ_MODE_FALLING, key_irq_cb, RT_NULL); rt_pin_irq_enable(KEY_PIN, PIN_IRQ_ENABLE); return 0; }✅优势完全不操作寄存器代码简洁、可移植。四、实战 2UART 串口设备驱动最常用4.1 UART 设备模型流程在rtconfig.h/ Studio 配置里开启串口系统自动注册 uart1/uart2...应用层通过rt_device_find→ open → read/write4.2 核心串口 API// 查找串口设备 rt_device_t rt_device_find(const char* name); // 打开设备 rt_err_t rt_device_open(rt_device_t dev, rt_uint8_t oflag); // 发送数据 rt_size_t rt_device_write(rt_device_t dev, rt_off_t pos, const void* buf, rt_size_t size); // 接收数据中断/轮询 rt_size_t rt_device_read(rt_device_t dev, rt_off_t pos, void* buf, rt_size_t size);4.3 实操串口自发自收轮询方式#include rtthread.h #include rtdevice.h #define UART_NAME uart2 rt_device_t uart_dev; void uart_thread(void *arg) { char tx_buf[] Hello UART Device\r\n; char rx_buf[64]; while(1) { // 发送 rt_device_write(uart_dev, 0, tx_buf, rt_strlen(tx_buf)); // 简单读取 int len rt_device_read(uart_dev, 0, rx_buf, sizeof(rx_buf)-1); if(len 0) { rx_buf[len] \0; rt_kprintf(收到串口数据%s\r\n, rx_buf); } rt_thread_mdelay(1000); } } int main(void) { // 1.查找串口 uart_dev rt_device_find(UART_NAME); if(!uart_dev) { rt_kprintf(找不到串口设备\r\n); return -1; } // 2.打开串口 rt_device_open(uart_dev, RT_DEVICE_OFLAG_RDWR); // 3.创建收发线程 rt_thread_t t rt_thread_create(uart, uart_thread, RT_NULL, 1024, 15, 10); rt_thread_startup(t); return 0; }4.4 高阶串口中断接收 消息队列工程标配流程串口中断 → 把数据抛进消息队列 → 业务线程解析工业项目、网关、Modbus 全部这套架构五、FinSH 查看设备调试必备终端输入list_device能看到pin 设备uart1 uart2已注册所有驱动设备快速排查串口没数据、设备没注册、引脚配置错误。六、本节课避坑总结重点背诵所有 GPIO 优先用rt_pin_xxx禁止裸寄存器中断回调里不能延时、不能复杂运算、不能阻塞UART 收发大数据一定要配「消息队列」缓存修改串口波特率、引脚要到 BSP/board 配置里改设备打不开先list_device看有没有注册成功七、课后作业用 PIN 中断实现按键长按 / 短按区分控制 LED配置 uart1 实现和电脑串口助手双向收发把串口接收数据存入消息队列实现异步解析下一节课预告第 6 课时I2C/SPI 设备驱动 传感器实战AHT10/OLED直接打通外设采集、屏幕显示进入完整小型物联网项目阶段。如果觉得本文对你有帮助欢迎点赞收藏关注后续会持续更新rt-thread 新手实战教程陪你从入门到精通日常深耕嵌入式、物联网、协议开发相关技术有技术答疑、项目合作、毕设指导需求均可私信私聊

更多文章