2026.9.11
如何完成USART串口的bsp层开发
- 软件层级分层 + 大致流程
- 详解
1、软件层级分层 + 大致流程
硬件层 - SDK - 驱动层 - bsp - Service - 应用层
本次主要关注bsp层。
bsp层需要完成哪些功能:初始化USART + 初步处理接收的数据 + 将处理后的数据传给Service
本次USART分为了:DMA模式 + 中断模式(属于搬运方式的差异)
2、详解部分
-
中断方式初始化:开启对应时钟 + 利用库函数初始化USART + 配置波特率 + 开启发送 + 开启接收 + 清除(初始化)发送完成中断标志 + 清除(初始化)数据缓冲区非空中断标志 + 开启发送完成、数据缓冲区非空、IDLE线检测中断标志 + 使能USART_a + 使能对应GPIO + 使能NVIC对应优先级
-
DMA方式初始化:开启对应时钟 + 利用库函数初始化USART + 配置波特率 + 开启发送 + 开启接收 + 使能USART_b + 进行DMA配置(确认目标地址和源地址,确认搬运方向,确认模式等) + 使能对应GPIO + 使能NVIC对应优先级
-
对于本地数据进行初始化:为各个串口动态申请对应的内存,确认缓冲区大小,开启互斥锁。
3、各个层级的功能
PS:在C语言中,声明一个指针类型ST_USART_LOCAL_MNG * pUsart = &gs_stUartLocalMng[enId];
此时表示创建了指针变量pUasrt指向&gs_stUartLocalMng[enId]。与在使用过程中 p = a;不一样,在使用中p表示的是当前指针p所指向地址存储的值,p表示地址。但是在定义中ST_XXX * p = &a;仅仅是为了声明p是个指针,不代表这*p存储着&a,p才是指向&a。 -
中断方式:触发硬件中断后,在中断内(查看当前USART的中断标志位,根据标志位确认进入哪个处理函数),主要分为了三种状态(RBNE-收到一个字节,TC-一个字节发完了,IDLE-总线IDLE了)没错它是一个字节一个字节的发的。
1)当RBNE:将USART_DATA中的这个字节读走,存入环形数组。
2)当TC:清除标志,确认是否为最后一个字节,释放互斥锁
3)当IDLE:将本次接收的数据上传到上层 -
DMA方式:在中断中确认当前DMA状态
浙公网安备 33010602011771号