|
本帖最后由 sasmike 于 2015-1-8 16:00 编辑 ' B- W) |" e: \8 S9 E2 x) p 最近学习了STM32F0芯片,写了一个DMA控制ADC采样程序,给大家分享一下。还是新手,希望大家多提宝贵意见 ![]() 程序在STM32F051上面测试的. I) N8 q* Z; O8 I+ J5 R, U- z 基本内容是:4 s' `2 t/ \; _! n 1、使用ADC1的11通道每1us采集一次ADC数值7 @' E3 u! o1 h- I- W 2、使用DMA1的1通道对采集数据自动存储,共采集1000个数据3 _3 k. m8 e& _0 [ 3、每次采集1000次数据后,在主函数中对1000次数据进行求平均值 4、由串口1发送到电脑串口上显示% r5 P. G" K7 s9 f1 j/ F* A& t- T- ] 具体程序如下:- l0 b! z' n) I; F' [3 b x" j #include "main.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/( j- A T# e: V# y6 u #define ADC_DR_Address 0x40012440; G& a' x; p" i% G/ Q) U0 }; Q #define ADC_BUFFER_SIZE 1000 /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/; c& ^; n. ]* D2 i __IO uint16_t ADC_Buffer[ADC_BUFFER_SIZE];2 M) Y/ {# E$ ~9 e$ | __IO uint32_t ADC_ConvertedData_Sum; __IO uint16_t ADC_ConvertedData; __IO uint16_t ADC_ConvertedVoltage; /* Private functions ---------------------------------------------------------*/ void Delay(__IO uint32_t nCount);7 B' c; m3 F; [! Q1 m, B int main(void)$ v$ p) ]9 ]; t; i a6 Z6 ]% d. L+ P {: c7 z( c, `6 P% {2 \ L, t" S& H- K. e9 M __IO uint16_t index;+ J) I7 P1 B& l. t USART1_GPIO_Init();+ z8 t; a1 d5 x' F; |7 c* v printf("This is a ADC DMA Demo...\n");, y7 U: Q6 S Y: ] ADC_DMA_Config(); /* Infinite loop */ while (1)! |( q9 g2 X+ j0 U6 q; d4 R. q {: ^& O3 _4 O% G2 C9 Z" d: [3 J ADC_StartOfConversion(ADC1); while ((DMA_GetFlagStatus(DMA1_FLAG_TC1)) == RESET) {, H( Q y: _* u! w: p) u; a' j% _* ? } : O3 D% x- A2 v, Z; m/ p2 q+ @ ADC_StopOfConversion(ADC1); DMA_ClearFlag(DMA1_FLAG_TC1); ' |& P! S7 W# n& w4 h ADC_ConvertedData_Sum = 0; for (index = 0; index < ADC_BUFFER_SIZE; index ++) {) p5 V- I7 n6 S; w; B ADC_ConvertedData_Sum += ADC_Buffer[index];0 J2 h+ K! @8 ~ w5 s } ADC_ConvertedData = ADC_ConvertedData_Sum / ADC_BUFFER_SIZE; ADC_ConvertedVoltage = (float)(ADC_ConvertedData * 2980) / 0xFFF + 0.5; printf("------------------------------------\n"); printf("ADC_ConvertedData = %d\n", ADC_ConvertedData);$ M4 @9 {0 M9 {+ b; c- f printf("ADC_ConvertedVoltage = %d\n", ADC_ConvertedVoltage);1 f+ I! I& x/ |- k Y8 D( S+ O, z( }& ] : Y# y5 J8 ?6 H5 Q Delay(5000000); } } void ADC_DMA_Config(void), W, l( k' V$ `( z {* x( b0 k; B5 D- U. t( H0 Z GPIO_InitTypeDef GPIO_InitStructure;9 E3 {; e( M; v S" r ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStructure;0 Z: A6 E3 J! d* b, h% i: r ADC_DeInit(ADC1);" X0 g8 \/ K2 H RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);8 M k) N9 |9 F" e X RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); , C5 o6 |5 t9 f f+ n0 b) Z GPIO_DeInit(GPIOC); GPIO_StructInit(&GPIO_InitStructure);2 [' L2 R- l# n) [; N% ` j: |+ ~ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;7 a+ V- I* z+ j" B. o, D: w GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;" X/ B* k; y9 M2 v) A. V( r GPIO_Init(GPIOC, &GPIO_InitStructure);% X8 F8 t8 o5 ?3 T/ O9 v& v0 w, `0 o ( _ R0 N6 P# {1 r DMA_DeInit(DMA1_Channel1); DMA_StructInit(&DMA_InitStructure); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_Buffer;, f) y7 Y5 @4 z- I) e6 G/ M DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;( O+ N$ h( j% }7 G n1 {2 { DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;5 B, W" P5 C" F% e8 B$ n DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;5 J" v8 K6 d# H2 K2 @/ H' v5 Q m DMA_InitStructure.DMA_BufferSize = ADC_BUFFER_SIZE;9 E q, V3 J+ q& ]% |5 ? DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); g8 }, V" \: E- ?5 ]! [/ k , E6 c# r! D8 |/ U! t5 V4 Y' R$ I DMA_Cmd(DMA1_Channel1, ENABLE);& A7 V" ~7 f1 `6 f& l " b$ a4 ^: m/ X$ X# \+ U ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular); ( \) i0 k% g+ m( y& p6 D0 u7 B3 Y. U ADC_DMACmd(ADC1, ENABLE); 8 M7 c( B! R! { ADC_StructInit(&ADC_InitStructure);5 O9 I" d: S8 B+ r" N) S( l4 E8 A ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;1 g% B3 ]3 A j: l* g# {$ U ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; {6 u& c2 J3 s& B5 ~) K8 T ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;/ M Z7 H) b Z4 y a ADC_Init(ADC1,&ADC_InitStructure); ADC_ChannelConfig(ADC1, ADC_Channel_11, ADC_SampleTime_239_5Cycles);( a1 E" D- f6 n" e. [9 c ADC_GetCalibrationFactor(ADC1);) s, ?' ]2 p) v1 L9 g 4 Z3 y( f: [6 r- g0 Y0 g ADC_Cmd(ADC1, ENABLE);: J. A u3 a9 X while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN)) {+ l! k2 R/ R- M1 \ } }% c) w9 a1 @5 }+ T h0 S! Y, i 最后附上源程序:
STM32F0xx-ADC1000_DMA.rar
(2.26 MB, 下载次数: 270)
|
微信公众号
手机版
楼主能否解释一下DMA配置的部分,刚学,总是整不好。
DMA_DeInit(DMA1_Channel1);
DMA_StructInit(&DMA_InitStructure);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_Buffer;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;$ P9 h. x+ v3 l7 G. y& E2 B; s
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;& f6 U2 P, i, S* j1 O! X0 ^
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;( I4 }1 U- B0 b7 v7 a+ \
DMA_InitStructure.DMA_BufferSize = ADC_BUFFER_SIZE;* D; E7 C2 j( J' U7 a
DMA_InitStructure.DMA_Priority = DMA_Priority_High;* d9 m2 p! N% k! k. X5 o2 u
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
能用上就好,多交流啊
以前用的标准库用多了,这个还没有仔细研究
共同学习