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

深圳黑马品牌网站设计百度公司是国企还是私企

深圳黑马品牌网站设计,百度公司是国企还是私企,杭州响应式网站制作,vscode创建网页目录 1:简历 2:存储器映像 3:DMA基本结构 4: DMA转运的条件 5:DMA请求 A:DMA数据转运 1:连接图 2:数据转运DMA 3:函数介绍 4:步骤 5:代码 B:DMAAD多通道 1:连接图 2:结构图 3:函数介绍 4:代码 1:简历 DMA#xff08;Direct Memory Access#xff09;直接存储…目录 1:简历 2:存储器映像 3:DMA基本结构 4: DMA转运的条件  5:DMA请求 A:DMA数据转运 1:连接图 2:数据转运DMA 3:函数介绍 4:步骤 5:代码 B:DMAAD多通道 1:连接图 2:结构图 3:函数介绍 4:代码   1:简历 DMADirect Memory Access直接存储器存取 DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输无须CPU干预节省了CPU的资源 12个独立可配置的通道 DMA17个通道 DMA25个通道 每个通道都支持软件触发和特定的硬件触发  (每隔DMA通道的触发源不一样) STM32F103C8T6 DMA资源DMA17个通道 外设(外设存储器)  :  一般是外设的数据寄存器DR , 比如ADC的数据寄存器、串口的数据寄存器等等 存储器  :  这里存储器指的就是是运行内存SRAM和程序存储器Flash ,  是我们存储变量数组和程序代码的地方 外设和存储器的数据传输---------使用特定的硬件触发(每隔DMA通道的触发源不一样) 存储器和存储器之间的数据传输------软件触发 2:存储器映像 ROM :  只读存储器是一种非易失性、掉电不丢失的存储器 RAM : 随机存储器是一种易失性、掉电丢失的存储器 因为CPU是32位的。所以导址范围就是32位的范围 3:DMA基本结构 下面的参数在配置DMA时使用 方向 : 决定了数据的方向    外设---储存器 或者 储存器----外设  或者 储存器----储存器 Flash是只读储存器,  所以在储存器---储存器的传输方向的时候 :只能选择 Flash--------------SRAM方向的传输         X.DMA_DIR指定外设站点(外设寄存器)为数据源还是目的地 传输计数器: 用来指定我总共需要转运几次的,  这个传输计数器是一个自减计数器 比如给它写一个5,   那DMA就只能进行5次数据转运 ,  转运过程中每转运一次计数器的数就会减1,   当传输计数器减到0之后DMA就不会再进行数据转运了 ,  它减到0之后之前自增的地址也会恢复到起始地址的位置 X.DMA_BufferSize传输计数器 自动重装器 :  传输计数器减到0之后 , 是否要恢复到最初的值 比如最初传输计数器给5,  如果不使用自动重装器那转运5次后DMA就结束了.   如果使用自动重装器那转运5次,  计数器减到0后就会立即重装到初始值5,  决定了转运的模式         不重装就是正常的单次模式         重装就是循环模式         X.DMA_Mode自动重装器 起始地址 : 决定了数据从那里来到那里去的 因为stm32是32位的单片机他的一个内存单元是32位的, 所以起始地址填入的都为32位 数据宽度 :  指定一次转运要按多大的数据宽度来进行 字节Byte(uint8_t)、半字HalfWord(uint16_t)和字Word(uint32_t) 软件触发和循环模式不能同时用 软件触发 : 软件触发的执行逻辑是以最快的速度连续不断地触发DMA,  早日把传输计数器清零完成这一轮的转换         软件触发就是尽快把传输计数器清零 .  循环模式是清零后自动重装 ,  如果同时用的话那DMA就停不下来了 4: DMA转运的条件  1: 开关控制DMA _Cmd函数必须使能 2: 传输计数器必须大于0 3: 触发源必须有触发信号 触发一次转运一次传输计数器自减一次 ,  当传输计数器等于0且没有自动重装时 ,   无论是否触发DMA都不会再进行转运了,   此时就需要DMA_Cmd函数给DISABLE关闭DMA.   再为传输计数器写入一个大于0的数,  再DMA_Cmd给ENABLE开启DMA才可以正常工作.         注意写传输计数器时必须要先关闭DMA再进行,   不能在DMA开启时写传输计数器 5:DMA请求 特定的硬件触发 : 每个通道的硬件触发源都是不同的 , 需要用ADC1来触发的话一那就必须选择通道1;   定时器2的更新事件来触发的话那就必须选择通道2 因为每个通道的硬件触发源都不同 ,  如果你想使用某个硬件触发源的话,  就必须使用它所在的通道 软件触发 :  使用软件触发的话那通道就可以任意选择了.  每个通道的软件触发都是一样的 A:DMA数据转运 1:连接图 2:数据转运DMA 3:函数介绍 在stm32f10x dmah文件中配置----MDA初始化 void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct); 在stm32f10x dmah文件中配置----开启MDA void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState); 在stm32f10x dmah文件中配置----数据寄存器设置 void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber);  uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx); DMA_SetCurrDataCounter : 设置当前数据寄存器 ,  就是给这个传输计数器写数据的,    和配置DMA中X.DMA_Buffersize参数相似 DMA_GetCurrDataCounter :  获取当前数据寄存器,  这个函数就是返回传输计数器的值 ,     在转运完成后把标志位值1 在stm32f10x dmah文件中配置----清除中断标志位 void DMA_ClearFlag(uint32_t DMAy_FLAG) DMA_ClearFlag : 清除中断标志位 4:步骤 1:开启RCC时钟-----DMA的时钟在AHB总线上 2:配置DMA 5:代码 使用的是存储器和存储器之间的数据传输------软件触发 #include stm32f10x.h // Device header #include Delay.h #include OLED.h #include MyDMA.h uint16_t MyDMA_Size; void MyMDA_init(uint32_t AddrA, uint32_t AddrB, uint16_t Size){MyDMA_SizeSize;//开启RCC--DMA是AHB总线的设备 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);/*我们使用的STM32型号为: STMF103参数1的第一个选择 : 互连型设备--互联型是STM23F 105/107的型号参数1的第一个选择 : 其他设备---103选择这个*///配置DMADMA_InitTypeDef DMA_initstruct;//外设备站点的3个参数//因为stm32是32位的单片机他的一个内存单元是32位的DMA_initstruct.DMA_PeripheralBaseAddrAddrA; //外设的起始地址--要求:32位DMA_initstruct.DMA_PeripheralDataSizeDMA_PeripheralDataSize_Byte;外设的数据宽度---我们选择以字节的方式传输(uint8_t)DMA_initstruct.DMA_PeripheralIncDMA_PeripheralInc_Enable;//外设的地址是否自增--自增//储存器的3个参数DMA_initstruct.DMA_MemoryBaseAddrAddrB;//储存器的起始地址--要求:32位DMA_initstruct.DMA_MemoryDataSizeDMA_MemoryDataSize_Byte;//储存器的数据宽度--我们选择以字节的方式传输(uint8_t)DMA_initstruct.DMA_MemoryIncDMA_MemoryInc_Enable;//储存器的地址是否自增--自增//传输方向DMA_initstruct.DMA_DIRDMA_DIR_PeripheralSRC;//指定外设站点(外设寄存器)为数据源还是目的地---数据源//缓冲区大小---传输计数器DMA_initstruct.DMA_BufferSizeSize;//传输几次//传输模式----是否使用自动重装DMA_initstruct.DMA_ModeDMA_Mode_Normal;//正常模式 //传输计数器到0直接停止//选择触发模式---硬件触发或者软件触发DMA_initstruct.DMA_M2MDMA_M2M_Enable; //使用软件触发//优先级DMA_initstruct.DMA_PriorityDMA_Priority_Medium;DMA_Init(DMA1_Channel1,DMA_initstruct);//开启MDADMA_Cmd(DMA1_Channel1,DISABLE);}void MyDMA_Transfer(void) {//需要给我传输寄存器重新赋值,首先要使CMD失能DMA_Cmd(DMA1_Channel1, DISABLE);/*设置当前数据寄存器 ,  就是给这个传输计数器写数据的和配置DMA中X.DMA_BufferSize参数相似*/DMA_SetCurrDataCounter(DMA1_Channel1, MyDMA_Size);DMA_Cmd(DMA1_Channel1, ENABLE);//DMA1_FLAG_TC1---转运完成标志位 转运完成后置1while (DMA_GetFlagStatus(DMA1_FLAG_TC1) RESET); DMA_ClearFlag(DMA1_FLAG_TC1);//清除转运完成标志位 }uint8_t dataA[]{0x01,0x02,0x03,0x04}; uint8_t dataB[]{0,0,0,0}; int main(void) {OLED_Init();MyMDA_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(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); } }开启RRC时钟  开启RCC--DMA是AHB总线的设备         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);     /*     我们使用的STM32型号为: STMF103     参数1的第一个选择  : 互连型设备--互联型是STM23F  105/107的型号     参数1的第一个选择  : 其他设备---103选择这个     */ 字节问题 因为要参数的数据是dataA和dataB都是uint8_t的大小,  所以在配置DMA时宽度的参数(X.DMA_PeripheralDataSize)选择DMA_PeripheralDataSize_Byte(uint8_t)         在配置DMA起始地址时选uint32_t:  因为stm32是32位的单片机他的一个内存单元是32位的 B:DMAAD多通道 1:连接图 和07:STM32----ADC模数转化器 --- B:AD多通道一致 2:结构图 3:函数介绍 在文件stm32f10x_adc.c中-----开启ADC到DMA的输出 void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState) 4:代码   在07:STM32----ADC模数转化器中    我们使用了没有使用扫描模式,  是由于ADC的数据覆盖问题,在下面的代码中我们使用DMA进行数据转运,    所以在ADC使用扫描模式的情况下必须使用DMA进行数据转运         ADC单次扫描DMA单次转运的模式 #include stm32f10x.h // Device header #include Delay.h #include OLED.h #include AD.h //ADC单次扫描DMA单次转运的模式 uint16_t AD_Value[4];void AD_init(void){//RCC开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);/*我们使用的STM32型号为: STMF103参数1的第一个选择 : 互连型设备--互联型是STM23F 105/107的型号参数1的第一个选择 : 其他设备---103选择这个*///配置ADCCLK//APB2时钟72MHz时钟信号然后通过ADC预分频器进行分频得到ADCCLK钟信号RCC_ADCCLKConfig(RCC_PCLK2_Div6);//72Mhz/612Mhz//配置GPIOGPIO_InitTypeDef GPIO_initstruct;GPIO_initstruct.GPIO_ModeGPIO_Mode_AIN; //模拟输入可以理解为ADC的专属模式GPIO_initstruct.GPIO_PinGPIO_Pin_0 |GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;GPIO_initstruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_initstruct);/*ADC_Channel_0 --通道o1----1~16的范围规则组第几个序列ADC_SampleTime_55Cycles5-----指定通道的采样时间*///选择AD转化器----我们选择规则组的输入通道 因为启动了应该组,所以是下面改为扫描模式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); //初始化ADCADC_InitTypeDef ADC_initstruct;ADC_initstruct.ADC_ContinuousConvModeDISABLE;//选择是连续转换还是单次转换---单次ADC_initstruct.ADC_DataAlignADC_DataAlign_Right; //数据对齐---右对齐ADC_initstruct.ADC_ExternalTrigConvADC_ExternalTrigConv_None;//触发控制的触发源---不使用外部触发,使用内部软件触发ADC_initstruct.ADC_ModeADC_Mode_Independent;//ADC的工作模式---独立模式ADC_initstruct.ADC_NbrOfChannel4; //通道数目--指定在扫描模式下总共会用到几个通道ADC_initstruct.ADC_ScanConvModeENABLE;//可以选择是扫描模式还是非扫描模式---扫描模式ADC_Init(ADC1,ADC_initstruct);//ADC在完成后面数据写在DR寄存器中//配置DMA//外设备站点的3个参数//因为stm32是32位的单片机他的一个内存单元是32位的DMA_InitTypeDef DMA_initstruct;DMA_initstruct.DMA_PeripheralBaseAddr(uint32_t)ADC1-DR; //外设的起始地址--要求:32位DMA_initstruct.DMA_PeripheralDataSizeDMA_PeripheralDataSize_HalfWord;外设的数据宽度---我们选择以字节的方式传输(uint16_t)DMA_initstruct.DMA_PeripheralIncDMA_PeripheralInc_Disable;//外设的地址是否自增--不自增 // //储存器的3个参数DMA_initstruct.DMA_MemoryBaseAddr(uint32_t)AD_Value;//储存器的起始地址--要求:32位DMA_initstruct.DMA_MemoryDataSizeDMA_MemoryDataSize_HalfWord;//储存器的数据宽度--我们选择以字节的方式传输(uint16_t)DMA_initstruct.DMA_MemoryIncDMA_MemoryInc_Enable;//储存器的地址是否自增--自增//传输方向DMA_initstruct.DMA_DIRDMA_DIR_PeripheralSRC;//指定外设站点(外设寄存器)为数据源还是目的地---数据源//缓冲区大小---传输计数器DMA_initstruct.DMA_BufferSize4;//传输几次//传输模式----是否使用自动重装DMA_initstruct.DMA_ModeDMA_Mode_Normal;//普通模式 //传输计数器到0直接停止 //DMA_Mode_Circular--循环模式 DMA_Mode_Normal//选择触发模式---硬件触发或者软件触发DMA_initstruct.DMA_M2MDMA_M2M_Disable; //使用硬件触发//优先级DMA_initstruct.DMA_PriorityDMA_Priority_Medium;DMA_Init(DMA1_Channel1,DMA_initstruct);//开启MDADMA_Cmd(DMA1_Channel1,ENABLE);//开启ADC到DMA的输出ADC_DMACmd(ADC1,ENABLE);//开启ADCADC_Cmd(ADC1,ENABLE);//校准ADC//复位校准ADC_ResetCalibration(ADC1);//---把CR2_RSTCAL_Set这一位置一//等待复位校准完成--ADC_GetResetCalibrationStatus作用:返回复位校准的状态while (ADC_GetResetCalibrationStatus(ADC1)SET); //SET1/*获取的是这个CR2_RSTCAL_Set的标志位 ,该位由软件设置并由硬件清除在校准寄存器被初始化后该位将被清除,所以该位的用法就是:你软件置该位为1那硬件就会开始复位校准 , 当复位校准完成后该位就会由硬件自动清0*///开始校准ADC_StartCalibration(ADC1);//获取校准状态while(ADC_GetCalibrationStatus(ADC1)SET);}void ad_getvalue(void){//重新写一下传输寄存器DMA_Cmd(DMA1_Channel1, DISABLE);/*设置当前数据寄存器 ,  就是给这个传输计数器写数据的和配置DMA中X.DMA_BufferSize参数相似*/DMA_SetCurrDataCounter(DMA1_Channel1, 4);DMA_Cmd(DMA1_Channel1, ENABLE);//单次模式-----软件触发转换ADC_SoftwareStartConvCmd(ADC1,ENABLE);//这里因为转运(DMA)总是在转换之后的//等待MDA完成的代码//DMA1_FLAG_TC1---转运完成标志位 转运完成后置1while (DMA_GetFlagStatus(DMA1_FLAG_TC1) RESET); DMA_ClearFlag(DMA1_FLAG_TC1);//清除转运完成标志位}int main(void) {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){ad_getvalue();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);Delay_ms(100);} } ad_getvalue函数 因为在这里面的ADC是单次转化,  所以每次转化时都需要软件触发一次,  每转化一次都需要调用一次这个的函数----ADC_SoftwareStartConvCmd(ADC1,ENABLE);         因为DMA也是正常的单次模式:  所以在触发ADC之前需要再重新写入一下传输计数器 //重新写一下传输寄存器DMA_Cmd(DMA1_Channel1, DISABLE);/*设置当前数据寄存器 ,  就是给这个传输计数器写数据的和配置DMA中X.DMA_BufferSize参数相似*/DMA_SetCurrDataCounter(DMA1_Channel1, 4);DMA_Cmd(DMA1_Channel1, ENABLE)         最后等待ADC转换和DMA转运完成,  这里因为转运总是在转换之后的 ,  所以我们只需要写等待DMA完成的代码, 不用写等待ADC完成的代码 //这里因为转运(DMA)总是在转换之后的//等待MDA完成的代码//DMA1_FLAG_TC1---转运完成标志位 转运完成后置1while (DMA_GetFlagStatus(DMA1_FLAG_TC1) RESET); DMA_ClearFlag(DMA1_FLAG_TC1);//清除转运完成标志位 启动扫描模式 就是在选择组的时候多选几个,然后在配置ADC的时候选择扫描模式,  通道要和一引脚对应.  ADC配置的通道数目填入相应的通道数目 /*ADC_Channel_0 --通道o1----1~16的范围规则组第几个序列ADC_SampleTime_55Cycles5-----指定通道的采样时间*///选择AD转化器----我们选择规则组的输入通道 因为启动了应该组,所以是下面改为扫描模式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_initstruct.ADC_ScanConvModeENABLE;//可以选择是扫描模式还是非扫描模式---扫描模式ADC_initstruct.ADC_NbrOfChannel4; //通道数目--指定在扫描模式下总共会用到几个通道 DR寄存器 在ADC会把数据写入到ADC的DR寄存器中,  使用在配置DMA的外设起始地址应该是 DMA_initstruct.DMA_PeripheralBaseAddr(uint32_t)ADC1-DR; //外设的起始地址--要求:32位数据源外设地址不自增,  寄存器地址自增 在这里外面使用的ADC模式为扫描模式,  就是启动了一个组在组中写通道,   如果地址自增就会跑到其他的组中去.        寄存器地址自增 : 外设中组中通道的每个数据对应的是寄存器中不同的地方,  这样才可以实现数据的转移 其他注意 在开启ADC前: 要打开ADC到DMA的输出 DMA_Cmd(DMA1_Channel1,ENABLE);         在配置DMA的传输计数器是也要改变为相应的传输次数 DMA_initstruct.DMA_BufferSize4;//传输几次配置DMA的触发方式改为硬件触发 DMA_initstruct.DMA_M2MDMA_M2M_Disable; //使用硬件触发ADC连续扫描DMA循环转运模式 因为使用的是连续---所以软件触发只需在初始化的时候触发一次即可.          当ADC触发之后ADC连续转换DMA循环转运 ,  两者一直在工作始终把最新的转换结果刷新到SRAM数组里,   我们想要数据的时候随时去数组里取就行了 #include stm32f10x.h // Device header #include Delay.h #include OLED.h #include AD.h uint16_t AD_Value[4];void AD_init(void){//RCC开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);/*我们使用的STM32型号为: STMF103参数1的第一个选择 : 互连型设备--互联型是STM23F 105/107的型号参数1的第一个选择 : 其他设备---103选择这个*///配置ADCCLK//APB2时钟72MHz时钟信号然后通过ADC预分频器进行分频得到ADCCLK钟信号RCC_ADCCLKConfig(RCC_PCLK2_Div6);//72Mhz/612Mhz//配置GPIOGPIO_InitTypeDef GPIO_initstruct;GPIO_initstruct.GPIO_ModeGPIO_Mode_AIN; //模拟输入可以理解为ADC的专属模式GPIO_initstruct.GPIO_PinGPIO_Pin_0 |GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;GPIO_initstruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_initstruct);/*ADC_Channel_0 --通道o1----1~16的范围规则组第几个序列ADC_SampleTime_55Cycles5-----指定通道的采样时间*///选择AD转化器----我们选择规则组的输入通道 因为启动了应该组,所以是下面改为扫描模式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); //初始化ADCADC_InitTypeDef ADC_initstruct;ADC_initstruct.ADC_ContinuousConvModeENABLE;//选择是连续转换还是单次转换--连续ADC_initstruct.ADC_DataAlignADC_DataAlign_Right; //数据对齐---右对齐ADC_initstruct.ADC_ExternalTrigConvADC_ExternalTrigConv_None;//触发控制的触发源---不使用外部触发,使用内部软件触发ADC_initstruct.ADC_ModeADC_Mode_Independent;//ADC的工作模式---独立模式ADC_initstruct.ADC_NbrOfChannel4; //通道数目--指定在扫描模式下总共会用到几个通道ADC_initstruct.ADC_ScanConvModeENABLE;//可以选择是扫描模式还是非扫描模式---扫描模式ADC_Init(ADC1,ADC_initstruct);//ADC在完成后面数据写在DR寄存器中//配置DMA//外设备站点的3个参数//因为stm32是32位的单片机他的一个内存单元是32位的DMA_InitTypeDef DMA_initstruct;DMA_initstruct.DMA_PeripheralBaseAddr(uint32_t)ADC1-DR; //外设的起始地址--要求:32位DMA_initstruct.DMA_PeripheralDataSizeDMA_PeripheralDataSize_HalfWord;外设的数据宽度---我们选择以字节的方式传输(uint16_t)DMA_initstruct.DMA_PeripheralIncDMA_PeripheralInc_Disable;//外设的地址是否自增--不自增 // //储存器的3个参数DMA_initstruct.DMA_MemoryBaseAddr(uint32_t)AD_Value;//储存器的起始地址--要求:32位DMA_initstruct.DMA_MemoryDataSizeDMA_MemoryDataSize_HalfWord;//储存器的数据宽度--我们选择以字节的方式传输(uint16_t)DMA_initstruct.DMA_MemoryIncDMA_MemoryInc_Enable;//储存器的地址是否自增--自增//传输方向DMA_initstruct.DMA_DIRDMA_DIR_PeripheralSRC;//指定外设站点(外设寄存器)为数据源还是目的地---数据源//缓冲区大小---传输计数器DMA_initstruct.DMA_BufferSize4;//传输几次//传输模式----是否使用自动重装DMA_initstruct.DMA_ModeDMA_Mode_Circular;//循环模式 //传输计数器到0直接停止 //DMA_Mode_Circular--循环模式 DMA_Mode_Normal//选择触发模式---硬件触发或者软件触发DMA_initstruct.DMA_M2MDMA_M2M_Disable; //使用硬件触发//优先级DMA_initstruct.DMA_PriorityDMA_Priority_Medium;DMA_Init(DMA1_Channel1,DMA_initstruct);//开启MDADMA_Cmd(DMA1_Channel1,ENABLE);//开启ADC到DMA的输出ADC_DMACmd(ADC1,ENABLE);//开启ADCADC_Cmd(ADC1,ENABLE);//校准ADC//复位校准ADC_ResetCalibration(ADC1);//---把CR2_RSTCAL_Set这一位置一//等待复位校准完成--ADC_GetResetCalibrationStatus作用:返回复位校准的状态while (ADC_GetResetCalibrationStatus(ADC1)SET); //SET1/*获取的是这个CR2_RSTCAL_Set的标志位 ,该位由软件设置并由硬件清除在校准寄存器被初始化后该位将被清除,所以该位的用法就是:你软件置该位为1那硬件就会开始复位校准 , 当复位校准完成后该位就会由硬件自动清0*///开始校准ADC_StartCalibration(ADC1);//获取校准状态while(ADC_GetCalibrationStatus(ADC1)SET);ADC_SoftwareStartConvCmd(ADC1,ENABLE);}int main(void) {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);Delay_ms(100);} }
http://www.dnsts.com.cn/news/46980.html

相关文章:

  • 网站自动适应屏幕网站建设源程序
  • 东莞网站建设平台优化关键词排名提升
  • 扬州网页制作公司深圳知名网络优化公司
  • 前期做网站宣传费用怎样做账second是什么意思
  • 湘潭营销型网站建设网站的建设的公司出名
  • wordpress两个站点网站上线 备案
  • 湖北省建设用地预审网站wordpress主题图片替换
  • 郑州网站建设技术方案杭州seo网
  • 公司网站上的员工风采怎么做网站app在线制作
  • 莱芜正规的网站建设为什么要做企业网站
  • 肥城网站建设互联网公司排名100强湖
  • 仿珠宝首饰网站开发电子产品网站建设
  • 网站建设与管理案例教程第三版课后答案手机创建网站免费注册
  • 燕窝网站怎么做宁波制作网站软件
  • 做网站的市场前景网站建设英文术语
  • 河南移动商城网站建设企业管理咨询服务内容
  • 给你一个网站你怎么做蜜桃传奇免费网页版
  • 做淘客需要网站免费网站建设专业服务平台
  • 灰产项目网seo海外推广
  • 高端品牌网站设计电话东莞建筑
  • 网站做多宽wordpress设计幻灯片
  • 普陀网站建设比较实惠外包网
  • 企业门户网站模板分享建立网站用英语
  • 校内网站建设与维护小程序源码php
  • 伊春网站推广做外贸的网站域名怎么买
  • 门店管理网站建设楚雄企业网站建设公司
  • 做烘焙的网站国外室内设计网站推荐
  • 交互式网站设计 深圳网站开发行业工作交接交接哪些
  • 绿色网站设计wordpress授权插件
  • wapcms建站系统网站维护公司广州