STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据。
一、DMA
1.1 DMA简介
DMA的出现大大减轻了CPU的工作量。在硬件系统中,主要由CPU(内核)、外设、内存(SRAM)、总线等结构组成,数据经常要在内存和外设之间,外设和外设之间转移。例如:CPU需要处理从外设采集回来的数据,CPU需要先将数据从ADC外设的寄存器读取到内存中(变量)去,然后进行运算处理,这是一般的解决方法。CPU的资源是非常宝贵的,我们可以设法把转移的工作交给其他部件来完成,CPU把更多的资源用于数据运算和中断响应上,如此DMA便登场了。DMA正是为CPU分担数据转移工作,因为DMA的存在,CPU才被解放出来,它可以在数据转移的同时进行数据运算,相应中断,大大提高了效率。
1.2 MDA的主要特性
1.3 DMA中断特性
1.4 传输方式
- 普通模式:传输结束后(即要传输数据的数量达到零),将不再产生DMA操作。若开始新的DMA传输,需在关闭DMA通道情况下,重新启动DMA传输。
- 循环模式:传输结束后(即要传输数据的数量达到零),将不再产生DMA操作。若开始新的DMA传输,需在关闭DMA通道情况下,重新启动DMA传输
二、串口通信DMA传输完成中断
2.1 步骤
- 打开CUBRMX新建项目,芯片选择是F103C8,点击后创建项目;
- 把PA9和PA10选择为USART1_RX和USART1_TX,然后再点击左边的USART1,将mode置为异步通信模式,我们这里只需要接收,不需要发送,后面再点击add键,添加引脚
2.2 代码
Open Project 打开keil5,进入到main.c文件,在main.c文件中的while循环那块的代码如下:
while (1)
{
uint8_t send_char[]="hello world\n";
HAL_UART_Transmit_DMA(&huart1,(uint8_t *)send_char,0xc);
HAL_Delay(500);
}
2.3 实验结果
小小的总结
DMA是一种在传输时不使用cpu的数据传输方式,可以节省cpu资源,提高CPU的利用率。对于DMA的串口发送函数HAL_UART_Transmit_DMA,需要size匹配你要发送的字符串。
参考文献
- stm32之串口通信DMA传输完成中断
- STM32F103C8通过DMA方式向上位机连续发送信息
|