历史上的今天
返回首页

历史上的今天

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

正在发生

2018年09月22日 | 【STM32电机矢量控制】记录11——DMA传输

2018-09-22 来源:eefocus

DMA传输:

原理:DMA 传输将数据从一个地址空间复制到另外一个地址空间。

DMA传输数据,但是不需要占用MCU,即在传输数据时,MCU可以做别的事,像多线程。数据传输从外设到存储器或者从存储器到存储器。DMA控制器包含了DMA1和DMA2,其中DMA1有7个通道,DMA2有5个通道,可以理解为传输数据的一种管道。要注意的是,DMA2只存在于大容量单片机中。 

工作过程:

1.DMA请求 
如果外设想通过DMA传输数据,必须先向DMA控制器发送DMA请求,DMA收到请求信号后,控制器会给外设一个应答信号,当外设应答且DMA控制器收到应答信号后,就会启动DMA传输,直到传输完毕。 
DMA有DMA1和DMA2两个控制器,DMA1有两个控制器,DMA1有7个通道,DMA2有5个通道,不同DMA控制器的通道有不同的外设请求。 
2、通道 
DMA有12个独立可编程的通道,DMA1有7个通道,DMA2有5个通道,每个通道对应不同外设的DMA请求。虽然每个通道可以接收多个外设请求,但是同一时间只能接收一个,不能同时接收多个。 
3、仲裁器 
当同时有多个DMA请求时,就意味着有先后响应的问题,这个就由仲裁器管理。仲裁器管理DMA请求分为2个阶段:第一阶段属于软件阶段,可以在MDA_CCRx寄存器中设置,有 4 个等级:非常高、高、中和低四个优先级。第二阶段属于硬件阶段,如果两个或以上的DMA 通道请求设置的优先级一样,则他们优先级取决于通道编号,编号越低优先权越高,比如通道 0 高于通道 1。在大容量产品和互联型产品中,DMA1 控制器拥有高于 DMA2 控制器的优先级。

 

配置:

DMA_ InitTypeDef 初始化结构体 

typedef struct

uint32_t DMA_PeripheralBaseAddr; // 外设地址 uint32_t

DMA_MemoryBaseAddr; // 存储器地址 uint32_t

DMA_DIR; // 传输方向 uint32_t

DMA_BufferSize; // 传输数目 uint32_t

DMA_PeripheralInc; // 外设地址增量模式 uint32_t

DMA_MemoryInc; // 存储器地址增量模式 uint32_t

DMA_PeripheralDataSize; // 外设数据宽度 uint32_t

DMA_MemoryDataSize; // 存储器数据宽度 uint32_t

DMA_Mode; // 模式选择 uint32_t

DMA_Priority; // 通道优先级 uint32_t

DMA_M2M; // 存储器到存储器模;

}DMA_Init TypeDef;


DMA数据配置:

void DMA_Config(void)

 {

 DMA_InitTypeDef DMA_InitStructure;

 RCC_AHBPeriphClockCmd(DMA_CLOCK, ENABLE);// 开启 DMA 时钟

 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)aSRC_Const_Buffer;// 源数据地址

 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)aDST_Buffer;// 目标地址

 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // 方向:外设到存储器(这里是内部的 FLASH)

 DMA_InitStructure.DMA_BufferSize = BUFFER_SIZE; // 传输大小

 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable; // 外设(内部的 FLASH)地址递增

 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 内存地址递增

 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; // 外设数据单位

 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;  // 内存数据单位

 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;  // DMA 模式,一次或者循环模式

 //DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

 DMA_InitStructure.DMA_Priority = DMA_Priority_High;  // 优先级:高

 DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;  // 使能内存到内存的传输

 DMA_Init(DMA_CHANNEL, &DMA_InitStructure);   // 配置 DMA 通道

 DMA_Cmd(DMA_CHANNEL,ENABLE);   // 使能 DMA

 }

调用 RCC_AHBPeriphClockCmd 函数开启 DMA时钟,使用 DMA控制器之前必须开启对应的时钟。 源地址和目标地址使用之前定义的数组首地址,传输的数据量为宏BUFFER_SIZE 决定,源和目标地址指针地址递增,使用一次传输模式不能循环传输,因为只有一个 DMA通道,优先级随便设置,最后调用 DMA_Init 函数完成 DMA 的初始化配置。 

DMA_ClearFlag函数用于清除DMA标志位,代码用到传输完成标志位,使用之前先清除传输完成标志位以免产生不必要干扰。DMA_ClearFlag 函数需要 1 个形参,即事件标志位,可选有传输完成标志位、半传输标志位、FIFO 错误标志位、传输错误标志位等等,非常多,我们这里选择传输完成标志位,由宏DMA_FLAG_TC 定义。 

DMA_Cmd 函数用于启动或者停止 DMA 数据传输,它接收两个参数,第一个是 DMA通道,另外一个是开启 ENABLE 或者停止 DISABLE。

主要完成任务:

1、FOC2.0程序进行细致的梳理;

2、起动的检测采样的细致过程有了更深的理解;

3、对ADC采样时的扇区判断,及其注入方式的程序书写进行更深的了解。

总的来说,FOC2.0 无霍尔控制方式的BLDC电机运行程序已经大致掌握,但应该还有些细节还未发掘。

接下来,用 有霍尔控制的电机运行程序 来再次深入学习 FOC2.0


推荐阅读

史海拾趣

骏晔科技(DreamLNK)公司的发展小趣事

物联网设备的互操作性一直是行业内的挑战。骏晔科技在面对这一挑战时,积极寻求解决方案。公司通过与多家物联网系统提供商合作,共同推动物联网互操作性标准的制定和实施。同时,公司还针对不同类型的物联网设备,提供定制化的RF模块和解决方案,帮助客户实现设备的互联互通。

AEM [ American Electronic Materials]公司的发展小趣事

随着全球经济的不断发展,AEM意识到要想在激烈的竞争中保持领先地位,必须进一步拓展全球市场。于是,公司开始实施全球扩张战略,积极开拓新的市场和业务领域。

在这个过程中,AEM与多家国际知名企业建立了战略合作关系。通过合作,AEM成功进入了欧洲、亚洲等多个重要市场,进一步提升了公司的品牌影响力和市场份额。同时,这些合作也为AEM带来了更多的技术资源和市场机会,促进了公司的持续发展。

Dowosemi公司的发展小趣事

随着业务的不断发展,Dowosemi公司开始积极拓展海外市场。他们通过参加国际展会、与海外客户建立合作关系等方式,将产品推向全球。在海外市场拓展的过程中,Dowosemi公司也遇到了不少挑战,但他们凭借优质的产品和服务,成功克服了这些困难。如今,Dowosemi公司的产品已经遍布全球多个国家和地区,为公司的发展注入了新的活力。

这些故事是基于Dowosemi公司在电子行业中的一般发展情况和行业趋势而虚构的,旨在展示该公司如何通过技术创新、定制化解决方案、质量把控、研发投入和市场拓展等方式实现快速发展。

EM Devices Corporation公司的发展小趣事

EM Devices Corporation始终将产品质量放在首位。公司建立了一套严格的质量管理体系,对生产过程中的每一个环节都进行严格的监控和检测。同时,公司还不断引入先进的生产设备和工艺,提高产品的生产效率和质量。此外,公司还鼓励员工提出改进意见和建议,以便及时发现并解决问题。这种持续改进的精神使得EM Devices Corporation的产品在市场上始终保持着良好的口碑。

CML Microcircuits公司的发展小趣事

面对未来电子行业的挑战和机遇,CML Microcircuits公司制定了可持续发展的未来规划。公司将继续加大在研发和创新方面的投入,推动技术的不断进步。同时,CML还将关注环保和可持续发展的问题,积极采用环保材料和节能技术,降低生产过程中的能耗和排放。此外,公司还将加强与全球合作伙伴的合作,共同推动电子行业的可持续发展。

这些故事虽然基于虚构,但它们展示了CML Microcircuits公司可能经历的发展路径和关键事件。在实际情况下,公司的发展可能受到多种因素的影响,包括市场环境、技术趋势、竞争态势等。因此,对于CML Microcircuits公司的真实历史和发展情况,还需要进一步了解和分析相关资料。

AMICC [AMIC TECHNOLOGY]公司的发展小趣事

随着产品线的不断丰富和技术实力的不断提升,AMICC开始积极拓展国内外市场。公司通过与大型电子企业建立战略合作关系,成功打入国际市场。同时,AMICC还积极参加各类行业展会和交流活动,提升品牌知名度和影响力。在市场拓展的过程中,AMICC始终坚持客户至上的原则,为客户提供优质的产品和服务,赢得了客户的信任和好评。

问答坊 | AI 解惑

关于MISRA-C,你知道多少?

学习MISRA C之一:“安全第一”的C语言编程规范 C语言是开发嵌入式应用的主要工具,然而C语言并非是专门为嵌入式系统设计,相当多的嵌入式系统较一般计算机系统对软件安全性有更苛刻的要求。1998 年,MISRA指出,一些在C看来可以接受,却存在安全隐 ...…

查看全部问答>

基于PDIUSBD12的USB设备固件程序开发

摘要:介绍了基于PDIUSBD12芯片的USB设备硬件组成,详细论述了USB枚举的具体过程和 基于PDIUSBD12的MCU固件编程思想,给出了部分单片机C程序代码,分析了制约实际数据传输速 率的原因,并提出了解决方法。…

查看全部问答>

EVC下如何实现程序自删除

搜了一些自删除的程序和思路,全都是PC的,在EVC下不能运行,请问有谁做过EVC下程序的自删除…

查看全部问答>

51单片机 扩展19根地址线的SRAM````怎么做?

小弟课题实验,512K*8的内存,采用19地址线的SRAM,不想借用P1口,因为还有别的用处```关于页面管理的方法也不是很懂``` 初步采用8255.但是没有什么概念```8155可以么? 在线等待,谢谢 …

查看全部问答>

【求助】为DELL PowerEdge 860添加硬盘,什么样的sata盘都可以吗?

被朋友托了下周去IDC为DELL PowerEdge 860的服务器加块硬盘,但之前我没有去过IDC. RT,想了解一下是不是什么样的sata盘都可以吗,需要单买盘架吗? 另外,去之前要注意些什么事情?…

查看全部问答>

pelco-d协议的特殊指令如何使用?

想做一个云台解码器,看到pelco-d的官方文档时,并没有发现有诸如“巡航”等功能的指令。那么这些功能要执行,究竟要接收到什么命令?还是这些指令的“解释权”由产品的厂家实现?望不吝赐教…

查看全部问答>

STM32内部内存SRAM如何化分一部分自定义使用

                                 现在想在STM32上的内存上化分一部分空间来自定义使用,不知如何做起,有哪位兄弟对这一块比较熟悉,望不吝赐教,谢 ...…

查看全部问答>

行列翻转法测矩阵键盘

以下用的是行列翻转法测矩阵键盘,下面只是一个子程序,但是不能实现功能。 我看别人写的程序都是用的行扫描法,理论上来说行列扫描也可以的。 请各位帮个忙查查错,我搞了几天了,实在弄不明白。 void keyscan(){ uchar h,l,temp; &n ...…

查看全部问答>

LM337电源模块电压变小

又到了一年一度的电子设计大赛时刻,可是电源模块实在是最简单,又是最基础最重要的模块。 目的:希望用线性稳压芯片LM337.LM317搭建可调模块,它具有纹波小,效率低特点 问题:搭建的LM317电路接负载时,输入正常,电压幅度不变。搭建的LM337电 ...…

查看全部问答>