目录
目录
1.stm32cubemx设置
模式选择异步并打开中断
根据要求设置相应的功能(记得要将串口的引脚修改为PA9和PA10)。
设置系统时钟
2.串口收发
串口常用函数
· HAL_UART_Transmit();串口发送数据,使用超时管理机制
· HAL_UART_Receive();串口接收数据,使用超时管理机制
· HAL_UART_Transmit_IT();串口中断模式发送
· HAL_UART_Receive_IT();串口中断模式接收
· HAL_UART_Transmit_DMA();串口DMA模式发送
· HAL_UART_Receive_DMA();串口DMA模式接收,可以实现不定长接收void HAL_UART_RxCpltCallback ( UART_HandleTypeDef * huart ) 接收中断回调函数,定长接收
发送
uint8_t str[20];
//直接发送即可
HAL_UART_Transmit_IT(&huart1, (uint8_t *)RX, 20);
HAL_UART_Transmit(&huart1, (uint8_t *)RX, 20,100);
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)RX, 20);
定长接收
一定要在初始化时调用HAL_UART_Receive_IT(&huart1, (uint8_t *)RX, 20);函数,如果不调用则不会进入中断,进入中断回调函数后一定要再次开启串口中断,再次调用HAL_UART_Receive_IT(&huart1, (uint8_t *)RX, 20);,不然将不会在进入中断,
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
LCD_DisplayStringLine(Line8, (uint8_t *)(RX));
HAL_UART_Receive_IT(&huart1, (uint8_t *)RX, 20);
}
不定长接收
这种方法的局限性非常大,应为只有当串口接收到你设定的值后才会进入中断回调函数,换句话来说就是只能定长接收,如果发送的信息与你的接受长度不一样就会出问题,这时候就是用到dma接收
HAL_UART_Receive_DMA();
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //串口的中断使能函数,我们使能串口的空闲中断
__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)//获取空闲中断的标志位__HAL_UART_CLEAR_IDLEFLAG();清除空闲中断标志位
HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart);用户自己定义的回调函数(自己定义,自己定义)
开始初始化
extern DMA_HandleTypeDef hdma_usart1_rx;
static uint8_t RX[10];
HAL_UART_Receive_DMA(&huart1, (uint8_t *)RX, 10);
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
在stm32g4xx_it.c找到void USART1_IRQHandler(void)函数,在下面写
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET)//判断是否空闲
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除中断标志位
HAL_UART_DMAStop(&huart1);
HAL_UART_IdleCpltCallback(&huart1);//进入回调函数
}
在main.c下定义 HAL_UART_IdleCpltCallback(&huart1);函数,注意需要在main.h下声明HAL_UART_IdleCpltCallback(&huart1)
void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart)
{static uint8_t RecCount=0;
RecCount=10-__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);//获取数据长度,方便发送
HAL_UART_Transmit_DMA(&huart1, RX, RecCount);//dma串口发送
LCD_DisplayStringLine(Line9, RX);
RecCount=0;
HAL_UART_Receive_DMA(&huart1, RX, 10);
}
这样就可以不定长接收,如果叙述不对可以提出,大家相互学习