中低端网站建设客户网Wordpress翻译文章
2026/4/18 1:22:40 网站建设 项目流程
中低端网站建设客户网,Wordpress翻译文章,浙江省工程建设信息网,网站建设的设备1.DMA简介注意#xff1a;存储器到存储器的数据转运一般使用软件触发#xff1b;外设到存储器的数据转运一般使用硬件触发2.STM32的存储器映像内核外设是NVIC和SysTick3.DWA大致的内部结构整体结构就是CPU存储器组成的#xff0c;寄存器是连接软件和硬件的桥梁细节#xff…1.DMA简介注意存储器到存储器的数据转运一般使用软件触发外设到存储器的数据转运一般使用硬件触发2.STM32的存储器映像内核外设是NVIC和SysTick3.DWA大致的内部结构整体结构就是CPU存储器组成的寄存器是连接软件和硬件的桥梁细节1.DCode专门访问Flash系统总线访问其他东西2.仲裁器虽然多个通道可以独立转运数据但是DMA总线只有一条所有通道只能分时复用这一条总线此时仲裁器就会根据优先级来分出使用顺序。3.AHB从设备DMA自身的寄存器CPU通过其可以配置DMA4.DMA请求用于硬件触发DMA数据转运就是DMA的硬件触发源触发DMA转运数据5.这里的Flash是只读的不能通过总线访问SRAM是运行内存可以正常读写。4.DMA基本结构具体1.传输计数器自减计数器指定转运次数注意写传输计数器时必须先关闭DMA2.自动重装器决定是模式单次模式不重装即不会回到原来的次数还是循环模式重装即会回到原来的次数3.触发控制由M2M参数决定为1时DMA选择软件触发连续触发DMA尽早将计数器清零不能与循环模式同时使用一般用于存储器到存储器的转运为0时DMA选择硬件触发触发源可以为ADC、串口、定时器等一般都与外设有关5.细节1.DMA请求M2M数据选择器的控制位EN开关控制为0时不工作为1时工作注意使用某个硬件触发源的话就必须使用它所在的通道而软件触发可以任意选择选择哪个硬件触发源取决于哪个外设的DMA输出开启了2.数据宽度与对齐存在原因数据转运的两个站点的数据宽度可能会不一样1.如果目标的数据宽度比源端的数据宽度大那就在目标数据前面补02.如果目标的数据宽度比源端的数据宽度小就把多出来的高位舍弃掉3.例子1.数据转运DMA数组间的数据转运相当于复制2.ADC扫描模式DMA6.实战代码1.部分函数功能//DMA初始化 void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx); void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct); void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct); void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState);//输出使能 void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState); //中断输出使能 //设置数据寄存器给传输数据寄存器写入转运次数 void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber); //获取当前数据寄存器的值剩余的转运次数 uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx); FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG);//获取标志位状态 void DMA_ClearFlag(uint32_t DMAy_FLAG);//清除标志位 ITStatus DMA_GetITStatus(uint32_t DMAy_IT);//获取中断状态 void DMA_ClearITPendingBit(uint32_t DMAy_IT);//清除中断挂起位2.配置思路1.RCC开启时钟把DMA的时钟打开2.DMA初始化外设和存储器站点的起始地址、数据宽度、地址是否自增、传输计数器等3.打开DMA用DMA_Cmd使能注意如果使用的是硬件触发要开启对应的外设的触发信号的输出如果需要DMA中断就调用DMA_ITConfig来开启中断输出3.基本配置格式//DMA数据转运 void MyDMA_Init(uint32_t AddrA,uint32_t AddrB,uint16_t Size) { MyDMA_SizeSize; //开启DMA的时钟DMA是AHB总线上的设备 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //初始化DMA DMA_InitTypeDef DMA_InitStructure; DMA_InitStructure.DMA_PeripheralBaseAddrAddrA;//外设站点的起始地址 DMA_InitStructure.DMA_PeripheralDataSizeDMA_PeripheralDataSize_Byte;//数据宽度 DMA_InitStructure.DMA_PeripheralIncDMA_PeripheralInc_Enable;//是否自增此处自增 DMA_InitStructure.DMA_MemoryBaseAddrAddrB;//存储器站点起始地址 DMA_InitStructure.DMA_MemoryDataSizeDMA_MemoryDataSize_Byte;//数据宽度 DMA_InitStructure.DMA_MemoryIncDMA_MemoryInc_Enable;//是否自增此处自增 DMA_InitStructure.DMA_DIRDMA_DIR_PeripheralSRC;//传输方向外设站点作为数据源 DMA_InitStructure.DMA_BufferSizeSize;//传输计数器 DMA_InitStructure.DMA_ModeDMA_Mode_Normal;//传输模式是否重装此处不重装 DMA_InitStructure.DMA_M2MDMA_M2M_Enable;//软件触发还是硬件触发此处为软件触发 DMA_InitStructure.DMA_PriorityDMA_Priority_Medium;//优先级此处中等优先级 DMA_Init(DMA1_Channel1,DMA_InitStructure); DMA_Cmd(DMA1_Channel1,ENABLE); } //DMA传输函数调用一次就在进行一次DMA转运 //手动实现多次转运也可以通过重装实现但是软件触发和重装不能同时使用 void MyDMA_Transfer(void) { //重新给计数器赋值 DMA_Cmd(DMA1_Channel1,DISABLE);//DMA失能 DMA_SetCurrDataCounter(DMA1_Channel1,MyDMA_Size); DMA_Cmd(DMA1_Channel1,ENABLE);//重新使能 while(DMA_GetFlagStatus(DMA1_FLAG_TC1)RESET);//等待标志位 DMA_ClearFlag(DMA1_FLAG_TC1);//手动清除标志位 } //DMAAD多通道AD扫描模式下需要DMA转运数据 //此处配置为ADC单次扫描模式DMA单次转运 //注意当模式配置成ADC连续扫描DMA循环转运模式时可以去掉AD_GetValue函数然后在ADC校准完成后软件触发一次ADC即可实现连续转换循环转运 uint16_t AD_Value[4]; void AD_Init(void) { //ADC都是APB2上的设备 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//开启ADC1的时钟 //需要用到PA0口将可调的电压输出 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //开启DMA的时钟DMA是AHB总线上的设备 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //配置ADCCLK RCC_ADCCLKConfig(RCC_PCLK2_Div6); //配置GPIO时钟 GPIO_InitTypeDef GPIO_InitStructure;//结构体定义 GPIO_InitStructure.GPIO_ModeGPIO_Mode_AIN; //模拟输入GPIO无效即为ADC专属模式 GPIO_InitStructure.GPIO_PinGPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//IO口 GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz; GPIO_Init(GPIOA,GPIO_InitStructure); //选择规则组的输入通道 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_ModeADC_Mode_Independent;//ADC模式独立还是双模式 ADC_InitStructure.ADC_DataAlignADC_DataAlign_Right;//数据对齐 ADC_InitStructure.ADC_ExternalTrigConvADC_ExternalTrigConv_None; //外部触发转换选择触发源此处为软件触发 ADC_InitStructure.ADC_ContinuousConvModeDISABLE;//连续转换还是单次转换模式 ADC_InitStructure.ADC_ScanConvModeENABLE;//扫描还是非扫描模式此处为扫描模式 ADC_InitStructure.ADC_NbrOfChannel1; //扫描模式下总工会用到的通道数 ADC_Init(ADC1,ADC_InitStructure); //初始化DMAADC扫描模式和DNA组合下的配置 DMA_InitTypeDef DMA_InitStructure; DMA_InitStructure.DMA_PeripheralBaseAddr(uint32_t)ADC1-DR;//外设站点的起始地址 DMA_InitStructure.DMA_PeripheralDataSizeDMA_PeripheralDataSize_HalfWord;//数据宽度 DMA_InitStructure.DMA_PeripheralIncDMA_PeripheralInc_Disable;//是否自增此处不自增 DMA_InitStructure.DMA_MemoryBaseAddr(uint32_t)AD_Value;//存储器站点起始地址 DMA_InitStructure.DMA_MemoryDataSizeDMA_MemoryDataSize_HalfWord;//数据宽度 DMA_InitStructure.DMA_MemoryIncDMA_MemoryInc_Enable;//是否自增此处自增 DMA_InitStructure.DMA_DIRDMA_DIR_PeripheralSRC;//传输方向外设站点作为数据源 DMA_InitStructure.DMA_BufferSize4;//传输计数器 DMA_InitStructure.DMA_ModeDMA_Mode_Normal;//传输模式是否重装此处不重装 DMA_InitStructure.DMA_M2MDMA_M2M_Disable;//软件触发还是硬件触发此处为软件触发 DMA_InitStructure.DMA_PriorityDMA_Priority_Medium;//优先级此处中等优先级 DMA_Init(DMA1_Channel1,DMA_InitStructure); DMA_Cmd(DMA1_Channel1,ENABLE); //开启ADC到DMA的输出 ADC_DMACmd(ADC1,ENABLE); ADC_Cmd(ADC1,ENABLE);//开启ADC //校准 ADC_ResetCalibration(ADC1);//复位校准 while(ADC_GetResetCalibrationStatus(ADC1)SET);//获取复位校准状态 ADC_StartCalibration(ADC1);//开始校准 while(ADC_GetCalibrationStatus(ADC1)SET);//获取开始校准状态 } //转换过程 void AD_GetValue(void) { DMA_Cmd(DMA1_Channel1,DISABLE);//DMA失能 DMA_SetCurrDataCounter(DMA1_Channel1,4); DMA_Cmd(DMA1_Channel1,ENABLE);//重新使能 ADC_SoftwareStartConvCmd(ADC1,ENABLE);//开启软件触发单次模式下每次都要触发一下 //因为转运总在转换之后所以直接等待转运完成即可 while(DMA_GetFlagStatus(DMA1_FLAG_TC1)RESET);//等待标志位 DMA_ClearFlag(DMA1_FLAG_TC1);//手动清除标志位 }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询