STM32的HAL库学习挖坑-DMA串口接收不定长数据

DMA串口这个东西,前几年都是寄存器混合HAL库方可食用,因为那时候底层不太完善,我用中断它不香吗?(资源不紧张的情况下中断速度稍微快一点点)

但是该学的还是要学学,说不定哪个项目能用上呢~(到底哪个项目资源那么紧张了QwQ)

打个基础先,DMA串口就是硬件自动接收数据,减少MCU的负荷,想要的时候读取下就行了

单片机:STM32L051C8T6 功能:DMA接收串口1数据,定时500ms打印串口数据

国际惯例上STM32CubeMx的相关配置图:

1.串口基础配置

2.DMA配置,注意:RX的mode需要设置为Circular,不然接收1次数据后就挂了,没看到的就找BUG吧,hiahiahiahiahiahiahiahia

然后在生成文件后添加变量,如下:

uint8_t Rx_Buffer[300];    //这个是全局变量,用于接收串口缓存
uint16_t i = 0;

在while(1)内添加代码,如下:

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		for(i = 0; i < 300; i++)
			printf("%02x ",Rx_Buffer[i]);
		printf("
");
		HAL_Delay(500);		
  }

烧录完成后就可以正常食用了~_~

最后总结下做DMA串口接收不定长数据时,处理完串口数据后需要将数据清0,不然数据会一直叠加下去,上面的程序没清0所以每次都是叠加^_^

PS:不想定时扫描的话,就使用空闲中断,产生中断后再读取

经验分享 程序员 微信小程序 职场和发展