在GPS部分有用到DMA,接下来看一下它的使用。
一、DMA简介
直接存储器存取(DMA) 用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。
两个DMA控制器有12个通道(DMA1有7个通道, DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。
二、DMA主要特性
● 12个独立的可配置的通道(请求): DMA1有7个通道, DMA2有5个通道
● 每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置。
● 在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推) 。
● 独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。
● 支持循环的缓冲器管理
● 每个通道都有3个事件标志(DMA半传输、 DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。
● 存储器和存储器间的传输
● 外设和存储器、存储器和外设之间的传输
● 闪存、 SRAM、外设的SRAM、 APB1、 APB2和AHB外设均可作为访问的源和目标。
● 可编程的数据传输数目:最大为65535
三、功能框图
四、DMA请求映像
DMA1控制器
从外设(TIMx[x=1、 2、 3、 4]、 ADC1、 SPI1、 SPI/I2S2、 I2Cx[x=1、 2]和USARTx[x=1、 2、 3])产生的7个请求,通过逻辑或输入到DMA1控制器,这意味着同时只能有一个请求有效。外设的DMA请求,可以通过设置相应外设寄存器中的控制位,被独立地开启或关闭。
DMA2控制器
从外设(TIMx[5、 6、 7、 8]、 ADC3、 SPI/I2S3、 UART4、 DAC通道1、 2和SDIO)产生的5个请求,经逻辑或输入到DMA2控制器,这意味着同时只能有一个请求有效。参见下图的DMA2请求映像。外设的DMA请求,可以通过设置相应外设寄存器中的DMA控制位,被独立地开启或关闭。
注意: DMA2控制器及相关请求仅存在于大容量产品和互联型产品中。
五、相关寄存器
DMA中断状态寄存器(DMA_ISR)
如果开启了 DMA_ISR 中这些中断,在达到条件后就会跳到中断服务函数里面去,即使没开启,我们也可以通过查询这些位来获得当前 DMA 传输的状态。这里我们常用的是 TCIFx,即通道 DMA 传输完成与否的标志。注意此寄存器为只读寄存器,所以在这些位被置位之后,只能通过其他的操作来清除。
DMA中断标志清除寄存器(DMA_IFCR)
DMA_IFCR 的各位就是用来清除 DMA_ISR 的对应位的,通过写 1 清除。在 DMA_ISR 被置位后,我们必须通过向该位寄存器对应的位写入 1 来清除。
其他寄存器
自行查看《STM32中文参考手册_V10.pdf》 150页
六、DMA配置
举个栗子:
需要配置USART2 的DMA接收,DMA该怎么配置。
查看上面介绍的得出:
USART2_RX 在DMA1的通道 6,USART2是挂载在 APB1 下面的外设。
然后就可以配置了:
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //开启DMA1时钟
USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE); //打开串口2 DMA接收使能 开启串口DMA接收
DMA_DeInit(DMA1_Channel6); //恢复缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(USART2->DR); //设置USART2发送数据寄存器
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)buf; //设置发送缓冲区首地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //设置外设位目标,内存缓冲区->外设寄存器
DMA_InitStructure.DMA_BufferSize = BufferSize; //需要发送的字节数
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址不做增加调整,调整不调整都是DMA自动实现的
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存缓冲区地址增加调整
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设数据宽度8位,1个字节
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //内存数据宽度8位,1个字节
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //单次传输模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //优先级设置
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //关闭内存到内存的DMA模式
DMA_Init(DMA1_Channel6, &DMA_InitStructure); //写入配置
DMA_Cmd(DMA1_Channel6, ENABLE); //开启DMA通信,等待接收数据
七、使用
一个比较重要的函数,获取当前剩余数据量大小:
uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx)
则:
先配置DMA
GpsRxDMACfg( GpsTransferBuffer,DEF_GPS_RBUFSIZE );
//GpsTransferBuffer为接收buffer,DEF_GPS_RBUFSIZE 为设置的接收buffer大小(512)
根据设置的接收buff大小减去当前剩余数据量,得到当前接收数据大小。
curcount = DEF_GPS_RBUFSIZE - DMA_GetCurrDataCounter( GPS_RxDMA_Ch );
上一篇:STM32开发 -- Secure CRT 自动记录日志和时间戳功能配置
下一篇:STM32开发 -- 时钟系统详解
推荐阅读
史海拾趣
Chips And Technologies Inc的创业之路始于1984年,由Gordon A. Campbell和Dado Banatao在加利福尼亚州的米尔皮塔斯共同创立。作为一家早期的无晶圆厂半导体公司,C&T凭借对技术的深刻理解和市场的前瞻性,成功推出了首款四芯片EGA芯片组,这款产品能够处理增强型图形适配器上19个IBM专有芯片的功能,为当时的个人电脑制造商提供了强大的支持。
随着业务的发展,AirBorn开始将目光投向全球市场。公司积极参与国际电子展会,与全球各地的客户建立合作关系。同时,AirBorn还加大了对研发和生产设备的投入,提升产品质量和生产效率。这些举措使得AirBorn的产品在全球范围内赢得了良好的声誉,公司也逐渐成长为一家具有全球影响力的电子连接器制造商。
弘凯光电一直致力于技术创新和产品升级。公司拥有一支高效、创新的技术团队,通过对产品技术的深入研究和持续创新,不断推出具有竞争力的新产品。例如,公司的iCLed系列产品,凭借其独特的设计和卓越的性能,在智能座舱设计领域获得了广泛应用。这种对技术创新的不断追求,使得弘凯光电在电子行业中始终保持领先地位。
在市场竞争日益激烈的背景下,长运通积极拓展市场,加强品牌建设。公司不仅在国内市场取得了良好的销售业绩,还积极开拓国际市场,与多家国际知名企业建立了合作关系。同时,长运通也注重品牌形象的塑造和传播,通过参加各种展会、论坛等活动,提升公司的知名度和影响力。这些努力使得长运通在电子行业中树立了良好的品牌形象。
动运科技(DONGWOON)公司,最初成立于1987年(也有资料称为1988年)的韩国首尔,是一家专注于模拟和功率驱动IC研发的半导体公司。在初创阶段,公司凭借对半导体技术的深刻理解和不懈追求,逐渐在模拟IC领域积累了技术和市场经验。通过不断的技术创新和产品优化,动运科技逐步获得了业界的认可,为其后续的发展奠定了坚实的基础。
在电子行业的初期,APMI以一家小型创业公司的身份出现,专注于电源管理技术的研发。当时,市场上的电源管理产品普遍存在效率低下、体积庞大的问题。APMI的研发团队通过深入研究,成功开发出了一款高效、紧凑的电源管理芯片,这一创新为电子产品的小型化和节能化奠定了基础。随着技术的不断完善和推广,APMI逐渐在电源管理领域崭露头角,吸引了众多合作伙伴和投资者的关注。
2.5 Gb/s 0.35μmCMOS光接收机前置放大器设计 采用0.35μm CMOS工艺设计并实现了用于SDH系统STM-16(2.5Gb/s)速率级光接收机前置放大器。此放大器采用+5 V电源电压,中频增益为73 dBΩ,3 dB带宽为2.2 GHz。核面积为0.15 mm×0.20 mm。… 查看全部问答∨ |
4、彩色摄像机 VC-913D 技术规格: 图像传感器:1/3”SONY Super HAD CCD 有效像素:PAL:500(水平)*582(垂直)NTSC:510(水平)*492(垂直) 感光面积:4.9mm*3.7mm 信号系统:PAL/NTSC制式 水平清晰:420电视线 镜头安装方式:C/CS ...… 查看全部问答∨ |
PCB多层板布线方法 四层电路板布线方法:一般而言,四层电路板可分为顶层、底层和两个中间层。顶层和底层走信号线,中间层首先通过命令DESIGN/LAYER STACK MANAGER用ADD PLANE 添加INTERNAL PLANE1和INTERNAL PLANE2分别作为用的最多的电源层如VCC ...… 查看全部问答∨ |
这个板子原理简单 程序思想也不难 但是做出板子却是没有实现功能 很是恼火啊 呵呵 请大家帮忙看一下吧 一 首先说明这个板子的用途: 车间有12台电机,每一台可以接出一路信号,运行时 有24V直流电 若出现故障 则没有电压输出。板子 ...… 查看全部问答∨ |
每个STM32芯片都有一个内部的参照电压,相当于一个标准电压测量点,在芯片内部连接到ADC1的通道17。 根据数据手册中的数据,这个参照电压的典型值是1.20V,最小值是1.16V,最大值是1.24V。这个电压基本不随外部供电电压的变化而变化。 不少 ...… 查看全部问答∨ |
|