说明:
上一期我们学习了PWM,并完成了呼吸灯实验,这一期我们来做串口中断接收的实验,串口中断接收配置流程有好几个步骤:开启时钟(包括串口时钟和GPIO时钟)、配置GPIO复用模式、配置GPIO的模式、配置GPIO输出、配置串口(一些参数)、使能串口(串口使能、发送使能和接收使能)和中断配置(串口接收中断和中断优先级),编写串口接收中断服务函数,最后在main函数死循环中进行串口中断接收数据处理,在XCOM查看现象。
提示:以下部分参考于梁山派开发板学习指南,代码如有更有解可在评论区一起沟通交流哈。
一、串口中断接收配置
1、使能串口接收
2、中断配置
USART_INT_RBNE:接收缓冲区不为空中断和溢出错误中断。如果开启了这个中断,每当接收到
一个字符,就会触发这个中断。
USART_INT_IDLE:空闲检测中断。如果开启了这个中断,将会在一帧数据传输完成之后触发中
断,一般用来判断一帧数据是否传输完成。
3、串口变量定义
.h里面定义
二、串口接收中断服务函数
FlagStatus usart_interrupt_flag_get(uint32_t usart_periph, usart_interrupt_flag_enum int_flag);
这个函数获取串口中断的标志位状态。有两个参数,第一个参数就是要获取的串口外设,第二个参数就是要获取的串口中断的标志位。
串口接收数据要到中断中去处理,前面串口中断配置的时候,我们打开了 USART_INT_RBNE 和 USART_INT_IDLE 这两个中断,那在中断服务函数里面也需要对这两个中断分别进行判断。
USART_INT_RBNE
和
USART_INT_IDLE
分 别 对 应 于
USART_INT_FLAG_RBNE
和
USART_INT_FLAG_IDLE
。在检测到
USART_INT_FLAG_RBNE
中断标志被置
1
之后,就说明当前缓冲区不为空了,有数据到来了,我们要做的操作就是把当前数据读出来然后保存到到接收数组中,然后对数据长度进行加一,等待下一次数据存储。
uint16_t usart_data_receive(uint32_t usart_periph);
这个函数可以接收数据。有一个参数,就是要读取的串口外设。需要注意的是这个函数读取数据的时候会自动将标志位请零,所以我们就不用手动清除标志位了。
在接收数据的过程中可以判断
USART_INT_FLAG_IDLE
这个标志是否置
1
,如果这个标志位置
1
说明一帧数据传输完成,然后将
g_recv_complete_flag
变量置
1
,说明可以进行数据处理。需要注意的是,在这个中断满足的时候,需要执行 usart_data_receive(BSP_USART);
去清除中断标志,不然数据会出现混乱。
三、串口中断接收数据处理
四、现象
注:一个汉字两个字节。
总结
完成串口中断接收的实验!