你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Nucleo-32F042K6 DMA采集ADC

[复制链接]
电子星辰 发布时间:2018-6-20 11:10
本帖最后由 电子星辰 于 2018-6-20 17:05 编辑
, x1 h! }! b- Y8 L
+ @% V; O' p4 Q( M9 V1 h4 Q这是一个基于STM32F042K6T6的Nucleo板,使用Cube配置,通过过DMA连续采集较多采样数的ADC单通道程序。! [  X8 H4 Z1 l, G7 }. [% L
# s! M8 B& W8 ^' a
首先先在Cube新建工程,选择Board Selector标签,在搜索框里打042即可。
3 B0 o6 z, p# ~0 d+ O" ?# t 新建工程.JPG , o9 O9 j! I1 m5 P
! Q/ l8 M9 I# S+ ~  v* j
选择之后会弹出一个选择是否初始化外设为默认设置的弹窗,选择“YES”的话,时钟、串口、调试什么的它就给你设置好了。选“NO”就全部自己设置。这里我选的是YES。. {* Z1 `4 l; I# o
初始化选择.JPG
0 I! Y3 ?3 x2 ^# s8 C( |& L; ^" i( q
“Pinout”标签页里的串口默认设置就可以(Nucleo板042K6是使用的USART2,就那个MicroUSB接口,既可以下载也可以串口传输),ADC中勾选IN0。4 N/ _# ]6 W* w8 W3 n: `) I- S# m: p
串口pinout.JPG ) o* K. i1 d$ v6 B6 K2 Y: O. _% r  W
ADCpinout.JPG
! ~' Z7 n% N' Z/ X& _ 芯片pinout.JPG 7 m) ^  E3 k6 _+ M+ `" S6 c
5 Y% r) c& ^% t
“Clock Configuration”标签页里,我喜欢主频设为最高,直接把HCLK改成最高48然后回车,它就自己给你弄好。1 a8 z" a% N- o3 Q1 L. T  y
时钟设置.JPG : s! J; ~: e: P
# V; |) i0 A( p( ~$ H
“Configuration”标签页里,先设置USART2,参数设置如图,因为我不需要接收就不勾选中断了。
  ~. [$ f/ s+ _0 V+ K) v 串口参数设置.JPG 6 \5 O8 M( }6 X0 C; w: `$ l
ADC设置我先要添加DMA,模式选择连续模式Circular,这样就在循环前设置一下,以后直接取数据就行了。数据长度DATA Width一定要注意,12位的ADC两个都选半字,在代码里只取12位,如果使用全字然后代码里又没取对,那就会数据异常。7 R8 i! M# S& n" n; }& }" v
ADC的DMA设置.JPG 7 _3 j8 h  J/ s/ z$ |' g
ADC参数设置.JPG
: [$ ?4 Q/ ^" `. `3 j% u7 |: ~9 X
# J$ B) H7 @' s7 o; a; D1 z: P' }最后是生成工程,点击图中红框图标,第一次会弹出设置窗口,以后再点会直接生成。如果想再设置,就在菜单栏里的工程菜单里点设置。1 L" \8 @6 Y6 V
工程设置.JPG 工程设置2.JPG
- h  G/ t* y( G# R至此Cube设置完成7 i' Y& f6 l- X# R

' W  P' m6 B% l2 n5 H& M& K附部分代码,特别说一下DMA采集函数里的ADC_ConvertedData[(ADC_SAMPLE * ADC_NUMOFCHANNEL)]这个地址,因为我设置的是半字传输,所以必须是16位,如果设成32位,数据就会异常(例如2个数据叠加)。
  1. /* USER CODE BEGIN 0 */0 L6 C) m; H; @# V1 d3 w5 F
  2. /* ADC variables */% I3 ]- |- W: _8 s
  3. __IO uint16_t ADC_ConvertedData[(ADC_SAMPLE * ADC_NUMOFCHANNEL)];//AD转换结果值
    $ Z5 a( d/ t$ u- u! N. ]1 y# `% ^
  4. __IO float ADC_ConvertedValueLocal[ADC_NUMOFCHANNEL];// 以浮点数保存转换计算后的电压值
    . {' x0 O; c+ L& F/ }: V6 q0 n3 b! x
  5. /* USER CODE END 0 */
    . L, U7 F. i  Y0 j& P( G4 ~1 |

  6. , I% x5 D. A" V  m1 c1 D% w
  7. int main(void)+ Z: J# T6 K& ^# e- c  F
  8. {) A* `# G2 t2 A& A$ B
  9.   /* USER CODE BEGIN 1 */
    ) W2 R7 }: ?8 D0 D( D
  10.   uint16_t out_en_cnt=0;
      H' h5 _: ?0 P3 \8 ?" X6 D
  11.   /* USER CODE END 1 */
    9 ^$ |. b' ?3 |4 {
  12. 1 I9 |. y8 t" T7 y2 G
  13.   /* MCU Configuration----------------------------------------------------------*/# L% `# O3 N# P6 i* g) U; J
  14. : N- J! g& M7 N% D, ?) G  h5 G
  15.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      p1 z4 ]* ?7 M* U
  16.   HAL_Init();* K; E5 h7 r! x
  17. , \# E, X4 c" c
  18.   /* USER CODE BEGIN Init */# D3 d  _; I4 d# h
  19. : K3 P1 R+ l( Q% {% J1 Q+ k
  20.   /* USER CODE END Init */
    8 y( P- p5 ~: H+ R: Z$ b
  21. ' e; g2 F. J7 o" o8 {3 X
  22.   /* Configure the system clock */
    - L+ o1 r9 V7 p( M: v, J
  23.   SystemClock_Config();
    ( ]/ W) m0 b0 c: X( P4 p4 l

  24. ! x( O+ o' \& i3 B* u7 S$ w' f( _& k
  25.   /* USER CODE BEGIN SysInit */) u( h' p! e+ f$ W3 \# [; T: `8 B

  26. 3 b7 R4 k3 @" m9 X
  27.   /* USER CODE END SysInit */  i: i) i# Q9 j' @+ {7 v
  28. " f2 p. \6 l+ f
  29.   /* Initialize all configured peripherals */
    & m5 Y- n! ]: f$ P. A+ F% k% \
  30.   MX_GPIO_Init();
    # C* n* m( z' D! n# P
  31.   MX_DMA_Init();
    2 \( w! n( _1 F! K7 ^+ `3 y4 ]
  32.   MX_USART2_UART_Init();- {! c6 N$ }' a* U
  33.   MX_ADC_Init();
    ' T/ `7 e# `/ Y& Z
  34.   /* USER CODE BEGIN 2 */( ~: V  z. N- A7 Y7 T1 K% O
  35.   HAL_ADCEx_Calibration_Start(&hadc);//启动ADC自校验
    . T: }8 ?& c  [
  36.   HAL_ADC_Start_DMA(&hadc,(uint32_t *)ADC_ConvertedData,(ADC_SAMPLE*ADC_NUMOFCHANNEL));//启动AD转换并使能DMA传输和中断
      s4 s, v: C5 v
  37.         HAL_Delay(30);//等待第一轮ADC数据采集完成% _" G* k4 F5 V& B' s
  38.   /* USER CODE END 2 */% j+ x9 C6 ?# {" R8 ]/ f& R) v6 y& H5 b

  39. / ?2 T. O9 J% E5 j
  40.   /* Infinite loop */+ {6 |& R; }: _! @) v
  41.   /* USER CODE BEGIN WHILE */
    , y- \" r* z8 N. t- r+ ?$ o
  42.   while (1)
    ; ^# U" b( G4 ~' x
  43.   {7 s/ j2 q2 c" l, i# |+ _- }; Y, i
  44.                 HAL_Delay(30);//一次采样+转换时间=(239.5+12.5)周期/14MHz=18us,延时30ms
    $ G5 B3 Y2 y" {' r+ F$ A
  45.     adc_getvalue();! `3 {1 u" I/ ?, w* ~
  46.                 / Z$ ~; W  q/ k- M3 ?: @; ]
  47.     if(++out_en_cnt == USART_TIMES)* d. M( t4 T+ [6 I' W, U) M: b
  48.                 {8 m/ ]1 S* X, V7 |) J
  49.                         out_en_cnt = 0;
    " {2 v, W; h  y4 Y) V
  50.                         HAL_Delay(500);3 ~( S1 N: P6 R/ I  r# t" _( R
  51.                         printf("CHANNEL_0:%.2f\r\n",ADC_ConvertedValueLocal[0]);
    3 Z2 Y- u4 g+ h/ S; {# o/ Z
  52. }
    " l- |$ L; D+ C; p& J4 F
  53. }
    2 v* X" G8 }+ O$ ^% B/ \
复制代码

( z, S6 k3 y/ x- E最后,附完整工程。& i5 I7 V6 \5 [7 W

4 C1 P# `2 l9 h: b# ]
: K" ?( n* e  }$ B3 V* L$ O- p" j9 n) g) |2 h

Nucleo-32F042K6 DMA采集ADC(MDK).rar

下载

4.99 MB, 下载次数: 909

收藏 2 评论9 发布时间:2018-6-20 11:10

举报

9个回答
zero99 回答时间:2018-6-20 11:20:07
学习了
STMCU-管管 回答时间:2018-6-20 14:35:04
很详细。学习了!
时光虫子 回答时间:2018-6-20 15:52:58
Cube软件用的爽啊,开发效率高
电子星辰 回答时间:2018-6-20 16:03:38
时光虫子 发表于 2018-6-20 15:52
0 e. V9 C: x; N/ R" E  x( }Cube软件用的爽啊,开发效率高

4 Z* h/ ~" P; w1 h# B- Lcube确实用起很方便,但感觉还不完善。有时候出问题就一直解决不了。。。
wolfgang 回答时间:2018-6-20 22:28:45
不错的内容,继续努力~~
andey 回答时间:2018-6-21 13:17:11
提示: 作者被禁止或删除 内容自动屏蔽
samhong 回答时间:2019-1-30 00:54:18
学习了,学习了!
alvad 回答时间:2019-4-19 17:09:04
学习了。很不错
sqhxx 回答时间:2022-10-26 11:18:52
收藏8 k6 T* x* k* l# ]2 W0 e4 r

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版