串口DMA接收只需要将平时使用的HALUARTReceive_IT(&huart1,&data,1);
更改为HALUARTReceive_DMA(&huart1,&data,1);即可
此时的接收中断是DMA接收完成时产生的中断
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART1)
{
HAL_UART_Receive_DMA(&huart1,datas,3);
if(datas[1]=='f')
{
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
}
point=0;
memset(datas,0,sizeof(datas));
}
}//效果与HAL_UART_Receive_IT一样
收发不定长数据:
使用的是串口空闲中断,即在一定的时间RX未收到数据时判断为一帧数据接收完成,但是有一个问题就是在接收规定size的一半数据时也会触发中断,一种办法是将size增大,使接收无法达到size的一半;另一种则为关闭DMA传输过半中断:
将接收函数改为:HALUARTExReceiveToIdle_DMA(&huart1,datas,15); ,扩展空闲中断
中断回调函数为:void HALUARTExRxEventCallback(UARTHandleTypeDef *huart, uint16t Size)
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if(huart->Instance==USART1)
{
HAL_UART_Transmit_DMA(&huart1,datas,Size);
HAL_UARTEx_ReceiveToIdle_DMA(&huart1,datas,15);//接收需要写在开始
if(datas[1]=='f')
{
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
}
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT); //关闭DMA传输过半中断
}
}
注意:
在关闭DMA传输过半中断时需要将usart.c中的DMAHandleTypeDef hdmausart1_rx extern出来