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

网站好看的图标代码百度公司做网站

网站好看的图标代码,百度公司做网站,响应式网站制作软件,合肥建站公司seoDMA 协助CPU#xff0c;完成数据转运工作。 两个程序#xff1a; DMA数据转运#xff0c;DMAAD多通道 DMA数据转运#xff0c;将使用DMA#xff0c;进行存储器到存储器的数据转运#xff0c;也就是把一个数组里面的数据#xff0c;复制到另一个数组里。 定义一个数组D… DMA 协助CPU完成数据转运工作。 两个程序 DMA数据转运DMAAD多通道 DMA数据转运将使用DMA进行存储器到存储器的数据转运也就是把一个数组里面的数据复制到另一个数组里。 定义一个数组DateA ,里面存放1、2、3、4然后再定义一个数组DateB里面存的4个0作为数据转运的目的地我们会写一个模块叫MyDMA把源数组和目的数组地址传进去再传入转运数据长度4就这执行主循环的流程。 第一步自增变化一下源数组DataA 的测试数据 第二步显示一下DataA和DataB,然后延时一秒方便观看 第三步调用一下MyDMA_Transfer函数使用DMA进行数据转运。和使用for循环使用CPU一个个手动地转运数据效果是一样的 接着最后再显示一下DataA和DataB看一下数据是不是从DataA转运到了DataB DMAAD多通道程序 用ADC的扫描模式来实现多通道采集然后使用DMA来进行数据转运最终AD转换数据就会直接自动地跑到我们定义的数组里面然后用OLED显示一下就可以了。和上一节AD多通道的现象是一样的就只是在STM32端使用了扫描模式并且加了DMA转运数据。 DMA这个外设是可以直接访问STM32内部的存储器的包括运行内存SRAM、程序存储器Flash和寄存器等等DMA都有权利直接访问它们。所以DMA才能完成数据转运工作。 这里外设指的是外设的寄存器一般是外设的数据寄存器DR Data Register 比如ADC的数据寄存器串口的数据寄存器等等这里存储器指的就是运行内存SRAM和程序存储器Flash是我们存储变量数组和程序代码的地方在外设和存储器或者存储器和存储器之间进行数据转运就可以使用DMA来完成并且在转运的过程中无须CPU的参与节省了CPU的资源CPU省下时间就可以干一些其他的更加专业的事情搬运数据这种杂活交给DMA就行了。 从一个地方移动到另一个地方就需要占用一个通道如果有多个通道进行转运那它们之间可以各转各的互不干扰这就是DMA通道。 如果DMA进行的是存储器到存储器的数据转运比如我们想把Flash里的一批数据转运到SRAM里去使用软件触发之后DMA就会一股脑地把这批数据以最快的速度全部转运完成这也是我们想要的结果。那如果DMA进行的是外设到存储器的数据转运因为外设的数据是有一定时机的所有这时我们需要用硬件触发那就得ADC每个通道AD转换完成后硬件触发一次DMA之后DMA再转运。触发一次转运一次这样的数据才是正确的才是我们想要的效果。特定的硬件触发意思是每隔DMA的通道它的硬件触发源是不一样的你要使用某个外设的硬件触发源就得使用它连接的那个通道而不能任意选择通道 运算器、控制器、存储器、输入设备和输出设备 其中运算器和控制器一般会合在一起叫做CPU计算机核心关键部分就是CPU和存储器 存储器两个重要的知识点内容和地址。 这个表是STM32中所有类型的存储器和它们被安排的地址STM32的数据手册里也有存储器映像的图一个意思。 外设到存储器实质上也是存储器到存储器之间的数据转运。 ROM第一块程序存储器Flash 主闪存 也就是我们下载程序的位置 运行程序一般也是从主闪存里面开始运行的。这一块存储器STM32给它分配的地址是0x0800 0000 起始地址也就是第一个字节的地址是0800这个起始地址也就是第一个字节的地址是0800这个然后剩余字节的地址依次增长每个字节都分配一个独一无二的地址就像给每个住户编门牌号一样程序才能精准地访问这个存储器最终终止地址是多少呢取决于它的容量。 如果在软件里看到某个数据的地址是0800开头的可以确定它属于主闪存的数据。 系统存储器和选项字节两块存储器掉电不丢失也是ROM的一种实际上它们的存储介质也是Flash只不过我们一般讲的Flash指的是主闪存Flash而不指这两块区域可以看出这两块区域位置是在ROM区的最后面。 系统存储器的用途BootLoader程序是芯片出厂自动写入的一般也不允许我们修改 选项字节位置是在ROM区的最后面下载程序可以不刷新选项字节的内容存的主要是Flash的读保护写保护还有看门狗等等的配置。 运行内存SRAM 存放 我们在程序中定义 变量、数组、结构体的地方类比电脑的话运行内存就是内存条 外设寄存器 也就是我们初始化各个外设最终所读写的东西。它的存储介质其实也是SRAM只不过习惯把运行内存叫SRAM外设寄存器直接叫寄存器 内核外设就是NVIC和SysTick因为内核外设和其他外设不是一个厂家设计的所以它们的地址也是被分开了。 在STM32中所有的存储器都被安排到了0-8个F这个地址范围内因为CPU是32位的所以寻址范围就是32位的范围最大可以支持4GB容量的存储器而STM32中的存储器都是KB级别的所以这个4GB的寻址空间会有大量的地址是空的算一下地址使用率还不到1%。 它这里写的是别名到Flash或者系统存储器取决于Boot引脚所以这里需要我们想要执行的程序映射到0地址来。如果映射在Flash区就是从Flash执行如果映射再系统存储器区就是从系统存储器运行BootLoader如果映射到SRAM就是从SRAM启动怎么选择由BOOT0和BOOT1两个引脚来决定。 具体的每个外设又有它们自己的起始地址比如TIM2的地址是4000 0000 又可以具体细分到每个寄存器的地址、寄存器里每个字节的地址。 左上角是M3的内核里面包含了CPU和内核外设等等剩下的所有东西都可以把它看成是存储器所以总共就CPU和存储器两个东西。 Flash是主闪存区SRAM是运行内存各个外设都可以看成是寄存器也是一种SRAM寄存器一方面CPU可以对寄存器进行读写就像读写运行内存一样另一方面寄存器的每一位背后都连接了一根导线用于控制外设电路的状态比如置引脚的高低电平导通和断开开关切换数据选择器。所以寄存器是连接软件和硬件的桥梁。软件读写寄存器就相当于控制硬件的执行。 既然外设是寄存器寄存器就是存储器那使用DMA进行数据转运就都可以归结为一类问题了就是从某个地址取内容再放到另一个地址去。 为了高效有条理地访问存储器设计了一个总线矩阵总线矩阵的左端是主动段元也就是拥有存储器的访问权右边这些是被动单元它们的存储器只能被左边的主动单元读写主动单元这里内核有DCode和系统总线可以访问右边的存储器其中DCode总线是专门访问Flash的系统总线是访问其他东西的。另外由于DMA要转运数据所以DMA也要有访问的主动权那主动单元除了内核CPU剩下的就是DMA总线了。这里DMA1有一条DMA总线DMA2也有一条DMA总线还有以太网外设自己私有的DMA这个可以先不用管在DMA1和DMA2里面可以看到DAM1有7个通道DMA2有5个通道各个通道可以分别设置它们转运数据的源地址和目的地址这样它们就可以各自独立地工作了。 下面的仲裁器是因为虽然多个通道可以独立转运数据但是DMA总线只有一条所以所有的通道都只能分时复用这一条DMA总线如果产生了冲突那就会由仲裁器根据通道的优先级来决定谁先用谁后用。另外总线矩阵里也有个仲裁器如果DMA和CPU都要访问同一个目标那么DMA就会暂停VPU的访问以防止冲突不过总线仲裁器仍然会保证CPU得到一半的总线带宽使CPU正常的工作这就是仲裁器的作用。 DAM作为一个外设也会有相应的配置寄存器这里连接在总线右边的AHB总线上所以DMA即便是总线矩阵的主动单元可以读写各种存储器也是AHB总线上的被动单元CPU通过这一条线路就可以对DMA进行配置了。 DMA请求就是DAM的硬件触发源比如ADC转换完成串口接收到数据需要触发DMA转运数据的时候会通过这条线路向DMA发出硬件触发信号之后DMA就可以执行数据转运的工作了这就是DMA请求的作用。 Flash如果通过总线直接访问无论是CPU还是DMA都是只读的不能写入我们可以配置Flash接口控制器对Flash进行写入这个流程就比较复杂了要先对Flash按页进行擦除再写入数据这是另一个课题。暂不讨论。 SRAM可以任意读写 外设寄存器得看手册说明是只读的还是只写的还是读写的 在这个图里面外设寄存器和Flash、SRAM是数据转运的两大站点STM32手册里所说的存储器一般是特指Flash和SRAM不包含外设寄存器外设寄存器就会直接称为外设。转运方向有一个方向的参数可以进行控制另外还可以从存储器到存储器。由于Flash是只读的所以DMA不可以进行SRAM到Flash或者Flash到Flash的转运操作。 既然要进行数据转运那肯定要指定从哪里转到哪里具体怎么转了所以外设和存储器两个站都有3个参数第一个是起始地址有外设端的起始地址和存储器端的起始地址这两个参数决定了数据是从哪里来到哪里去的。 第二个是数据宽度指定一次要转运要按多大的数据宽度来进行它可以选择字节Byte半字HalfWord和字Word字节8位半字16位字是32位。 第三个参数地址是否自增参数的作用指定一次转运完成之后下一次转运是不是要把地址移动到下一个位置去这相当于指针p这个意思。比如ADC的扫描模式用DMA进行数据转运外设地址是ADC_DR寄存器寄存器这边显然地址不用自增的如果自增那下一次转运就跑到别的寄存器那里去了。存储器这边地址就需要自增每转运一个数据后就往后挪个坑要不然下次转运会覆盖掉。 传输计数器就是用来指定总共需要转运几次。这是一个自减计数器比如给它写5那DMA就只能进行5次数据转运每转运一次计数器的数就会减1当传输计数器减到0之后DMA就不会再进行数据转运了之前自增的地址也会恢复到起始地址的位置以方便DMA开始新一轮的转运。 自动重装器的作用是传输计数器减到0之后是否要自动恢复到最初的值比如传输计数器给5如果不使用自动重装器那转运5次之后DMA就结束了如果使用自动重装器那就转运5次计数器减到0后就会立即重装到初始值5。决定转运的模式如果不重装就是正常的单次模式如果重装就是循环模式。比如想转运一个数组一般就是单次模式转运一轮就结束了。如果是ADC扫描模式连续转换那为了配合ADCDMA也要使用循环模式所以这个循环模式和ADC的连续模式差不多都是指定一轮工作结束后是不是立即开始下一轮工作。 DMA触发控制触发就是决定DMA需要在什么时候进行转运的具体触发源选择由M2M这个参数决定Memory to Memoryto和2的英文同音存储器到存储器的意思。 软件触发并不是调用某个函数触发一次而是以最快的速度连续不断地触发DMA争取早日把传输计数器清零完成这一轮的转换。所以这里的软件触发和之前外部中断和ADC的软件触发可能不太一样可以把它理解为连续触发那这个软件触发和循环模式不能同时用因为软件触发是想把传输计数器清零循环模式是清零后自动重装如果同时用的话DMA就停不下来了。软件触发一般适用于存储器到存储器的转运。 硬件触发源可以选择ADC、串口、定时器等等使用硬件触发的转运一般都是与外设有关的转运这些转运需要一定的时机比如ADC转换完成、串口接收数据、定时时间到等等。 开关控制DMA_Cmd函数当给DMA使能后DMA准备就绪就可以进行转运了。DMA转运的几个条件 1.开关控制DMA_Cmd必须使能 2.传输计数器必须大于0 3.触发源必须有触发信号 触发一次转运一次传输计数器自减一次当传输计数器等于0且没有自动重装时这是无论是否触发DAM都不会再进行转运了此时就需要DMA_Cmd给DISABLE关闭DMA再为传输计数器写一个大于0的数再DMA_Cmd给ENABLE开启DMADMA才能继续工作。不能在DMA开启时写传输计数器这是手册里的规定 DMA请求 这张图表示的是DMA的触发部分DMA1的请求映像7个通道。 每个通道都有一个数据选择器可以选择硬件触发或软件触发这个图不太好理解因为一般数据选择器的侧边是输入选择控制位图示的意思难道是EN给1是硬件触发EN给0是软件触发吗显然不对而且左边写的是软件触发MEM2MEM位难道M2M是软件触发吗也不太好理解。所以看上面的PPT图才好理解。正确理解EN位是开关控制是决定这个数据选择器要不要工作M2M选择1时软件触发。 可以看到每个通道的硬件触发源都是不同的如果需要ADC1来触发的话那就必须选择通道1如果需要定时器2的更新事件来触发的话那就必须选择通道2剩下的同理每个通道的硬件触发源都不同。 所以如果想使用某个硬件触发源的话就必须使用它所在的通道这就是硬件触发的注意事项。而如果使用软件触发的话那通道就可以任意选择了因为每个通道的软件触发都是一样的 优先级的判断类似中断的优先级。此处默认优先级是通道号越小优先级越高 如果数据宽度一样那就是正常的一个个转运如果宽度不一样那是怎么处理呢 由表可知如果目标的数据宽度比源端数据宽度大那就在目标数据前面多出来的空位补0否则就是把多出来的高位舍弃掉 这里的转运是一种复制转运转运完成后DataA的数据并不会消失 左边是ADC扫描模式的执行流程有7个通道触发一次之后7个通道依次进行AD转换然后转换结果都放到ADC_DR数据寄存器里面我们要做的就是在每个单独的通道转换完成后进行一个DMA数据转运并且目的地址进行自增这样数据就不会被覆盖了。 ADC扫描模式在每个单独的通道转换完成后没有任何标志位也不会触发中断所以程序不太好判断某一个通道转换完成的时机是什么时候但是根据UP的研究实战虽然单个通道转换完成后不产生任何的标志位和中断但是应该会产生DMA请求去触发DMA转运。这部分内容手册里没有详细描述。单个通道的DMA请求肯定是有的不然实验就做不成了。 一般来说DMA最常见的用途就是配合ADC的扫描模式因为ADC扫描模式会有个数据覆盖的特征或者可以说这个数据覆盖的问题是ADC固有的缺陷这个缺陷使ADC和DMA成为了最常见的伙伴ADC对DMA的需求是非常强烈的。像其他一些外设使用DMA可以提高效率是锦上添花的操作但是不使用也可以顶多是损失一些性能但是这个ADC的扫描模式如果不使用DMA功能都会受到很大的限制。 代码编写 查找表字库数据可以把它们定义为常量这样节省SRAM的空间定义在Flash里面。地址由编译器确定不同的程序地址可能不一样是不固定的 外设寄存器的地址地址是固定的在程序里可以用结构体很方便地访问寄存器。 如果想算某个寄存器的地址就可以查手册计算一下首先查这个寄存器所在外设的起始地址然后再在外设的寄存器总表里查一下偏移起始地址偏移就是这个寄存器的实际地址 如何知道ADC1-DR寄存器地址。在ADC1右键跳转到定义 #define ADC1 ADC_TypeDef*ADC1_BASE 左边是一个强制类型转换把ADC1_BASE转换为了ADC_TypeDef类型的指针右边ADC1_BASE是ADC1的基地址就是起始地址 ADC1的基地址就是APB2外设基地址0x2400APB2外设基地址就是外设基地址0x10000外设基地址就是0x4000 0000。基地址偏移地址就是寄存器的实际地址使用了非常巧妙的方法来实现这个偏移那就是使用结构体依次定义了各种寄存器结构体成员的顺序和寄存器实际存放顺序是一一对应的。这就是STM32中使用结构体来访问寄存器的流程 ADC1-DR 中ADC1是结构体指针指向的是ADC1外设的起始地址访问结构体成员相当于加了一个地址偏移起始地址偏移就是指定的寄存器这里因为ADC1是一个结构体指针所以要用-也就是箭头这个符号来取成员。 步骤 1.RCC开启DMA时钟 2.直接调用DMA_Init初始化各个参数包括外设和存储器站点的起始地址、数据宽度、地址是否自增、方向、传输计数器、是否需要自动重装、选择触发源还有通道优先级开关控制给指定的通道使能 恢复缺省配置 初始化 结构体初始化 使能 中断输出使能 DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber); DMA设置当前数据寄存器 这个函数是给传输数据寄存器写数据的 DMA_GetCurrDataCounter DMA获取当前数据寄存器这个函数返回传输计数器的值 获取标志位状态 清除标志位 获取中断状态 清除中断挂起位 除了中间两个函数其他的都是经典函数 键盘上的Alt键然后按鼠标左键进行框选就可以以方框的形式框选如果不按Alt就是一行一行连续运行的框选。 可以看到此时硬件外设已经实现了相互配合和高度的自动化各种操作都是硬件自己完成的极大地减轻了软件负担软件什么都不需要做也不需要任何中断可以再加一个外设用ADC单次扫描再用定时器去定时触发这样就是定时器触发ADCADC触发DMA整个过程完全自动不需要程序手动进行操作。这就是STM32中硬件自动化的一大特色。各种外设相互连接互相交织不再是传统的一个CPU单独控制多个独立的外设而是外设之间相互合作形成一个网状结构这样在完成某些简单且繁琐的工作的时候就不需要CPU来统一调度了可以直接通过外设之间的相互配合自动完成这些繁琐的工作大大提高外设的性能
http://www.dnsts.com.cn/news/48782.html

相关文章:

  • 哪些网站是百度新闻源广州网站建设兼职
  • 做彩票网站是违法的吗怎么做网站自动响应
  • 中国临沂网站优化网络运营一个月工资
  • 介休做网站长春建站网站模板
  • 网站建设开发设计公司seo培训教程
  • 单页面网站制作视频广东室内设计公司排名
  • 电脑做网站服务器改端口公司网站高端网站建设
  • 网站做小学一年二班作业怎么做网站特效模板
  • 网站建设如何上传文件网页框架模板
  • 苏州建站个人网站欣赏的网站
  • 手机网站建设 新闻嘉兴网站seo公司
  • 深圳论坛网站建设做网站一屏的尺寸是
  • seo的站外优化流程用什么框架做网站快
  • 网站建站好处中国建筑信息查询平台
  • 网站帮忙备案简单网站建设规划方案
  • 实训建设网站的目的wordpress 资料
  • wordpress的网站怎样添加地图坐标网站dns解析失败
  • 网站建设好发信息网郑州专业网站推广优化公司
  • 网站空间哪家好iis怎么使用来建设一个网站
  • 网站建设材料汇报电子商务专业就业方向及就业岗位
  • 江西赣鄂皖路桥投资有限公司网站建设电商网站开发数据库设计
  • 分类网站模板下载企业微信最新版
  • 南京市溧水区建设局网站网站页面设计合同
  • 番禺网站建设价格山东网络推广优化排名
  • 网站开发如何修改字体蓝色网站设计
  • 郑州网站建设公司网页制作与网站建设报告
  • 手机网站 宽度做淘宝客个人网站
  • 网站怎么做分享链接搭建单位网站
  • 网站后台密码如何破解wordpress和dz哪个好
  • 怎么做网站弹幕天津网站备案