本实验基于野火开发板stm32f407及stm32cubemx、keil环境实现。
串口使用的串口1,PA9、PA10
基本配置
模式:异步
添加接收端DMA
使能串口中断
生成代码后
uint8_t RX_BUF[RX_LEN]; //自定义一个数组,使用dma接收存储
找到stm32f4xx_it.c
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET){ //判断IDLE是否被置位
__HAL_UART_CLEAR_IDLEFLAG(&huart1); //被置位就是接收到数据
HAL_UART_DMAStop(&huart1);
printf("%s\r\n",RX_BUF);
HAL_UART_Receive_DMA(&huart1,RX_BUF,RX_LEN);
}
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
使能IDLE中断和打开串口DMA接收使用在main函数里,while前,可以避免第一次接受全为0x00,或者使用在初始化函数内
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //开启串口空闲中断,当时没有数据的时候中断
HAL_UART_Receive_DMA(&huart1, RX_BUF, RX_LEN);//开启串口DMA接收
串口重定向
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (unsigned char)ch;
return ch;
}