前言
之前写了一篇STM32hal库串口中断接收任意字符 实际上是不完美的,他接收到换行符就完蛋了。 花了点时间深入研究了一下hal库的串口中断函数,发现他其实是不完美的,有一些BUG。 所以查了资料,找了很久,才找到这个博主的文章: STM32CubeMX5.1.0使用教程,以STM32L431为例(三):串口通信
cube配置
设置串口波特率和中断
生成工程文件,去hal库的 "stm32l4xx_it"里注释掉串口中断函数(官方有问题,我们自己写!)
usart.h:
usart.h:
#ifndef __USART_H__
#define __USART_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "main.h"
extern UART_HandleTypeDef huart1;
extern uint8_t buff[1024];
extern uint16_t buff_len;
extern uint8_t buff_Flag;
void MX_USART1_UART_Init(void);
void USART1_IRQHandler(void);
void USART1_IT_Enable(void);
#ifdef __cplusplus
}
#endif
#endif
usart.c
usart.c里面添加:
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)
{
uint8_t Res=0;
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;
}
}
main:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
USART1_IT_Enable();
while (1)
{
if(buff_Flag==1)
{
HAL_UART_Transmit(&huart1 ,buff,buff_len,0xffff);
buff_Flag=0;
buff_len=0;
}
}
}
效果
单片机用的是STM32L431,hal库全部通用,工程文件:https://download.csdn.net/download/weixin_51102592/36764240?spm=1001.2014.3001.5503
|