前言
DMA的作用就是帮助CPU来传输数据,从而使CPU去完成更重要的任务,不浪费CPU的时间。
一、配置stm32cubeMX
这两个全添加上。参数配置一般默认即可
代码部分
只需要把上期文章里的HAL_UART_Transmit_IT(&huart2,DATE,2);
全都改为HAL_UART_Transmit_DMA(&huart2,DATE,2);即可
参数都是一样 的。
看代码
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{***** HAL_UART_Transmit_DMA(&huart2,DATE,2);*****//Contral LEDGPIO_PinState state = GPIO_PIN_SET;if(DATE[1] == '0'){state = GPIO_PIN_RESET;}else if(DATE[1] == '1'){state = GPIO_PIN_SET;}if(DATE[0] == 'B'){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,state);}else if(DATE[0] == 'R'){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,state);}else if(DATE[0] == 'G'){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,state);}***** HAL_UART_Receive_DMA(&huart2,DATE,2);*****
}
这是他的回调函数。(*****的两行是最重要的基础部分,其他的都是附加的功能)
要注意最后一行,是重新开启了数据的接收。
因为你在main函数里只有一行HAL_UART_Receive_DMA(&huart2,DATE,2);这个代码,所以只会执行一次,也就是接收一次数据(不能把这行写在while函数里)。所以需要在这个回调函数写一次,也就是说 每次串口往外发送一次数据,都重新开启了接收的函数,我们才可以继续往里面发送内容。
最后
要记得在main主函数中使用HAL_UART_Receive_DMA(&huart2,DATE,2);跟之前是一样的,没这句话就相当于没使用函数。
来自keysking