历史上的今天

今天是:2024年09月02日(星期一)

正在发生

2019年09月02日 | STM32开发 -- Git的详细使用

发布者:Xiangtan 来源: eefocus关键字:STM32  Git  详细使用 手机看文章 扫描二维码
随时随地手机看文章

在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  Git  详细使用 引用地址:STM32开发 -- Git的详细使用

上一篇:STM32开发 -- Secure CRT 自动记录日志和时间戳功能配置
下一篇:STM32开发 -- 时钟系统详解

推荐阅读

1 CAN发送邮箱STM32共有三个CAN发送邮箱,在检测到总线空闲时交发送,但需要注意的是,有可能会发送失败,有可能因为仲裁失败从而导致失败,也有可能是其它错误,原则上bxCAN将自动重发,但bxCAN也可以配置不自动重发。正因为如此,发送邮箱中有可能同时存在多个需要发送的报文,一旦出现这种情况,那么发送邮箱中的多个报文又将是谁先发送谁后发送呢?有...
按照华为官方的测试数据,“方舟编译器”可以让安卓应用执行效率提升了29%,系统操作流畅度提升了24%,系统响应性能提升了44%,三方应用操作流畅度提升了60%。 8月30日消息,继之前宣布要让方舟编译器开源消息,现在华为官方公布了具体时间,就是在8月31日。跟鸿蒙不同的是,方舟编译器并不是一个系统,它只是依托于安卓的一套开发工具,华为为这个工具赋...
佐思汽研发布《2020 年智慧道路之路侧智能感知行业研究报告》,对路侧智能感知(包括 RSU、路侧传感器、MEC、云控平台等)行业支持政策、产业链技术、市场规模、商业模式及供应商进行分析研究。 随着车路协同的发展,国家和行业都逐渐意识到,车路协同发展的重点绝不能单单只放在车上面,一定是让路和车并行,协同发展。单 2020 年已经连续出台多项政...
9月1日,宏微科技在上交所科创板正式挂牌上市,公司证券代码为688711,发行价格27.51元/股,截至发稿前,宏微科技股票报价82.82元/股,涨幅201.1%,总市值达81.57亿元。资料显示,宏微科技主要从事以IGBT、FRED为主的功率半导体芯片、单管、模块和电源模组的设计、研发、生产和销售,IGBT、FRED单管和模块的核心是IGBT芯片和FRED芯片,公司拥有自主研发设...

史海拾趣

问答坊 | AI 解惑

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。…

查看全部问答∨

[方案]某监狱闭路电视监控系统设计方案--5

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多层板布线方法

PCB多层板布线方法 四层电路板布线方法:一般而言,四层电路板可分为顶层、底层和两个中间层。顶层和底层走信号线,中间层首先通过命令DESIGN/LAYER STACK MANAGER用ADD PLANE 添加INTERNAL PLANE1和INTERNAL PLANE2分别作为用的最多的电源层如VCC ...…

查看全部问答∨

以前做的一个板子 原理简单 但是没有调试成功 请大家讨论下

这个板子原理简单 程序思想也不难 但是做出板子却是没有实现功能 很是恼火啊 呵呵 请大家帮忙看一下吧 一 首先说明这个板子的用途:     车间有12台电机,每一台可以接出一路信号,运行时 有24V直流电 若出现故障 则没有电压输出。板子 ...…

查看全部问答∨

请教一个KEIL调试发现的问题

用KEIL调试发现的   标志位放的位置不一样,结果也是不一样的,请教下朋友们什么原因?谢谢…

查看全部问答∨

关于ise ,求助

最近调试一段程序,synthesize是没有问题的,但是当implement的时候,出现如下warningWARNING:NgdBuild:1012 - The constraint <NET \"ld_out[1]\" LOC = P15;> [top.ucf(49)] is overridden on the design object XLXI_2/ld_out<1 ...…

查看全部问答∨

[转帖]STM32内置参照电压的使用

每个STM32芯片都有一个内部的参照电压,相当于一个标准电压测量点,在芯片内部连接到ADC1的通道17。 根据数据手册中的数据,这个参照电压的典型值是1.20V,最小值是1.16V,最大值是1.24V。这个电压基本不随外部供电电压的变化而变化。 不少 ...…

查看全部问答∨

UART模块问题

我现在有一块板,p3.3接422-TEN,p3.4接422-TIN,p3.5接422-OUT,外接时钟是32768Hz,程序如下: void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P3SEL |= 0x38; // P3.3,4,5 = UCLK0,USART0 TXD/ ...…

查看全部问答∨

现在学习zigbee 用什么板子好呢?

我的毕业论文是关于zigbee的,要求演示个简单的实验,大家给点建议,用什么产品好呢?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved