北京做兼职的网站页游大全

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

北京做兼职的网站,页游大全,惠州做网络推广的,厦门哪些企业做视频网站的文章目录

  1. DMA数据转运 1.1 初始化DMA步骤 1.2 DMA的库函数 1.3 设置当前数据寄存器 1.4 DMA获取当前数据寄存器
  2. DMA数据转运 2.1 DMA.C 2.2 DMA.H 2.3 MAIN.C
  3. DMAAD多通道 3.1 AD.C 3.2 AD.H 3.3 MAIN.C 1. DMA数据转运 对于DMA的详细解析可以看下面这篇…文章目录 1. DMA数据转运 1.1 初始化DMA步骤 1.2 DMA的库函数 1.3 设置当前数据寄存器 1.4 DMA获取当前数据寄存器
  4. DMA数据转运 2.1 DMA.C 2.2 DMA.H 2.3 MAIN.C
  5. DMAAD多通道 3.1 AD.C 3.2 AD.H 3.3 MAIN.C 1. DMA数据转运 对于DMA的详细解析可以看下面这篇文章 STM32单片机DMA存储器详解-CSDN博客 1.1 初始化DMA步骤 第一步RCC开启DMA的时钟, AHB总线的设备 第二步直接调用DMA_Init初始化配置的参数包括外设和存储器站点的起始地址、数据宽度、地址是否自增、方向、传输计数器、是否需要自动重装、选择触发源、通道优先级 第三步DMA_Cmd给指定通道使能如果使用的是硬件触发要在对应外设调用XXX_DMACmd开启一下触发信号的输出需要DMA的中断就调用DMA_ITConfig开启中断输出再在NVIC中配置相应的中断通道然后写中断函数就行了如果传输计数器清0再想给传输计数器赋值就DMA失能、写传输计数器、DMA使能就可以了 1.2 DMA的库函数 在stm32f10x_dma.h文件中可以找到对应的库函数。 恢复缺省配置 void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx); 初始化 void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDefDMA_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); 1.3 设置当前数据寄存器 给传输计数器写数据的 void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber); 1.4 DMA获取当前数据寄存器 返回传输计数器的值 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. DMA数据转运 这个代码实现了DMA数据转运将DATA A的数据转运给data B。 2.1 DMA.C #include stm32f10x.h // Device headeruint16_t MyDMA_Size; //定义全局变量用于记住Init函数的Size供Transfer函数使用//DMA初始化void MyDMA_Init(uint32_t AddrA, uint32_t AddrB, uint16_t Size) {MyDMA_Size Size; //将Size写入到全局变量记住参数Size/开启时钟/RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //开启DMA的时钟/DMA初始化/DMA_InitTypeDef DMA_InitStructure; //定义结构体变量DMA_InitStructure.DMA_PeripheralBaseAddr AddrA; //外设基地址给定形参AddrADMA_InitStructure.DMA_PeripheralDataSize DMA_PeripheralDataSize_Byte; //外设数据宽度选择字节DMA_InitStructure.DMA_PeripheralInc DMA_PeripheralInc_Enable; //外设地址自增选择使能DMA_InitStructure.DMA_MemoryBaseAddr AddrB; //存储器基地址给定形参AddrBDMA_InitStructure.DMA_MemoryDataSize DMA_MemoryDataSize_Byte; //存储器数据宽度选择字节DMA_InitStructure.DMA_MemoryInc DMA_MemoryInc_Enable; //存储器地址自增选择使能DMA_InitStructure.DMA_DIR DMA_DIR_PeripheralSRC; //数据传输方向选择由外设到存储器DMA_InitStructure.DMA_BufferSize Size; //转运的数据大小转运次数DMA_InitStructure.DMA_Mode DMA_Mode_Normal; //模式选择正常模式DMA_InitStructure.DMA_M2M DMA_M2M_Enable; //存储器到存储器选择使能DMA_InitStructure.DMA_Priority DMA_Priority_Medium; //优先级选择中等DMA_Init(DMA1_Channel1, DMA_InitStructure); //将结构体变量交给DMA_Init配置DMA1的通道1/DMA使能/DMA_Cmd(DMA1_Channel1, DISABLE); //这里先不给使能初始化后不会立刻工作等后续调用Transfer后再开始 }//启动DMA数据转运void MyDMA_Transfer(void) {DMA_Cmd(DMA1_Channel1, DISABLE); //DMA失能在写入传输计数器之前需要DMA暂停工作DMA_SetCurrDataCounter(DMA1_Channel1, MyDMA_Size); //写入传输计数器指定将要转运的次数DMA_Cmd(DMA1_Channel1, ENABLE); //DMA使能开始工作while (DMA_GetFlagStatus(DMA1_FLAG_TC1) RESET); //等待DMA工作完成DMA_ClearFlag(DMA1_FLAG_TC1); //清除工作完成标志位 }2.2 DMA.H #ifndef __MYDMA_H #define __MYDMA_Hvoid MyDMA_Init(uint32_t AddrA, uint32_t AddrB, uint16_t Size); void MyDMA_Transfer(void);#endif2.3 MAIN.C #include stm32f10x.h // Device header #include Delay.h #include OLED.h #include MyDMA.huint8_t DataA[] {0x01, 0x02, 0x03, 0x04}; //定义测试数组DataA为数据源 uint8_t DataB[] {0, 0, 0, 0}; //定义测试数组DataB为数据目的地int main(void) {/模块初始化/OLED_Init(); //OLED初始化MyDMA_Init((uint32_t)DataA, (uint32_t)DataB, 4); //DMA初始化把源数组和目的数组的地址传入/显示静态字符串/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); //显示数组DataAOLED_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); //显示数组DataBOLED_ShowHexNum(4, 4, DataB[1], 2);OLED_ShowHexNum(4, 7, DataB[2], 2);OLED_ShowHexNum(4, 10, DataB[3], 2);Delay_ms(1000); //延时1s观察转运前的现象MyDMA_Transfer(); //使用DMA转运数组从DataA转运到DataBOLED_ShowHexNum(2, 1, DataA[0], 2); //显示数组DataAOLED_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); //显示数组DataBOLED_ShowHexNum(4, 4, DataB[1], 2);OLED_ShowHexNum(4, 7, DataB[2], 2);OLED_ShowHexNum(4, 10, DataB[3], 2);Delay_ms(1000); //延时1s观察转运后的现象} }3. DMAAD多通道 这个代码实现了ADC检测多通道数据然后再进行DMA转运。 3.1 AD.C #include stm32f10x.h // Device headeruint16_t AD_Value[4]; //定义用于存放AD转换结果的全局数组/]AD初始化void AD_Init(void) {/开启时钟/RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //开启ADC1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //开启DMA1的时钟/设置ADC时钟/RCC_ADCCLKConfig(RCC_PCLK2_Div6); //选择时钟6分频ADCCLK 72MHz / 6 12MHz/GPIO初始化/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure); //将PA0、PA1、PA2和PA3引脚初始化为模拟输入/规则组通道配置/ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //规则组序列1的位置配置为通道0ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); //规则组序列2的位置配置为通道1ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5); //规则组序列3的位置配置为通道2ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5); //规则组序列4的位置配置为通道3/ADC初始化/ADC_InitTypeDef ADC_InitStructure; //定义结构体变量ADC_InitStructure.ADC_Mode ADC_Mode_Independent; //模式选择独立模式即单独使用ADC1ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; //数据对齐选择右对齐ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_None; //外部触发使用软件触发不需要外部触发ADC_InitStructure.ADC_ContinuousConvMode ENABLE; //连续转换使能每转换一次规则组序列后立刻开始下一次转换ADC_InitStructure.ADC_ScanConvMode ENABLE; //扫描模式使能扫描规则组的序列扫描数量由ADC_NbrOfChannel确定ADC_InitStructure.ADC_NbrOfChannel 4; //通道数为4扫描规则组的前4个通道ADC_Init(ADC1, ADC_InitStructure); //将结构体变量交给ADC_Init配置ADC1/DMA初始化/DMA_InitTypeDef DMA_InitStructure; //定义结构体变量DMA_InitStructure.DMA_PeripheralBaseAddr (uint32_t)ADC1-DR; //外设基地址给定形参AddrADMA_InitStructure.DMA_PeripheralDataSize DMA_PeripheralDataSize_HalfWord; //外设数据宽度选择半字对应16为的ADC数据寄存器DMA_InitStructure.DMA_PeripheralInc DMA_PeripheralInc_Disable; //外设地址自增选择失能始终以ADC数据寄存器为源DMA_InitStructure.DMA_MemoryBaseAddr (uint32_t)AD_Value; //存储器基地址给定存放AD转换结果的全局数组AD_ValueDMA_InitStructure.DMA_MemoryDataSize DMA_MemoryDataSize_HalfWord; //存储器数据宽度选择半字与源数据宽度对应DMA_InitStructure.DMA_MemoryInc DMA_MemoryInc_Enable; //存储器地址自增选择使能每次转运后数组移到下一个位置DMA_InitStructure.DMA_DIR DMA_DIR_PeripheralSRC; //数据传输方向选择由外设到存储器ADC数据寄存器转到数组DMA_InitStructure.DMA_BufferSize 4; //转运的数据大小转运次数与ADC通道数一致DMA_InitStructure.DMA_Mode DMA_Mode_Circular; //模式选择循环模式与ADC的连续转换一致DMA_InitStructure.DMA_M2M DMA_M2M_Disable; //存储器到存储器选择失能数据由ADC外设触发转运到存储器DMA_InitStructure.DMA_Priority DMA_Priority_Medium; //优先级选择中等DMA_Init(DMA1_Channel1, DMA_InitStructure); //将结构体变量交给DMA_Init配置DMA1的通道1/DMA和ADC使能/DMA_Cmd(DMA1_Channel1, ENABLE); //DMA1的通道1使能ADC_DMACmd(ADC1, ENABLE); //ADC1触发DMA1的信号使能ADC_Cmd(ADC1, ENABLE); //ADC1使能/ADC校准/ADC_ResetCalibration(ADC1); //固定流程内部有电路会自动执行校准while (ADC_GetResetCalibrationStatus(ADC1) SET);ADC_StartCalibration(ADC1);while (ADC_GetCalibrationStatus(ADC1) SET);/ADC触发/ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件触发ADC开始工作由于ADC处于连续转换模式故触发一次后ADC就可以一直连续不断地工作 }3.2 AD.H #ifndef __AD_H #define __AD_Hextern uint16_t AD_Value[4];void AD_Init(void);#endif3.3 MAIN.C #include stm32f10x.h // Device header #include Delay.h #include OLED.h #include AD.hint main(void) {/模块初始化/OLED_Init(); //OLED初始化AD_Init(); //AD初始化/显示静态字符串/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); //显示转换结果第0个数据OLED_ShowNum(2, 5, AD_Value[1], 4); //显示转换结果第1个数据OLED_ShowNum(3, 5, AD_Value[2], 4); //显示转换结果第2个数据OLED_ShowNum(4, 5, AD_Value[3], 4); //显示转换结果第3个数据Delay_ms(100); //延时100ms手动增加一些转换的间隔时间} }