STM32CubeMX串口接收数据(DMA方式,HAL库)
2018-06-19 来源:eefocus
使用DMA方式可以减轻CPU负担,此例子相关配置可以参考
STM32CubeMX串口接收数据(中断方式,HAL库)
(1)设置USART1中断,NVIC配置如下图
(2)设置USART1的DMA,如下图
注意:要将RX的模式设置为circular ,否则只能接收一次,如果这里不作设置,网上也有其他方法介绍代码实现多次接收的,但既然用到了STM32CubeMX就尽量发挥最大作用吧!
(3)生成项目工程
(4)在main.c里设置变量以及启动DMA接收
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t aRxBuffer1[1]; //接收缓存
uint8_t aTxBuffer[] = '*********SENDING DATA USING USART1 with DMA***********\r\n';
/* USER CODE END PV */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
HAL_UART_Receive_DMA(&huart1,aRxBuffer1,1);// 启动DMA接收
HAL_UART_Transmit_DMA(&huart1,aTxBuffer,sizeof(aTxBuffer));// DMA发生数据
while (1)
{
}
/* USER CODE END WHILE */编写USART1接收中断处理函数void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit_DMA(&huart1,aRxBuffer1,1); // DM2发送出去
// HAL_UART_Receive_DMA(&huart1,aRxBuffer1,1); // 重新DMA接收
}
“`
注意这里和只采用中断方式的不同,配置了循环模式后可以不用自己手动再次启动DMA接收
linux下(windows下是一样的)使用串口助手cutecom效果如下:
不足之处:
如果一开始不使能串口中断,那么DMA接收完成后就不会进入HAL_UART_RxCpltCallback函数,虽然有单独的DMA中断处理函数DMA2_Stream2_IRQHandler 和 DMA2_Stream7_IRQHandler ,简单试了一下还未实现预定效果,有待改进,也请同道小伙伴告知
- STM32CUBEMX开发GD32F303(4)----GPIO输出模式,速率测试、开漏和输出说明
- STM32CubeMx普通PWM基本使用方法
- 基于STM32Cubemx HAL 库实现 DMA 驱动 GPIO 高速翻转
- STM32CubeMx配置USART1增加打印功能
- STM32CUBEMX开发GD32F303(17)----内部Flash读写
- STM32CUBEMX开发GD32F303(8)----USART收发配置
- STM32CubeMX介绍,功耗计算,中间件,CAD视图
- 如何通过STM32CubeMX制作外部Flash的烧写驱动 (.stdlr)
- STM32CUBEMX开发GD32F303(15)----外部中断EXTI
- 利用STM32CubeMX解读时钟树