1.什么是DMA
从数据手册可以看到,DMA不是外设,是和cpu具有同等地位的,数据传输不需要经过cpu,即外设到存储器或者从存储器到存储器
2.发送数据,这里我一般用的串口发送
串口阻塞发送,代码比较简洁,方便直接使用
HAL_UART_Transmit(&huart2,&rx,sizeof(rx),10000);
如果使用dma发送的话HAL_UART_Transmit_DMA(&huart2,&rx,sizeof(rx));
不同的区别在于,HAL_UART_Transmit_DMA(&huart2,&rx,sizeof(rx))如果调用了话,会一直不断执行发送的内容。
举个例子吧:
如果串口接收到0x12的话,即使RX_Buf==0x16了,HAL_UART_Transmit_DMA(&huart2,&rx,sizeof(rx))还是会不停进行
相同例子,如果没有使用循环模式,那么实际效果和HAL_UART_Transmit(&huart2,&rx,sizeof(rx),10000);差不太多。
3.接收模式
以下是主函数的代码
while (1)
{
// if(RX_Buf[0] == 0X01)
// {
//
// }
if(RX_Buf[0] == 0X16)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,RESET);
}
if(RX_Buf[0] == 0X12)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,SET);
HAL_UART_Transmit(&huart2,&rx,sizeof(rx),10000);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
最后尽量还是把发送接收都放入串口中断中,这样方便管理。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart -> Instance == USART2)
{
if(RX_Buf[0] == 0X16)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,RESET);
}
if(RX_Buf[0] == 0X12)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,SET);
HAL_UART_Transmit_DMA(&huart2,&rx,sizeof(rx));
}
}
}