|
/** * @brief ADC_Config * @note This function Configure the ADC peripheral * 1) Enable peripheral clocks * 2) Configure ADC Channel 12、8、13、9 pin as analog input * 3) DMA2_Stream0 channel0 configuration * 4) Configure ADC1 Channel 12、8、13、9(PC2 PC3 PB0 PB1) * @param None * @retval None */ void ADC_Config() { GPIO_InitTypeDef GPIO_InitStruct; ADC_InitTypeDef ADC_InitStruct; ADC_CommonInitTypeDef ADC_CommonInitStruct; DMA_InitTypeDef DMA_InitStruct; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); ADC_DeInit(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); DMA_InitStruct.DMA_Channel = DMA_Channel_0; DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)(&ADC1->DR); DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)(&ADC_Value[0][0]); DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStruct.DMA_BufferSize = 40; DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStruct.DMA_Mode = DMA_Mode_Circular; DMA_InitStruct.DMA_Priority = DMA_Priority_Low; DMA_InitStruct.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStruct.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStruct.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream0, &DMA_InitStruct); DMA_Cmd(DMA2_Stream0, ENABLE); DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* PC2: ADC_Channel_12 --> AIW0 (0~5V) PB0: ADC_Channel_8 --> AIW2 (0~5V) PC3: ADC_Channel_13 --> AIW4 (0~5V) PB1: ADC_Channel_9 --> AIW6 (0~5V) */ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_Init(GPIOC, &GPIO_InitStruct); /* ADC Common Init **********************************************************/ /* 设置ADC工作在独立模式 */ ADC_CommonInitStruct.ADC_Mode = ADC_Mode_Independent; ADC_CommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div6; ADC_CommonInitStruct.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; ADC_CommonInitStruct.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStruct); /* ADC1 Init ****************************************************************/ ADC_StructInit(&ADC_InitStruct); /* 规定AD转换工作在扫描模式,即对多个通道采样 */ ADC_InitStruct.ADC_ScanConvMode = ENABLE; /* 设定AD转换在连续模式(ENABLE) 单次转换模式(DISABLE) */ ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; /* 不使用外部触发转换 */ ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; /* 不使用外部触发转换时,该设置无效 */ ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; /* 采集的数据在寄存器中以右对齐的方式存放 */ ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; /* 设定要转换的AD通道数目,这里是PC2 PC3 PB0 PB1 */ ADC_InitStruct.ADC_NbrOfConversion = 4; ADC_Init(ADC1,&ADC_InitStruct); /* PC2选择Rank 1,AD转换数据传输到ADC_Value[0] --> AIW0 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 1, ADC_SampleTime_15Cycles); /* PB0选择Rank 2,AD转换数据传输到ADC_Value[1] --> AIW2 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 2, ADC_SampleTime_15Cycles); /* PC3选择Rank 3,AD转换数据传输到ADC_Value[2] --> AIW4 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 3, ADC_SampleTime_15Cycles); /* PB1选择Rank 4,AD转换数据传输到ADC_Value[3] --> AIW6 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 4, ADC_SampleTime_15Cycles); /* Enable DMA request after last transfer (Single-ADC mode) */ ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE); ADC_DMACmd(ADC1, ENABLE); ADC_Cmd(ADC1, ENABLE); ADC_SoftwareStartConv(ADC1); } |
F429I-DISC1体验报告(4) 温度可视化动态图表的实现丨国庆开发板测评活动
STM32串口自动识别波特率的原理
STM32应用过程中与电源相关的案例分享
【经验分享】STM32F4 CAN2只能发送无法接收问题解决
F429I-DISC1体验报告(3) 画板线条绘制和调色功能的实现丨国庆开发板测评活动
F429I-DISC1体验报告(2) 按钮和弹窗GUI的简单交互设计丨国庆开发板测评活动
STM32固件库分享,超全系列整理
STM32系列芯片之间相互移植注意事项
使用 U 盘更新 STM32F4DISCOVERY 板固件
STM32如何成为现代科技的隐形引擎
微信公众号
手机版
可以声明一个数组ADC_Value[10][4];
DMA_InitStruct.DMA_BufferSize = 4; 改为
DMA_InitStruct.DMA_BufferSize = 40;
这样 PC2 PB0 PC3 PB1 采集到的数据依次放在
ADC_Value[0][0]、ADC_Value[0][1]、ADC_Value[0][2]、ADC_Value[0][3]
ADC_Value[1][0]、ADC_Value[1][1]、ADC_Value[1][2]、ADC_Value[1][3]
....
ADC_Value[8][0]、ADC_Value[8][1]、ADC_Value[8][2]、ADC_Value[8][3]ADC_Value[9][0]、ADC_Value[9][1]、ADC_Value[9][2]、ADC_Value[9][3]
可以重新设置DMA传输的地址和传输数目,重新启动ADC转换,这样能控制ADC转换的频率。
if(Flag_ADC_Finished){
Flag_ADC_Finished = 0;
DMA2_Stream0->M0AR = (uint32_t)(&ADC_Value[0][0]);
DMA2_Stream0->NDTR = 40;
DMA_Cmd(DMA2_Stream0, ENABLE);
ADC_Cmd(ADC1, ENABLE);
ADC_SoftwareStartConv(ADC1);
}