前言:重定向printf进行串口数据发送,DMA模式进行数据接收。
一、CubeMX配置:
配置串口波特率
打开串口中断和DMA
注意:在蓝桥杯测评版上USART1是PA9、PA10,而如果未在CubeMX中配置PC4和PC5时,USART1默认为PC4和PC5。
二、代码部分
printf重定向、勾选MicroLAB:
在main中重定义fput():
#include "stdio.h"
/* USER CODE BEGIN 4 */
int fputc(int ch,FILE *f){
HAL_UART_Transmit(&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY);
return ch;
}
/* USER CODE END 4 */
解释:此代码重定向printf到uart1,使用printf即可向串口1发送数据。
不定长数据接收:
在interrupt.c中或main.c中重定义数据接收事件中断:
extern DMA_HandleTypeDef hdma_usart1_rx;
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
if(huart == &huart1){
//user code
HAL_UARTEx_ReceiveToIdle_DMA(&huart1,Receive,10); //DMA不定长数据接收
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT); //关闭接受数据长度过半中断
}
}
解释:HAL_UARTEx_ReceiveToIdle_DMA(&huart1,Receive,10);第二个参数为接收数组,第三个参数为最大接收字符数,一般可直接写为该数组长度。
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);为关闭DMA_IT_HT中断,该中断回调函数会同时被接收过半和接收空闲同时出发。
在main函数中初次接收数据及定义Receive[]数组:
extern DMA_HandleTypeDef hdma_usart1_rx;
uint8_t Receive[10];
HAL_UARTEx_ReceiveToIdle_DMA(&huart1,Receive,10);
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);