|
/** * @brief ADC_Config' E: i( ^. f5 \3 a8 I" d * @note This function Configure the ADC peripheral * 1) Enable peripheral clocks * 2) Configure ADC Channel 12、8、13、9 pin as analog input$ T, ^' P) z5 ?8 j * 3) DMA2_Stream0 channel0 configuration/ g/ F3 v8 v4 G5 B- A9 F( @2 t b * 4) Configure ADC1 Channel 12、8、13、9(PC2 PC3 PB0 PB1) * @param None * @retval None; O; r: W- B9 X( I- J/ ^" U */4 k, s8 n% j6 X& w void ADC_Config()+ [" `' s% O# a+ k { GPIO_InitTypeDef GPIO_InitStruct;0 {8 e) ^5 g/ r' \1 |( G ADC_InitTypeDef ADC_InitStruct;8 F% j0 T: ]% e4 q ADC_CommonInitTypeDef ADC_CommonInitStruct; DMA_InitTypeDef DMA_InitStruct;* ?' j# A9 T- r& o. j3 t RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC, ENABLE); " {) Y0 i& }2 N( _: S RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); ADC_DeInit();) e6 C# X: ]: \+ t RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);5 M7 }: B- j8 S" e 2 v/ F) D, E2 d8 q9 H 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]);, a( r) g4 ~1 k3 A! Z DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralToMemory;0 g& E3 a3 j0 y7 e# r DMA_InitStruct.DMA_BufferSize = 40;7 Y {* G: M; [7 h0 ?. b8 ]0 ] 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;3 g/ U9 P* _5 H' s7 D/ q5 _ DMA_InitStruct.DMA_Priority = DMA_Priority_Low;7 ? }# O! l$ ^& A6 ^8 W* V DMA_InitStruct.DMA_FIFOMode = DMA_FIFOMode_Disable; p' x" X, [# `& |5 }. m7 p% q a DMA_InitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;: m1 f, X' W/ j3 e: t* ~' R5 ?. h DMA_InitStruct.DMA_MemoryBurst = DMA_MemoryBurst_Single;$ [( }1 P4 h5 v; P# ^' Y DMA_InitStruct.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream0, &DMA_InitStruct);1 X, h$ |: f! J( S% k DMA_Cmd(DMA2_Stream0, ENABLE);% D" }2 h* v1 ~ D& C DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;8 W9 n& T! ^; S: J. S NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;7 k! n' c2 T+ r NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);0 L+ S4 x# T( k- L% R /*# A8 }" G' J6 e+ \8 b& f- p# b PC2: ADC_Channel_12 --> AIW0 (0~5V)8 `* S1 N( }$ T; f: T4 U$ i! ? PB0: ADC_Channel_8 --> AIW2 (0~5V) PC3: ADC_Channel_13 --> AIW4 (0~5V) PB1: ADC_Channel_9 --> AIW6 (0~5V) */& c( W$ ~( ~; q+ _ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;; x6 { |9 e1 k2 w/ j+ A GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStruct);. F# A9 E( T2 B: m 4 i$ C Y$ m$ P GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;' F8 D& {. W8 `/ x' B GPIO_Init(GPIOC, &GPIO_InitStruct);& V8 l' |% {3 K5 g3 m /* ADC Common Init **********************************************************/& M" ?$ _2 d9 w- m9 q /* 设置ADC工作在独立模式 */( z, ~6 ]6 c, E9 u ADC_CommonInitStruct.ADC_Mode = ADC_Mode_Independent; ADC_CommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div6;6 U) |7 E6 m; j& Y ADC_CommonInitStruct.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;# @1 H) J& a/ _; } ADC_CommonInitStruct.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;5 n+ ]) |8 I: @; [ ADC_CommonInit(&ADC_CommonInitStruct);! S6 V) N2 |4 Q; ~ ' n* C$ M- N, n0 _! B$ t8 v5 j4 P: ]- B /* ADC1 Init ****************************************************************/ ADC_StructInit(&ADC_InitStruct); /* 规定AD转换工作在扫描模式,即对多个通道采样 */, v6 L' N& k# f8 h* n ADC_InitStruct.ADC_ScanConvMode = ENABLE;* |# z4 X" I$ Z$ d% s, ^$ y /* 设定AD转换在连续模式(ENABLE) 单次转换模式(DISABLE) */, C" g. m! [+ ~1 O Y0 Q$ E& ^1 @ ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; /* 不使用外部触发转换 */. N8 Y; ~1 J* A+ X6 h ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; /* 不使用外部触发转换时,该设置无效 *// R/ t$ C4 g( |7 D; i% o' { ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; /* 采集的数据在寄存器中以右对齐的方式存放 */ ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;. M+ V: h: e/ r8 i5 i' @) d /* 设定要转换的AD通道数目,这里是PC2 PC3 PB0 PB1 */: D1 r. R9 ]* r) |+ k9 @ ADC_InitStruct.ADC_NbrOfConversion = 4; ADC_Init(ADC1,&ADC_InitStruct); & L, Q0 g0 W' W /* 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 */4 Z% v0 `/ {; S9 P; h2 C ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 2, ADC_SampleTime_15Cycles);( q3 ^8 S) N" N# O& G2 h /* PC3选择Rank 3,AD转换数据传输到ADC_Value[2] --> AIW4 */( _, e) ^7 Z: y% }% e2 k/ o: r ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 3, ADC_SampleTime_15Cycles);. }) `' F+ t- R5 E /* PB1选择Rank 4,AD转换数据传输到ADC_Value[3] --> AIW6 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 4, ADC_SampleTime_15Cycles);+ g2 H. }. |: n: ~ S! x7 ~6 k& F9 v ! w# f$ \ @! T3 l /* Enable DMA request after last transfer (Single-ADC mode) */ ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);6 r6 B, i! f& o6 F0 n- W" P& E/ B ADC_DMACmd(ADC1, ENABLE); ADC_Cmd(ADC1, ENABLE);5 e: T: Z6 u" W5 v4 k$ o ADC_SoftwareStartConv(ADC1);) ~8 p, t1 d( B, Z$ } 5 p6 a! J$ U5 `! C Q, D } |
【福利三:雨露均沾·逢7狂欢】之四:用一个定时器同步另外两个定时器输出PWM
【逢7发帖赢大礼】STM32开发之WIFI实时时钟
【逢7发帖赢大礼】STM32开发之指纹识别!
【逢7发帖赢大礼】STM32开发之环境空气质量监测
【逢7发帖赢大礼】STM32开发之人体实时运动信息监测!
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
【逢7发帖赢大礼】全网最简单的Arduino_STM32开发环境搭建教程!
STM32F4中文用户手册
STM32F400、STM32F402 Cortex-M4超值单片机
SPI 高温读错最后一位?STM32F42xx 官方根治方案
微信公众号
手机版
可以声明一个数组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]3 `' U3 [' m7 b
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转换的频率。; c& s @# J2 V* [# K K0 A; [
if(Flag_ADC_Finished){
Flag_ADC_Finished = 0;# r" U @% k- y$ |
DMA2_Stream0->M0AR = (uint32_t)(&ADC_Value[0][0]);
DMA2_Stream0->NDTR = 40;
DMA_Cmd(DMA2_Stream0, ENABLE);
ADC_Cmd(ADC1, ENABLE);; ?+ e1 f1 k* z8 p7 \4 D
ADC_SoftwareStartConv(ADC1);
}