前言
之前写了一篇STM32hal库串口中断接收任意字符
实际上是不完美的,他接收到换行符就完蛋了。
花了点时间深入研究了一下hal库的串口中断函数,发现他其实是不完美的,有一些BUG。
所以查了资料,找了很久,才找到这个博主的文章:
STM32CubeMX5.1.0使用教程,以STM32L431为例(三):串口通信
cube配置
设置串口波特率和中断
生成工程文件,去hal库的 "stm32l4xx_it"里注释掉串口中断函数(官方有问题,我们自己写!)
usart.h:
usart.h:
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __USART_H__
#define __USART_H__
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
extern UART_HandleTypeDef huart1;
/* USER CODE BEGIN Private defines */
extern uint8_t buff[1024];
extern uint16_t buff_len;
extern uint8_t buff_Flag;
/* USER CODE END Private defines */
void MX_USART1_UART_Init(void);
/* USER CODE BEGIN Prototypes */
void USART1_IRQHandler(void);
void USART1_IT_Enable(void);
/* USER CODE END Prototypes */
#ifdef __cplusplus
}
#endif
#endif /* __USART_H__ */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
usart.c
usart.c里面添加:
/* USER CODE BEGIN 1 */
uint8_t buff[1024];
uint16_t buff_len=0;
uint8_t buff_Flag=0;
void USART1_IT_Enable(void)
{
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
__HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
}
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
uint8_t Res=0;
/* USER CODE END USART2_IRQn 0 */
//HAL_UART_IRQHandler(&huart1); //注释这条语句,不使用HAL库的回调处理
/* USER CODE BEGIN USART2_IRQn 1 */
//判读是否为接收中断
if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)!=RESET))
{
HAL_UART_Receive(&huart1,&Res,1,1000);
buff[buff_len]=Res;
buff_len++;
}
//判读是否为溢出中断
if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_ORE)!=RESET))
{
__HAL_UART_CLEAR_IT(&huart1,UART_CLEAR_OREF);
}
//判读是否为接收空闲中断
if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET))
{
__HAL_UART_CLEAR_IT(&huart1,UART_CLEAR_IDLEF); //清除中断标志
buff_Flag=1; //直到没数据才把标志位至1,主函数才可以判断到
}
/* USER CODE END USART2_IRQn 1 */
}
/* USER CODE END 1 */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
main:
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
USART1_IT_Enable(); //使能一些中断
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(buff_Flag==1)
{
HAL_UART_Transmit(&huart1 ,buff,buff_len,0xffff);
buff_Flag=0;
buff_len=0;
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
效果
单片机用的是STM32L431,hal库全部通用,工程文件:https://download.csdn.net/download/weixin_51102592/36764240?spm=1001.2014.3001.5503
版权声明:本文为CSDN博主「创客协会的阿蛋°」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_51102592/article/details/121361597
前言
之前写了一篇STM32hal库串口中断接收任意字符
实际上是不完美的,他接收到换行符就完蛋了。
花了点时间深入研究了一下hal库的串口中断函数,发现他其实是不完美的,有一些BUG。
所以查了资料,找了很久,才找到这个博主的文章:
STM32CubeMX5.1.0使用教程,以STM32L431为例(三):串口通信
cube配置
设置串口波特率和中断
生成工程文件,去hal库的 "stm32l4xx_it"里注释掉串口中断函数(官方有问题,我们自己写!)
usart.h:
usart.h:
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __USART_H__
#define __USART_H__
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
extern UART_HandleTypeDef huart1;
/* USER CODE BEGIN Private defines */
extern uint8_t buff[1024];
extern uint16_t buff_len;
extern uint8_t buff_Flag;
/* USER CODE END Private defines */
void MX_USART1_UART_Init(void);
/* USER CODE BEGIN Prototypes */
void USART1_IRQHandler(void);
void USART1_IT_Enable(void);
/* USER CODE END Prototypes */
#ifdef __cplusplus
}
#endif
#endif /* __USART_H__ */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
usart.c
usart.c里面添加:
/* USER CODE BEGIN 1 */
uint8_t buff[1024];
uint16_t buff_len=0;
uint8_t buff_Flag=0;
void USART1_IT_Enable(void)
{
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
__HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
}
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
uint8_t Res=0;
/* USER CODE END USART2_IRQn 0 */
//HAL_UART_IRQHandler(&huart1); //注释这条语句,不使用HAL库的回调处理
/* USER CODE BEGIN USART2_IRQn 1 */
//判读是否为接收中断
if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)!=RESET))
{
HAL_UART_Receive(&huart1,&Res,1,1000);
buff[buff_len]=Res;
buff_len++;
}
//判读是否为溢出中断
if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_ORE)!=RESET))
{
__HAL_UART_CLEAR_IT(&huart1,UART_CLEAR_OREF);
}
//判读是否为接收空闲中断
if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET))
{
__HAL_UART_CLEAR_IT(&huart1,UART_CLEAR_IDLEF); //清除中断标志
buff_Flag=1; //直到没数据才把标志位至1,主函数才可以判断到
}
/* USER CODE END USART2_IRQn 1 */
}
/* USER CODE END 1 */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
main:
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
USART1_IT_Enable(); //使能一些中断
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(buff_Flag==1)
{
HAL_UART_Transmit(&huart1 ,buff,buff_len,0xffff);
buff_Flag=0;
buff_len=0;
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
效果
单片机用的是STM32L431,hal库全部通用,工程文件:https://download.csdn.net/download/weixin_51102592/36764240?spm=1001.2014.3001.5503
版权声明:本文为CSDN博主「创客协会的阿蛋°」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_51102592/article/details/121361597
暂无评论