|
本帖最后由 sasmike 于 2015-1-8 16:00 编辑 , V2 U+ B- R8 R k4 Z 最近学习了STM32F0芯片,写了一个DMA控制ADC采样程序,给大家分享一下。还是新手,希望大家多提宝贵意见 ![]() 程序在STM32F051上面测试的7 h- z1 o1 i* H6 U6 I. { 基本内容是:* k- }, g3 c* Z6 C 1、使用ADC1的11通道每1us采集一次ADC数值* `& g6 }' k. Z0 B6 B6 [4 _* N 2、使用DMA1的1通道对采集数据自动存储,共采集1000个数据# \) X& @, t* u' G 3、每次采集1000次数据后,在主函数中对1000次数据进行求平均值 4、由串口1发送到电脑串口上显示 具体程序如下: #include "main.h" /* Private typedef -----------------------------------------------------------*/2 r8 ~7 }# z2 a- J9 ` /* Private define ------------------------------------------------------------*/" B7 M2 q, ?, P. A% h, n- K #define ADC_DR_Address 0x40012440 #define ADC_BUFFER_SIZE 1000. K+ I9 K, x: T& R" u# ?# e /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ __IO uint16_t ADC_Buffer[ADC_BUFFER_SIZE]; __IO uint32_t ADC_ConvertedData_Sum; __IO uint16_t ADC_ConvertedData;* {" M$ ` E4 f, U$ L __IO uint16_t ADC_ConvertedVoltage;, g1 n# v# t4 X* c( s /* Private functions ---------------------------------------------------------*/; Y) W+ U$ e1 D void Delay(__IO uint32_t nCount); ) L$ D* H8 v0 f% f int main(void), _# z- d8 H; K6 K, f { & K! l& F" i9 \( C9 S: U* @ __IO uint16_t index;/ ?/ ^7 n+ }& d, U& l* o6 u & O. T; D; k/ [" _# s5 b8 d% L USART1_GPIO_Init();, O; c0 v* I& Z8 U 0 k" `% w9 J( k) `3 ?! ^1 G1 q5 \ printf("This is a ADC DMA Demo...\n");, ^# S' D# {8 x* \7 p" l8 M # {+ `0 A0 n9 `/ ]! a( C ADC_DMA_Config(); ) C- y) O0 ]+ w/ T3 b2 u /* Infinite loop */+ [! w# m6 r1 p6 `% y: H while (1) {5 w) Z$ t U( P7 f6 H+ a' ~ ADC_StartOfConversion(ADC1); while ((DMA_GetFlagStatus(DMA1_FLAG_TC1)) == RESET) { }0 G# O! u5 Z1 w4 \0 w " e9 P! |2 B- q8 ~4 g7 ] ADC_StopOfConversion(ADC1);8 q J0 W1 R; x5 E! o : E0 k1 `" K$ R/ @ DMA_ClearFlag(DMA1_FLAG_TC1); % ~$ y3 a7 ~+ Z8 p3 H ADC_ConvertedData_Sum = 0; for (index = 0; index < ADC_BUFFER_SIZE; index ++) {5 C) Z0 Z H9 N8 ] ADC_ConvertedData_Sum += ADC_Buffer[index]; }& D; e+ u$ S% G) @5 L) e! W! m9 C ADC_ConvertedData = ADC_ConvertedData_Sum / ADC_BUFFER_SIZE;2 ?. k- [' C. c1 Q) ^0 T$ J: e, D 5 T! \6 z. \6 m3 S# l& b% P ADC_ConvertedVoltage = (float)(ADC_ConvertedData * 2980) / 0xFFF + 0.5; printf("------------------------------------\n"); printf("ADC_ConvertedData = %d\n", ADC_ConvertedData); printf("ADC_ConvertedVoltage = %d\n", ADC_ConvertedVoltage);* _& z) U5 A( d3 _. D8 M. b+ t( S ( r4 O# d- X/ V9 J* i Delay(5000000); }$ P0 ]5 s" R( e m0 ]9 @5 ~/ l N8 t }% \2 g( q7 R8 n, e/ P' f5 V void ADC_DMA_Config(void)3 w- w# p2 _+ c4 `, c { GPIO_InitTypeDef GPIO_InitStructure;+ z+ ` z, ?( [7 @6 x" k9 c9 Y ADC_InitTypeDef ADC_InitStructure;# v; c" ^* x8 T5 X* \. j DMA_InitTypeDef DMA_InitStructure; ADC_DeInit(ADC1);6 ^; J- b8 o: _% {) W$ Q* e 5 W7 k, B2 H! S) E) m- d8 Q RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);( r& c/ p* V) G7 o( F% b RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);3 d) U% b) x( b; P* i" A 4 H1 u, u X+ \6 P3 m A, [$ Y% l GPIO_DeInit(GPIOC);0 V0 `+ W. S0 t+ @( y5 U GPIO_StructInit(&GPIO_InitStructure);5 I) q R/ [3 F. U( r6 k- ~6 z' s( A GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;" \7 V# Y V1 ~ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;5 e" X9 z( U% W7 l GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); DMA_DeInit(DMA1_Channel1);# _. o; q+ R- F6 \' [ E DMA_StructInit(&DMA_InitStructure);" n1 H' j3 l2 z3 p/ T4 V# |' E DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC_DR_Address;) H- I& C- \% w9 ~4 ^' u DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_Buffer;+ ~# {# Q* t0 E% k DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;' X- o, H. Q T# i. i! c1 Y1 g* P DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = ADC_BUFFER_SIZE; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); DMA_Cmd(DMA1_Channel1, ENABLE); ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular); - @ x! _( z& y7 Q) ^$ U ADC_DMACmd(ADC1, ENABLE);8 P5 t) `) ^$ G' x5 D ADC_StructInit(&ADC_InitStructure);7 }+ i$ u; r" _7 D( M3 Q1 l ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; c" P5 E; K) b9 Z' e ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;/ z/ j, r) @! @+ o% o0 k3 w ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;" e$ _. i: i1 l7 L# Y6 k ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_Init(ADC1,&ADC_InitStructure);5 y0 O1 t8 e' s1 a ! W9 w2 a* B i. p8 b8 C* P; E, ?: v0 V ADC_ChannelConfig(ADC1, ADC_Channel_11, ADC_SampleTime_239_5Cycles); ADC_GetCalibrationFactor(ADC1); ADC_Cmd(ADC1, ENABLE);+ L! u( z' X( @+ m# p' }4 ~+ {4 g1 x while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN)). @8 Y: t* H2 S { } }: ~2 z4 E! E% f7 p% w0 B, t/ L8 c 最后附上源程序:
STM32F0xx-ADC1000_DMA.rar
(2.26 MB, 下载次数: 270)
|
微信公众号
手机版
楼主能否解释一下DMA配置的部分,刚学,总是整不好。
DMA_DeInit(DMA1_Channel1);
DMA_StructInit(&DMA_InitStructure);% \; q) D* ~/ p' u
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_Buffer;4 z& o- p3 S6 h. `$ {5 V7 r
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;+ q$ `5 g4 f/ k3 G/ g
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;% J7 ~* A! q# }! K
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;4 X" p Q% G2 L5 k8 j9 v* @
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;# h- t D. n0 t' E9 x/ V& T
DMA_InitStructure.DMA_BufferSize = ADC_BUFFER_SIZE;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;( T5 O) d& ~0 V: U3 W4 e6 v% v" u
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;: U5 P; M6 o1 f8 J- n u8 L$ F
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
能用上就好,多交流啊
以前用的标准库用多了,这个还没有仔细研究
共同学习