当前位置:网站首页>STM32LL库——USART中断接收不定长信息
STM32LL库——USART中断接收不定长信息
2022-08-02 14:09:00 【天山没有长寿茶】
通用同步异步收发器(USART)既是串口,可以与电脑上的串口助手连接,是调试单片机的重要方式。双向通信至少需要2个引脚:接受数据输入(RX)和发送数据输出(TX)。

首先在STM32CubeMX中配置好使用串口的基本参数,开启串口中断,并将要是用的库设置为LL库:


自动生成好基础代码后,添加如下代码开启接收缓冲区Rx非空中断与空闲中断:
LL_USART_EnableIT_RXNE(USART2);
LL_USART_EnableIT_IDLE(USART2);RXNE为接收缓冲器Rx非空标志,置1表明接收到了数据(1个字节),产生中断;IDLE为空闲标志,置1表明当前数据接收完毕(1帧数据),产生中断。接收不定长信息:
char data[20];
uint8_t Rflag = 0;
uint8_t Rnum = 0;
// 我们将接收到的数据存入字符串数组data[]中,Rnum表明数据长度,Rflag表示接收状态,=1即接收完毕
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
// 空闲中断,表明接收到了1帧所有的数据
if(LL_USART_IsActiveFlag_IDLE(USART2)){
// 清楚中断标志位
LL_USART_ClearFlag_IDLE(USART2);
data[Rnum] = '\0';
Rflag = 1;
Rnum = 0;
}
// Rx非空中断,表明接收到了一个字节
// 读取Rx可自动清除中断标志位
if(LL_USART_IsActiveFlag_RXNE(USART2)){
// 如果数组长度大于设置的data最大长度,直接停止接收
if(Rnum > 18){
data[19] = '\0';
Rflag = 1; // stop receive
Rnum = 0; // wait for the next data
}
if(Rflag == 0){
data[Rnum] = LL_USART_ReceiveData8(USART2);
Rnum ++;
}
}
WRITE_REG(USART2->RQR, USART_RQR_RXFRQ);
/* USER CODE END USART2_IRQn 0 */
/* USER CODE BEGIN USART2_IRQn 1 */
/* USER CODE END USART2_IRQn 1 */
}相关LL库函数定义如下:
/* Legacy define */
#define LL_USART_EnableIT_RXNE LL_USART_EnableIT_RXNE_RXFNE
/**
* @brief Enable RX Not Empty and RX FIFO Not Empty Interrupt
* @note Macro IS_UART_FIFO_INSTANCE(USARTx) can be used to check whether or not
* FIFO mode feature is supported by the USARTx instance.
* @rmtoll CR1 RXNEIE_RXFNEIE LL_USART_EnableIT_RXNE_RXFNE
* @param USARTx USART Instance
* @retval None
*/
__STATIC_INLINE void LL_USART_EnableIT_RXNE_RXFNE(USART_TypeDef *USARTx)
{
SET_BIT(USARTx->CR1, USART_CR1_RXNEIE_RXFNEIE);
}
/**
* @brief Enable IDLE Interrupt
* @rmtoll CR1 IDLEIE LL_USART_EnableIT_IDLE
* @param USARTx USART Instance
* @retval None
*/
__STATIC_INLINE void LL_USART_EnableIT_IDLE(USART_TypeDef *USARTx)
{
SET_BIT(USARTx->CR1, USART_CR1_IDLEIE);
}
/**
* @brief Read Receiver Data register (Receive Data value, 8 bits)
* @rmtoll RDR RDR LL_USART_ReceiveData8
* @param USARTx USART Instance
* @retval Value between Min_Data=0x00 and Max_Data=0xFF
*/
__STATIC_INLINE uint8_t LL_USART_ReceiveData8(USART_TypeDef *USARTx)
{
return (uint8_t)(READ_BIT(USARTx->RDR, USART_RDR_RDR) & 0xFFU);
}边栏推荐
猜你喜欢

基于无监督医学图像配准论文(1)

win11一直弹出用户账户控制怎么解决

What should I do if the Win10 system sets the application identity to automatically prompt for access denied?

内存申请(malloc)和释放(free)之上篇

刷卡芯片CI520可直接PIN对PIN替换CV520支持SPI通讯接口

【系统设计与实现】基于flink的分心驾驶预测与数据分析系统

tensorflow实战之手写体识别

用U盘怎么重装Win7系统?如何使用u盘重装系统win7?

针对多轮推理分类问题的软标签构造方法

How to set the win10 taskbar does not merge icons
随机推荐
Win11没有本地用户和组怎么解决
Mapreduce环境详细搭建和案例实现
FP7195转模拟恒流调光芯片在机器视觉光源的应用优势
CI24R1小模块2.4G收发模块无线通信低成本兼容si24r1/XN297超低功耗
ECP2459耐压60V降压BUCK电路用于WIFI模块供电方案原理图
Win11 system cannot find dll file how to fix
Impressions of Embrace Jetpack
arm push/pop/b/bl汇编指令
单端K总线收发器DP9637兼容L9637
最小树高度
使用 腾讯云搭建一个个人博客
vscode镜像
PyTorch(14)---使用现有的模型及其修改
基于无监督医学图像配准论文(1)
PyTorch(13)---优化器_随机梯度下降法
win10怎么设置不睡眠熄屏?win10设置永不睡眠的方法
tensorflow实战之手写体识别
PyTorch(15)---模型保存和加载
FP7195大功率零压差全程无频闪调光DC-DC恒流芯片(兼容调光器:PWM调光,无极调光,0/1-10V调光)
PyTorch(12)---损失函数和反向传播