当前位置: 首页 > news >正文

DMA(STM32)

1.DMA:data memory access //实际的内存存储

注:DMA干活的时候是不需要CPU干涉的

2.

①内存(定义的变量)---外设(寄存器);

②内存---内存

③外设---外设(一个外设的寄存器到另一个外设的寄存器)

3.

STM32有两个DMA控制器

如图:

4.举例说明:(内存到外设,串口1 TX DMA)

 1 void USART1_DMA_Config(void)
 2 {
 3         DMA_InitTypeDef DMA_InitStructure;
 4     
 5         /*Open the DMA clock*/
 6         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
 7 
 8         /*Set the DMA source: serial port data register address*/
 9         DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;       
10 
11         /*Memory address,(A pointer to the variable transmission)*/
12         DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;
13 
14         /*Direction:From memory to the peripherals*/        
15         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;    
16 
17         /*Transmission size:DMA_BufferSize=SENDBUFF_SIZE*/    
18         DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;
19 
20         /*It does not increase peripheral address*/        
21         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; 
22 
23         /*Memory address since the increase*/
24         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;    
25 
26         /*A peripheral unit of data*/    
27         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
28 
29         /*Memory data unit:8bit*/
30         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;     
31 
32         /*The DMA mode: cycle*/
33         //DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
34         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;     
35 
36         /*priority:medium*/    
37         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  
38 
39         /*Memory to memory transmission is prohibited*/
40         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
41 
42         /*Configuration of the channel 4*/           
43         DMA_Init(DMA1_Channel4, &DMA_InitStructure);        
44         
45         /*enable DMA1_Channel4*/
46         DMA_Cmd (DMA1_Channel4,ENABLE);                    
47         //DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);  //Configuration after completion of the DMA interrupt
48 }

①USART1_TX挂载在DMA1的通道4(每个DMA有7个通道,对应不同外设)如图:

②程序第九行source(源)

即:源头地址(外设地址)

 1 #define USART1_DR_Base 0x40013804 // 0x40013800 + 0x04 = 0x40013804 

怎么算出来的呢?

请来看:

 

基地址是什么呢?

 

故:串口1的数据寄存器地址:

// 0x40013800 + 0x04 = 0x40013804

③内存地址,自己定义的数组

④方向:内存到外设

⑤传输大小:5000个字节

⑥外设地址不增,内存地址自增,把5000个字节循环发完

⑦发送模式:有Normal:送完5000个字节工作就结束了,circular则是循环发送

⑧优先级:假如在一个程序里面有几个外设同时申请了DMA请求,则根据优先级不同来选择配置那个

⑨禁止内存到内存的传输

4.看看main函数

            uint16_t i;
            
            /*Filling is going to send data*/
            for(i=0;i<SENDBUFF_SIZE;i++)
            {
                SendBuff[i]     = 'A';
            }
        
        /* USART1向DMA发出TX请求*/
        USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);

        /* 此时CPU是空闲的,可以来做别的事情*/
        
        //LED  At the same time scintillation
        for(;;)
        {
            LED1(ON);
            Delay(0xFFFFF);
            LED1(OFF);
            Delay(0xFFFFF);
        }

注:这样串口1不断向外发送数据,不影响CPU运行,CPU可以藤下时间做别的事情;(同事干两件事情)
 

M3里面的DMA只能软件触发,有的芯片可以外部的脉冲触发;

                                     瘋子随记

转载于:https://www.cnblogs.com/Ph-one/p/4006225.html

相关文章:

  • STM32.printf
  • STM32各个文件介绍、uCOSII文件介绍
  • Cortex-M3基础
  • Program Size
  • KEIL中常见问题
  • LM2596、LM2576
  • STM32硬件IIC
  • CP2102
  • SMBus
  • 0x30、0x37
  • MOV/MOVX/MOVC、RAM/ROM
  • 固态硬盘的好处以及固态硬盘和普通硬盘的区搜索别
  • ⭐⭐堆和栈的区别
  • STM32电源管理
  • 'telnet'不是内部或外部命令,怎么办?
  • ➹使用webpack配置多页面应用(MPA)
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • egg(89)--egg之redis的发布和订阅
  • iOS编译提示和导航提示
  • Java 网络编程(2):UDP 的使用
  • Java多线程(4):使用线程池执行定时任务
  • Js基础知识(一) - 变量
  • mysql innodb 索引使用指南
  • Python实现BT种子转化为磁力链接【实战】
  • session共享问题解决方案
  • vue-router 实现分析
  • 机器学习学习笔记一
  • 面试遇到的一些题
  • 日剧·日综资源集合(建议收藏)
  • 十年未变!安全,谁之责?(下)
  • 什么软件可以剪辑音乐?
  • 使用 QuickBI 搭建酷炫可视化分析
  • 我的zsh配置, 2019最新方案
  • 详解NodeJs流之一
  • 学习JavaScript数据结构与算法 — 树
  • 应用生命周期终极 DevOps 工具包
  • ​力扣解法汇总946-验证栈序列
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (13)Hive调优——动态分区导致的小文件问题
  • (52)只出现一次的数字III
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (转)大型网站的系统架构
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .Net 路由处理厉害了
  • .NET企业级应用架构设计系列之开场白
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • 。Net下Windows服务程序开发疑惑
  • /etc/motd and /etc/issue