当前位置:网站首页>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);
}边栏推荐
- 神经网络的设计过程
- “非图灵完备”到底意味着什么
- FP6195耐压60V电流降压3.3V5V模块供电方案
- arm push/pop/b/bl汇编指令
- Win10 computer can't read U disk?Don't recognize U disk how to solve?
- Win11声卡驱动如何更新?Win11声卡驱动更新方法
- 基于GPT的隐变量表征解码结构
- CI24R1小模块2.4G收发模块无线通信低成本兼容si24r1/XN297超低功耗
- How to add a one-key shutdown option to the right-click menu in Windows 11
- FP7195转模拟恒流调光芯片在机器视觉光源的应用优势
猜你喜欢
随机推荐
Fast advanced TypeScript
使用 腾讯云搭建一个个人博客
FP5207电池升压 5V9V12V24V36V42V大功率方案
FP7122降压恒流内置MOS耐压100V共正极阳极PWM调光方案原理图
win10 system update error code 0x80244022 how to do
PyTorch(15)---模型保存和加载
轻量化AlphaPose
How to add a one-key shutdown option to the right-click menu in Windows 11
Win7怎么干净启动?如何只加载基本服务启动Win7系统
FP7126降压恒流65536级高辉无频闪调光共阳极舞台灯RGB驱动方案
神经网络的设计过程
boost库智能指针
Win7遇到错误无法正常开机进桌面怎么解决?
图像配置分类及名词解释
Daily - Notes
Bash shell位置参数
Please make sure you have the correct access rights and the repository exists. Problem solved
基于51单片机和物联网的智能家居系统(ESP8266物联网模块)
DP4344兼容CS4344-DA转换器
2020-02-06-快速搭建个人博客









