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

电子商务网站建设步骤百度文库辽宁天一建设有限责任公司网站

电子商务网站建设步骤百度文库,辽宁天一建设有限责任公司网站,保定网建站模板,怎样学装修设计快速入门文章目录 DMA简介DMA特性 DMA框图DMA基本结构DMA请求数据宽度对齐DMA数据转运工程DMAADC多通道 DMA简介 直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预#xff0c;数据可以通过DMA快速地移动#xff0c;这就节省了CPU的… 文章目录 DMA简介DMA特性 DMA框图DMA基本结构DMA请求数据宽度对齐DMA数据转运工程DMAADC多通道 DMA简介 直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预数据可以通过DMA快速地移动这就节省了CPU的资源来做其他操作。 DMA特性 拥有12个独立可配置通道DMA17个通道DMA25个通道 STM32F103C8T6 DMA资源DMA17个通道 每个通道都直接连接专用的硬件DMA请求也就是硬件触发也支持软件触发 对于有多个请求的同时可以利用软件编程设置优先级的先后顺序优先级相等的情况下由硬件决定 对于DMA来说需要传输的源头和传输的目的地传输的大小称为传输宽度一般有字节(8bit)、半字(16bit)、字(32bit)。 每个通道都有3个事件标志(DMA半传输、 DMA传输完成和DMA传输出错)这3个事件标志逻辑或成为一个单独的中断请求。 每个DMA通道都可以在DMA传输过半、传输完成和传输错误时产生中断。为应用的灵活性考虑通过设置寄存器的不同位来打开这些中断。 DMA框图 先看左上角DMA与Cortex™-M3核心共享系统数据总线通过总数据库可以直接执行存储器的数据传输Flash、SRAM、外设寄存器当DMA与Cortex™-M3同时访问相同的目标时会通过一个仲裁器来给它们两个循环调度访问目标而CPU最终会得到至少一半的带宽也就访问权限。 接着往下看AHB从设备连接着AHB总线可以控制总裁器和通道的选择。相当于AHB放长线放出一个设备来管理DMA。 总裁器是可以根据通道请求的优先级来启动外设/存储器的访问。 可以通过软件编程设置4个不同的等级最高优先级、高优先级、中等优先级、低优先级。 相同等级的情况下则较低编号的通道比较高编号的通道有较高的优 先权。举个例子通道2优先于通道4。 右边都是一些存储器和外设寄存器通过DMA的请求就可以直接对数据进行传输了。 这是存储器对应的起始地址和作用。 DMA基本结构 DMA的处理在发生一个事件后外设向DMA控制器发送一个请求信号。 DMA控制器根据通道的优先权处理请求。当DMA控制器开始访问发出请求的外设时 DMA控制器立即发送给它一个应答信号。当从DMA控制器得到应答信号时外设立即释放它的请求。一旦外设释放了这个请求 DMA控制器同时撤销应答信号。如果有更多的请求时外设可以启动下一个周期。 我们首先会从要传输的外设寄存器或者是储存器获取它的起始地址和传输的数据宽度然后再存数据到外设寄存器或者存储器指示的存储器地址并确定数据宽度 首先这里要明确DMA的数据转运是用复制去传输也就是原位置的数据是不会改变的。地址自增是考虑到一般给出的地址只是首元素地址或者说是起始地址要对下一个数据进行传输就需要对地址进行增加才能获取到下一个数据。 传输计数器是来统计要传输多少个数据宽度的一开始先赋予传输计数器一个初始值。 在没有启动自动重装器的情况下这个初始值会逐渐递减当计数器的值变为0时就停止传输。 如果启动了自动重装器当初始值逐渐递减为0时会重新恢复到初始值而对应的传输地址也会恢复到初始地址的状态 M2M是决定使用软件触发或者硬件触发的寄存器。 DMA请求 这是DMA1的请求映像对于DMA请求来说不同的外设是有要求不同对应通道的没有由我们所决定哪个硬件外设对应哪条通道而软件触发的则每条通道都允许。 数据宽度对齐 大小端讲解连接入口 这里是小端存储。 对以上的总结 当两端宽度相等时那么传输数据不变 当源端宽度小于目标宽度时目标宽度高位补0 当源端宽度大于目标宽度时对源端宽度进行截断保留低位的数据。 DMA数据转运工程 OLED代码连接入口 连接方式 通过DMA的数据搬运将一个数组中的内容搬运到另一个数组中并且原数组会随时间不断增加DMA也不断的进行数据搬运 DMA.c #include stm32f10x.h // Device headeruint16_t MyDMA_Size; void MyDMA_Init(uint32_t AddrA,uint32_t AddrB,uint16_t Size) {MyDMA_SizeSize;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//DMA初始化DMA_InitTypeDef DMA_InitStructure;DMA_InitStructure.DMA_BufferSizeSize; //指定通道缓冲区大小DMA_InitStructure.DMA_DIRDMA_DIR_PeripheralSRC; //指定外设是源或者目标DMA_InitStructure.DMA_M2MDMA_M2M_Enable; //指定是否为软件触发运送DMA_InitStructure.DMA_MemoryBaseAddrAddrB; //指定内存基地址DMA_InitStructure.DMA_MemoryDataSizeDMA_MemoryDataSize_Byte; //内存数据宽度DMA_InitStructure.DMA_MemoryIncDMA_MemoryInc_Enable; //指定内存地址是否自增DMA_InitStructure.DMA_ModeDMA_Mode_Normal; //指定DMA通道工作模式DMA_InitStructure.DMA_PeripheralBaseAddrAddrA; //指定外设基地址DMA_InitStructure.DMA_PeripheralDataSizeDMA_PeripheralDataSize_Byte; //外设数据宽度DMA_InitStructure.DMA_PeripheralIncDMA_PeripheralInc_Enable; //指定内存地址是否自增DMA_InitStructure.DMA_PriorityDMA_Priority_Medium; //指定DMA通道优先级DMA_Init(DMA1_Channel1,DMA_InitStructure);//DMA是否启动DMA_Cmd(DMA1_Channel1,DISABLE); } //数据转运函数 void MyDMA_Transfer() {DMA_Cmd(DMA1_Channel1,DISABLE);DMA_SetCurrDataCounter(DMA1_Channel1,MyDMA_Size); //设计DMA通道数据单元数DMA_Cmd(DMA1_Channel1,ENABLE);//检查DMA通道上的标志位运送完成标志while(DMA_GetFlagStatus(DMA1_FLAG_TC1)RESET); //需要手动清除标志位DMA_ClearFlag(DMA1_FLAG_TC1); }DMA.h #ifndef __DMA_H__ #define __DMA_H__void MyDMA_Init(uint32_t AddrA,uint32_t AddrB,uint16_t Size); void MyDMA_Transfer();#endifsize表示传输的个数大小由源端数据宽度决定地址自增将会使数组下标进行移动 规定软件触发不能启动自动重装器也就是DMA的模式 数据转运函数由于需要不断的数据转运而没有启动自动重装器所以需要我们自己编程来进行重装也就是将Size恢复为初始值地址会随着Size的变化进行变化。 手动将Size重装之前需要先对运行控制禁用全部操作设置完才可以启用运行控制 #include stm32f10x.h // Device header #include Delay.h #include Buzzer.h #include DMA.h #include OLED.huint8_t DataA[]{0x01,0x02,0x03,0x04}; uint8_t DataB[]{0,0,0,0}; int main() {OLED_Init();MyDMA_Init((uint32_t)DataA,(uint32_t)DataB,4);OLED_ShowString(1,1,DataA);OLED_ShowString(3,1,DataB);OLED_ShowHexNum(1,8,(uint32_t)DataA,8);OLED_ShowHexNum(3,8,(uint32_t)DataB,8);while(1){DataA[0];DataA[1];DataA[2];DataA[3];OLED_ShowHexNum(1,8,(uint32_t)DataA,8);OLED_ShowHexNum(2,1,DataA[0],2);OLED_ShowHexNum(2,4,DataA[1],2);OLED_ShowHexNum(2,7,DataA[2],2);OLED_ShowHexNum(2,10,DataA[3],2);OLED_ShowHexNum(4,1,DataB[0],2);OLED_ShowHexNum(4,4,DataB[1],2);OLED_ShowHexNum(4,7,DataB[2],2);OLED_ShowHexNum(4,10,DataB[3],2);Delay_ms(1000);MyDMA_Transfer();OLED_ShowHexNum(2,1,DataA[0],2);OLED_ShowHexNum(2,4,DataA[1],2);OLED_ShowHexNum(2,7,DataA[2],2);OLED_ShowHexNum(2,10,DataA[3],2);OLED_ShowHexNum(4,1,DataB[0],2);OLED_ShowHexNum(4,4,DataB[1],2);OLED_ShowHexNum(4,7,DataB[2],2);OLED_ShowHexNum(4,10,DataB[3],2);Delay_ms(1000);} } DMAADC多通道 接线方式 ADC的规则通道会将多通道结果放在规则通道寄存器上每当扫描到一个通道结果就放在ADC_DR上结果会覆盖掉上一个储存的数据DMA就会将结果转运到DMA存储器地址上。所以对于ADC_DR不用实现地址自增而DMA储存器需要实现地址自增。 AD.c #include stm32f10x.h // Device headeruint16_t AD_Value[4];void AD_Init() {RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//配置ADC时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 72M/612MHzGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_ModeGPIO_Mode_AIN; //模拟输入GPIO_InitStructure.GPIO_PinGPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);//为所选ADC规则通道配置其序列器对应等级和采样时间ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_3,4,ADC_SampleTime_55Cycles5);//ADC结构体成员ADC_InitTypeDef ADC_InitStructure;ADC_InitStructure.ADC_ContinuousConvModeENABLE; //指定通道模式为连续转换或者单转换ADC_InitStructure.ADC_DataAlignADC_DataAlign_Right; //数据对齐方式ADC_InitStructure.ADC_ExternalTrigConvADC_ExternalTrigConv_None; //启动规则通道模拟电压到数字转换的外部触发器ADC_InitStructure.ADC_ModeADC_Mode_Independent; //配置ADC为独立模式或者双模式ADC_InitStructure.ADC_NbrOfChannel4;ADC_InitStructure.ADC_ScanConvModeENABLE; //选择是否为扫描模式ADC_Init(ADC1,ADC_InitStructure);//DMA结构体成员DMA_InitTypeDef DMA_InitStructure;DMA_InitStructure.DMA_PeripheralBaseAddr (uint32_t)ADC1-DR;DMA_InitStructure.DMA_PeripheralDataSize DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_PeripheralInc DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryBaseAddr (uint32_t)AD_Value;DMA_InitStructure.DMA_MemoryDataSize DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_MemoryInc DMA_MemoryInc_Enable;DMA_InitStructure.DMA_DIR DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize 4;DMA_InitStructure.DMA_Mode DMA_Mode_Circular;DMA_InitStructure.DMA_M2M DMA_M2M_Disable;DMA_InitStructure.DMA_Priority DMA_Priority_Medium;DMA_Init(DMA1_Channel1, DMA_InitStructure);//ADC运行控制DMA_Cmd(DMA1_Channel1,ENABLE);ADC_DMACmd(ADC1,ENABLE);ADC_Cmd(ADC1,ENABLE);//重置所选ADC校准寄存器ADC_ResetCalibration(ADC1);//获取ADC复位状态复位后为0while(ADC_GetResetCalibrationStatus(ADC1));//开始校准ADC_StartCalibration(ADC1);//获取ADC所选标准位状态校准需要时间校准好后置0while(ADC_GetCalibrationStatus(ADC1));//启动ADC软件转换ADC_SoftwareStartConvCmd(ADC1,ENABLE);} AD.h #ifndef __AD_H__ #define __AD_H__extern uint16_t AD_Value[4];void AD_Init();#endif 这里采用的是连续转换扫描模式。这样就可以直接实现数据转换的自动化。 这里需要加上ADC_DMACmd函数因为上面DMA请求中通道一的硬件触发有3个选择这里表示选择ADC1. ADC为软件触发方式DMA为硬件触发方式。 main.c #include stm32f10x.h // Device header #include Delay.h #include OLED.h #include AD.hint main() {OLED_Init();AD_Init();OLED_ShowString(1,1,AD0:);OLED_ShowString(2,1,AD1:);OLED_ShowString(3,1,AD2:);OLED_ShowString(4,1,AD3:);while(1){OLED_ShowNum(1,5,AD_Value[0],4);OLED_ShowNum(2,5,AD_Value[1],4);OLED_ShowNum(3,5,AD_Value[2],4);OLED_ShowNum(4,5,AD_Value[3],4);} }
http://www.zqtcl.cn/news/230698/

相关文章:

  • 网站开发完成后如何发布做网站用vs还是dw
  • 怎么看网站是否备案可信赖的菏泽网站建设
  • 做网站的优点系统软件开发服务
  • 深圳品牌营销网站建设尚品中国网站
  • 新建网站怎么做关键词南阳手机网站制作
  • 宁波网站建设应届生公司网站备案需要每年做吗
  • 汽车设计网站论坛网站 备案
  • 网站源码带手机版展示型网站首页设计解析
  • 备案的网站名称能重复备案吗为什么打开Wordpress很慢
  • vps网站建设个人网站二级域名做淘宝客
  • 用cms织梦做网站图文教程wordpress分类文章排序
  • 台州网站策划云南招聘网
  • 网站如何设定关键词wordpress 文章关联
  • 京津冀网站建设公司建设监理工程师网站
  • 网站建设的500字小结那些网站做网批
  • 怎么做视频网站首页网站建设公司创业计划书
  • 网加思维做网站推广项目营销推广策划
  • 郫县专业的网站建设免费自己创建个人网站
  • 网站建设公司比较扑克直播软件app开发
  • 天津武清做网站如何搭建自己的微信小程序商城
  • 网站排行榜海珠商城网站建设
  • 太原自助建站怎么提高网站加载速度慢
  • 网站如何做友情链接html5 视频网站 模板
  • 沈阳做网站哪家质量好价格低东单网站建设
  • o2o网站建设如何南宁网站推广方案如何做
  • 网站部署到终端机怎么做网站建设数据库怎么弄
  • 城乡建设部官网查证如何进行网站的seo
  • 为何只有建设银行网站打不开阳江网络问政
  • 浦东做营销网站河北黄骅市网站建设
  • 青岛哪里有做网站公司的东莞东坑网站设计