历史上的今天
今天是:2024年09月05日(星期四)
2019年09月05日 | STM32串口通信USART(二)---DMA方式
2019-09-05 来源:eefocus
刚接触到DMA的时候,一头雾水,只知道方便、快捷,但不知道该怎么使用,后来弄明白原理之后就轻松了很多,但理解的还不是很透,所以希望把自己的理解写出来,和大家分享一下!
形象的说,DMA就像一个快递中转站,负责把数据从始发地搬到目的地,只要他负责的仓库有货,他就开始搬运,没货就等着,除非你把它关了。就像机器人搬东西一样,首先要告诉它从哪搬,搬到哪?东西有多大?需要搬几趟?需要搬运的东西是不是都在一起?搬完后是不是扔在那就行了,还是要放好?
到芯片里,数据就是货物,把数据从一个地方移到另一个地方。你只要告诉它怎么移到就行了,就像控制一个机器人一样。并不是多有的外设都能有机会使用DMA通道,而且,一条通道上被外设使用后,通道上的其他外设就不能使用了。那么,哪些外设可以使用DMA呢?

比方说:现在我需要使用串口发送,那么只能选择通道4,如果接收就使用通道5。

(这里只拿DMA1举例,DMA2原理相同)
在知道大概的原理之后,我们来看一下DMA的一些寄存器。
1):中断状态寄存器

2):中断标志清除寄存器

3):通道配置寄存器

注:当通道配置为非循环模式时,传输结束后(即传输计数变为0)将不再产生DMA操作。要开始新的
DMA传输,需要在关闭DMA通道的情况下,在DMACNDTRx寄存器中重新写入传输数目
4):接下来的几个寄存器配置传输数据的次数、数据源地址,数据存放地址。

/**********中断函数**************/
/*这里只提供通道4发送完成中断
*/
void DMA1_Channel4_IRQHandler(void){ if(DMA_GetITStatus(DMA1_FLAG_TC4)==SET) { DMA_ClearFlag(DMA1_FLAG_TC4); DMA_Cmd(DMA1_Channel4, DISABLE); //在非循环模式下,若 想再次填写传输次数,必须先关闭通道 DMA1_Channel->CNDTR = 10; DMA_Cmd(DMA1_Channel4, ENABLE);
}
史海拾趣
|
我用的是s3c2410主机是linux操作系统,用minicom时,启动开发板则不能显示任何信息, minicom配置如下: A-Serial Device :dev/ttyS0 B-Lockfile Location :/var/lock E-Bps/Par/Bits :115200 8N1 F-Hardware Flow ...… 查看全部问答> |
|
说一下自己都用了哪些型号的单片机,主要是8位和16位的。 来看看哪种单片机用的比较多。 我在学校主要做过STC51的单片机和MSP430(TI)的16位的单片机。 目前主要用飞思卡尔的8位DZ60做CAN总线。… 查看全部问答> |
|
需求: 数公里范围内无线组网,需要传输的数据量并不大,只是一些环境监测的数据。 可以是C/S架构,所有终端向服务器汇报,终端之间可以不联网。 终端需要进入区域能及时发现,及时传输数据。 终端脱离区域也能汇报。 多谢您的指教! … 查看全部问答> |
|
本人想做一个单片机与PC机通信操作的实验,看过资料,但有些地方不明白,请大家帮忙: 它们的通信是要通过MAX232吗?MAX232还用不用接8250,然后再接九针插头?它们的电路图应该怎么接? 书上还说要对8250编 ...… 查看全部问答> |
|
LM3S811驱动的安装 我以前装了8962的驱动,这次直接查上811上去就好使,不知道大家的是不是也是一样的,下载程序没问题。 如果你没有安装过LM3S系 ...… 查看全部问答> |




