|
* u( o: M& N/ M, U. z0 b 第一种(DMA + 规则) RCC_ADCCLKConfig(RCC_PCLK2_Div6); /*72Mhz/6 = 12Mhz*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 | RCC_AHBPeriph_DMA2, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; G5 Z* N0 E' p6 G& r- q+ s GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; 0 C2 L8 K4 ?9 q. `" \3 p0 X1 U+ G GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); //DMA Config DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = 0x4001244C; //ADC1的DR地址 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)hwAdc_Converted_Value; //不加&应该也可以 数组名 代表地址2 Z5 R8 `2 C) d1 e DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//外设向内存传数据 DMA_InitStructure.DMA_BufferSize = DMA_N * DMA_C; //DMA缓存大小 //64 * 4 DMA_InitStructure.DMA_PeripheralInc = DMA_MemoryInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //目标内存地址自动后移 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//DMA传送数据尺寸16位 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//常用循环缓存模式4 Q0 g9 {. G3 D2 l8 Y$ m DMA_InitStructure.DMA_Priority = DMA_Priority_High;! j4 j4 [& l# A3 T7 D DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//禁止内存到内存模式+ ^! O! |& y, S DMA_Init(DMA1_Channel1, &DMA_InitStructure);% t; J* G1 c- { DMA_Cmd(DMA1_Channel1, ENABLE); ) p( x5 t( i$ Y& L //ADC Config ADC_InitTypeDef ADC_InitStructure;$ O9 i& @3 L- I! Y ADC_DeInit(ADC1);5 c; p* s, @/ B1 i4 ]; u- A ADC_StructInit(&ADC_InitStructure); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;. B6 O4 d2 @' v/ D2 L# U! K& J ADC_InitStructure.ADC_ScanConvMode = ENABLE; //!!6 y* @+ L5 s% t, Q: R& r5 Z; n- j ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //!!9 _' i7 w( M" d5 O# s ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;0 G$ J2 e# F$ p" \0 s ADC_InitStructure.ADC_NbrOfChannel = DMA_C; //4 ADC_Init(ADC1, &ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); //9Mhz/(239.5 + 12.5) = 35.7Khz2 A; {" E6 y( A- ? ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5); //9Mhz/(239.5 + 12.5) = 35.7Khz ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5); //9Mhz/(239.5 + 12.5) = 35.7Khz ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_239Cycles5); //9Mhz/(239.5 + 12.5) = 35.7Khz ADC_DMACmd(ADC1,ENABLE); ADC_Cmd(ADC1, ENABLE);9 O6 u5 w: H1 c; u ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1);+ ~, j6 ]# G% D' Q while(ADC_GetCalibrationStatus(ADC1));! O. _' r& y' k) u ADC_SoftwareStartConvCmd(ADC1, DISABLE);; R3 \ O8 @" W 第二种(注入组)& j# ?* a5 ?$ j; t& K RCC_ADCCLKConfig(RCC_PCLK2_Div6); /*72Mhz/6 = 12Mhz*/$ S) r7 O- s$ k; Z. x# O+ n RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);) D3 P+ D; D8 [% T& b9 |% U, O RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 | RCC_AHBPeriph_DMA2, ENABLE);2 L; i& m1 z# `+ X GPIO_InitTypeDef GPIO_InitStructure;& S1 f Y& \3 c! K GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; 7 Y D) i' H. V+ s/ l! a GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;9 X6 U1 C# c0 G8 G1 Z GPIO_Init(GPIOA, &GPIO_InitStructure); //ADC INIT, ADC1 INJECTED CH, CONT SCAN MODE ADC_InitTypeDef ADC_InitStructure;: r/ n9 q0 \& c E! g9 e7 \, s RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);, J3 N* j/ b- K7 F: w RCC_ADCCLKConfig(RCC_PCLK2_Div6); /*72Mhz/6 = 12Mhz, note: 14MHz at most*/, g' _9 ]$ c5 |- B ADC_DeInit(ADC1); ADC_StructInit(&ADC_InitStructure);3 z% R* x8 P3 h1 H ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Left;* P3 b9 B: \) X2 z ADC_InitStructure.ADC_NbrOfChannel = 0; ADC_Init(ADC1, &ADC_InitStructure); ADC_InjectedSequencerLengthConfig(ADC1, 4); //!!!length must be configured at first ADC_InjectedChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); //12Mhz / (12.5 + 239.5) = 47Khz6 f& u* w/ `; q ADC_InjectedChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5);3 V% g0 v2 L3 m" P ADC_InjectedChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5); ADC_InjectedChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_239Cycles5);/ F A+ N2 D6 y0 N5 q# F8 |7 C ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);4 ]" P6 I) I2 h% Q) v" @ R ADC_AutoInjectedConvCmd(ADC1, ENABLE); //!!!must be set because inject channel do not support CONT mode independently ADC_Cmd(ADC1, ENABLE);/ T. P3 ~6 ]7 F" e ADC_ResetCalibration(ADC1);9 G8 m3 b4 K; q6 n" \ while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1);+ E* r6 I8 j- m F* g# } while(ADC_GetCalibrationStatus(ADC1)); //WARNNING: DEAD LOOP!!! ADC_SoftwareStartConvCmd(ADC1, DISABLE); |
微信公众号
手机版
比如你用到ADC1的四个通道,怎么知道此时采样的是哪个通道呢?2 P% F7 d. Y7 Z$ ]1 B5 e% h
1.用DMA方式;
2.用注入组
我用的是10X。其他两款没用过
规则组必须按着事先说好的采样顺序采样;! H1 D4 x7 j7 O7 p- L2 p- c
注入组则不用。