STM32标准库_04 | 串口接收不定长数据

本篇文章主要介绍STM32串口接收不定长数据,采用超时分包的方法,希望能给人以收获。

1.开发环境

软件环境

使用MDK5.25版本,芯片包为STM32F4系列。

硬件环境

开发板:STM32F407VGT6开发板,是一款大容量芯片,最高能跑168MHz。

烧录器:STlink或者Jlink。

2.工程搭建

直接复制上一篇代码,再加上串口接收中断和中断优先级设置的代码。讲到中断优先级设置,不得不讲一下STM32的NVIC(嵌套向量中断控制器)用于为中断分组,从而分配抢占优先级和响应优先级。

NVIC配置

抢占优先级:概念等同于51单片机中的中断。假设有两中断先后触发,已经在执行的中断抢占优先级如果没有后触发的中断的抢占优先级高,单片机就会先处理抢占优先级高的中断。也就是高抢占优先级打断低抢占优先级。注意:(抢占优先级序号越小,优先级越高,即优先级1高于优先级2)

响应优先级:只在相同抢占优先级的中断同时触发时起作用,抢占优先级相同,则优先执行响应优先级较高的中断。响应优先级不会造成中断嵌套。 如果中断的两个抢占优先级和响应优先级都一致,则优先执行位于中断向量表中位置较高的中断。

STM32对可分配的优先级分了五组,

AIRCR[10:8] bit[7:4]分配情况 分配结果 注释
0 111 0 : 4 0位抢占优先级
4位响应优先级
2^0 = 1个抢占优先级
2^4 =16个响应优先级
1 110 1 : 3 1位抢占优先级
3位响应优先级
2^1 = 2个抢占优先级
2^3 = 8个响应优先级
2 101 2 : 2 2位抢占优先级
2位响应优先级
2^2 = 4个抢占优先级
2^2 = 4个响应优先级
3 100 3 : 1 3位抢占优先级
1位响应优先级
2^3 = 8个抢占优先级
2^1 = 2个响应优先级
4 011 4 : 0 4位抢占优先级
0位响应优先级
2^4 =16个抢占优先级
2^0 = 1个响应优先级

个人比较喜欢的两种优先级配置的写法:

1.创建一个nvic.c和nvic.h,把所有中断的配置都些在一个函数里面,然后在main函数调用。

2.在main函数中设置NVIC中断分组,然后在系统资源初始化的时候加入对应的优先级配置(我们采用这一种)。

串口接收配置

设置串口为收发模式,开启串口接收中断和串口空闲中断。

1.串口接收中断比较好理解,就是串口接收缓冲区有数据了就产生一次串口接收中断,我们就去获取这个字节,然后清除接收中断标志位。

2.空闲中断是检测到有数据被接收后,总线上在一个字节的时间内没有再接收到数据的时候发生的。打个比方,我们说一个字比作串口发送一个字节的数据,那么我们说完一句话的时候中间是会有停顿的,表示我说了一句话,串口通信也是这样的,空闲中断就是检测这个停顿的。

串口接收中断函数编写

1.编写串口接收中断函数

2.编写指定发送长度的串口发送函数

3.别忘记把NVIC配置加上

3.串口收发测试

4.后记

STM32有空闲中断方便我们超时分包,但是像51等大多是单片机是没有串口空闲中断的。那么该怎么办呢?其实我们使用定时器和计算我们当前使用的波特率下传输一个字节的时间,来判断超时分包就可以了,我一般采用超过10个字节当作一包数据。这部分后面和定时器一起讲。

代码已全部上传到gitee,希望各位小伙伴们在下载的同时不忘点击Star,地址:https://gitee.com/Notmi/stm32-standard-peripheral-libraries

原文地址:https://www.cnblogs.com/zhanxiaohong0303/p/_2020_7_8_uartrecv.html