今天写了点单片机,因为这块不是经常写,需要把一些经验教训记录下,免得以后再走弯路。
1 uart收发三种方式 阻塞,中断,dma
2 阻塞发送没问题,接受我没成功;
3 中断方式接受发送都没问题,但是接收如果buf过长,发送几次才能echo,而且中断中不能写运行太长的函数;
4 dma最稳定,但是记住,dma接收,就不能dma发送了,最佳方式dma接受,阻塞发送。需要配置uart 中断以及dma 接受,注意mod circular。
代码其实简单:
全局变量:
/* USER CODE BEGIN PFP */
uint8_t recv_buf[13] = {0};
/* USER CODE END PFP *
main函数:
/* USER CODE BEGIN 2 */
uint8_t data[] = "Hello, I am Mculover666.\n";
HAL_UART_Transmit(&huart1, data, sizeof(data), 500);
HAL_UART_Receive_DMA(&huart1, recv_buf, sizeof(recv_buf)); //使能DMA接收
/* USER CODE END 2 */
回调:
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit(&huart1, recv_buf, sizeof(recv_buf), 500);
}
/* USER CODE END 4 *
keil快捷键,f7编译,然后上传,串口助手就可以看结果。以上都是把业务逻辑去掉,关键硬件交互代码。