用原点的开发板学习时发现没有关于DMA收数的例程,于是自己在网上找例程学习,使用的环境时CUBE IDE 1.80。过程记录如下:
1)配置:打开dma中断
2)手工添加代码:
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart1,aRxBuffer,13);
3)中断函数修改:
#if 1
ALIGN_32BYTES(__attribute__((section (".RAM_D2"))) uint8_t aRxBuffer[4]) = {0};
#else
__attribute__((section(".RAM_D2"))) uint8_t tt= 20;
__attribute__((section(".RAM_D2"))) uint8_t aRxBuffer[13] = "KEY_DOWN_K1\r\n";
#endif
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
uint8_t temp,rx_len,tmp_flag;
if(USART1 == huart1.Instance)
{
tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE标志
if((tmp_flag != RESET))//idle标志被置
{
//recv_end_flag = 1; // 接受完成标志位置1
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
HAL_UART_DMAStop(&huart1); //
temp = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);//
rx_len = 10 - temp; //
SCB_InvalidateDCache_by_Addr ((uint32_t *)aRxBuffer, 4); //enable cache and use this
HAL_UART_Receive_DMA(&huart1,aRxBuffer,4);//重新打开DMA接收
//printf("rcvdata:%ld\r\n",((aRxBuffer[3]<<24)+(aRxBuffer[2]<<16)+(aRxBuffer[1]<<8)+aRxBuffer[0]));
}
}
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
上面的代码中,如果将收数的数量改为1, HAL_UART_Receive_DMA(&huart1,aRxBuffer,1),数据接收正常,如果改为大于1的数,数据不能正常接收,参考了很多查到的资料,比如 安富莱的例程,里面的这部分也不是1,问题没有找到答案,不知道为何。
找到了不能接受多个数据的原因,参考这个文章:
(5条消息) 解决串口开启DMA接受却只能接收到第一个字节之后就再也接受不到数据的问题_love421的博客-CSDN博客_串口dma接收不到数据另外,参考原子的教程中,在uart_init 中加入了一句HAL_UART_Receive_IT(&huart3,rcvdata,BUFFERSIZE);这里的BUFFERSIZE原子教程中定义为1,也是导致只能接收第一个字节的原因。