在使用HAL库的过程中发现在串口中断的回显功能(将串口接收到的数据再发送出来),总是执行几次后程序卡死,无法正常回显。经过一系列查找后发现原因是STM32 HAL库在处理接收的时候会锁一下串口一会,导致变成某个短时间的“半双工”。尝试网上的教程太过繁琐,而且cubemx生成代码后又会将修改部分覆盖,很是麻烦。知道出现问题的原因后直接参考标准库在usart.c和usart.h中添加以下代码,完美解决问题。
usart.h中添加如下代码
/* USER CODE BEGIN Includes */
#include "stm32f1xx_hal.h"
#include "stdio.h"
/*宏定义*/
#define USART_IT_PE ((uint16_t)0x0028)
#define USART_IT_TXE ((uint16_t)0x0727)
#define USART_IT_TC ((uint16_t)0x0626)
#define USART_IT_RXNE ((uint16_t)0x0525)
#define USART_IT_IDLE ((uint16_t)0x0424)
#define USART_IT_LBD ((uint16_t)0x0846)
#define USART_IT_CTS ((uint16_t)0x096A)
#define USART_IT_ERR ((uint16_t)0x0060)
#define USART_IT_ORE ((uint16_t)0x0360)
#define USART_IT_NE ((uint16_t)0x0260)
#define USART_IT_FE ((uint16_t)0x0160)
#define IT_Mask ((uint16_t)0x001F) /*!< USART Interrupt Mask */
/* USER CODE END Includes */
/* USER CODE BEGIN Prototypes */
/*函数申明*/
void USART_SendData(USART_TypeDef* USARTx, uint8_t *pData);
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);
/* USER CODE END Prototypes */
在usart.c中复制标准库函数原型
/**
* @brief Transmits single data

在使用STM32的HAL库时遇到串口中断回显功能执行几次后程序卡死的问题,原因在于HAL库在处理接收时短暂锁住串口导致‘半双工’状态。通过在usart.c和usart.h中添加自定义代码,包括宏定义、函数声明和实现,成功解决了这个问题。主要方法包括自定义USART发送和接收函数以及中断处理函数,实现了串口的中断接收并回显数据。

1万+

被折叠的 条评论
为什么被折叠?



