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

Nucleo-32F042K6 DMA采集ADC

[复制链接]
电子星辰 发布时间:2018-6-20 11:10
本帖最后由 电子星辰 于 2018-6-20 17:05 编辑
' V! l: e8 s9 S! F! K" q7 Y3 v+ I* a$ S1 ^- V
这是一个基于STM32F042K6T6的Nucleo板,使用Cube配置,通过过DMA连续采集较多采样数的ADC单通道程序。) I0 T& S- D( O3 j# A4 ]

( A1 B5 |' c7 l" E9 M" c9 q( U- Z- f首先先在Cube新建工程,选择Board Selector标签,在搜索框里打042即可。
% P5 c) M0 Y4 X, a3 j, c; w 新建工程.JPG
% u. ~  A2 F! ]* M6 d0 H
. y) J4 k' n$ j- b. P! |) q选择之后会弹出一个选择是否初始化外设为默认设置的弹窗,选择“YES”的话,时钟、串口、调试什么的它就给你设置好了。选“NO”就全部自己设置。这里我选的是YES。# r( H7 _2 M1 b( D* U/ ]. v$ ]9 S
初始化选择.JPG ' V  z/ B9 `; l
8 N7 w. v" d/ F0 {+ S
“Pinout”标签页里的串口默认设置就可以(Nucleo板042K6是使用的USART2,就那个MicroUSB接口,既可以下载也可以串口传输),ADC中勾选IN0。/ n" N- n9 w% i1 N- g$ {5 m
串口pinout.JPG 8 O: b! p3 S; E/ W; N2 k
ADCpinout.JPG 7 D( }5 e9 N, c
芯片pinout.JPG 2 e  N% L8 ~& L3 P, x' z9 [- {

  U. [. P- a) x7 }6 V4 `9 w“Clock Configuration”标签页里,我喜欢主频设为最高,直接把HCLK改成最高48然后回车,它就自己给你弄好。
9 a; J0 ?% K# @- L  z 时钟设置.JPG
6 u+ Q3 R$ M* o
) w7 o0 r2 O9 H, E! U“Configuration”标签页里,先设置USART2,参数设置如图,因为我不需要接收就不勾选中断了。
. K, @  `  _9 S# g/ \9 X& } 串口参数设置.JPG
3 P, h, w$ s7 K/ p8 k3 _ADC设置我先要添加DMA,模式选择连续模式Circular,这样就在循环前设置一下,以后直接取数据就行了。数据长度DATA Width一定要注意,12位的ADC两个都选半字,在代码里只取12位,如果使用全字然后代码里又没取对,那就会数据异常。9 `$ _8 B& B3 B" u
ADC的DMA设置.JPG * s  {* f6 q* C% W; P7 z
ADC参数设置.JPG
2 G1 N2 i: _1 ?4 k! G( Y+ a4 [9 }4 U6 M/ L" j+ E& U: P
最后是生成工程,点击图中红框图标,第一次会弹出设置窗口,以后再点会直接生成。如果想再设置,就在菜单栏里的工程菜单里点设置。1 P1 y' R+ z4 f: X' S9 j3 n
工程设置.JPG 工程设置2.JPG
- ?# p# Z: y: F& X! J/ a8 i至此Cube设置完成
" ^4 N% d/ d/ |0 K% y/ v
4 C1 k$ H+ T( \5 G附部分代码,特别说一下DMA采集函数里的ADC_ConvertedData[(ADC_SAMPLE * ADC_NUMOFCHANNEL)]这个地址,因为我设置的是半字传输,所以必须是16位,如果设成32位,数据就会异常(例如2个数据叠加)。
  1. /* USER CODE BEGIN 0 */  Z1 l  ?8 y" X- J9 y2 o
  2. /* ADC variables */
    8 z' E# \' w+ I, r3 q
  3. __IO uint16_t ADC_ConvertedData[(ADC_SAMPLE * ADC_NUMOFCHANNEL)];//AD转换结果值
    9 E' w( x) J8 r6 ~* F& x
  4. __IO float ADC_ConvertedValueLocal[ADC_NUMOFCHANNEL];// 以浮点数保存转换计算后的电压值; K3 f9 f5 B$ a% b" G: J
  5. /* USER CODE END 0 */4 T1 w! X  `0 I, Q: z- e
  6. ; @: O6 ?  k( T! {& P1 q- Y
  7. int main(void)
    ' N6 b  O5 r# `4 k& E5 e
  8. {
    : J" q2 v* R- C/ t- a7 k
  9.   /* USER CODE BEGIN 1 */
    3 Q# V. v3 z9 u; ]- x! `' a
  10.   uint16_t out_en_cnt=0;
    . J8 u1 F3 d# I/ ?. Q  y7 X: y
  11.   /* USER CODE END 1 */& H; {! h# z) v/ C0 Y. S* X
  12.   a( i7 z* Z  d, a
  13.   /* MCU Configuration----------------------------------------------------------*/
    3 f0 X$ ^. a! ?% I. X% O* F
  14. 0 F3 M+ B2 d! a& e
  15.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. *// C0 v6 X5 K. P1 c! l
  16.   HAL_Init();8 q0 l% b1 }% {' }
  17. $ C; `8 a5 T3 q9 o7 H! L! h: w
  18.   /* USER CODE BEGIN Init */
    " y7 D: W! C. G+ p. {; r

  19. , l1 P! s6 n6 K
  20.   /* USER CODE END Init */$ s, B- I% D* F

  21. $ ~1 H2 O" @6 z- j. m$ T# m6 s
  22.   /* Configure the system clock */+ j# @' t5 c$ v4 A( {+ H
  23.   SystemClock_Config();
    / r! Z, k% u, X' h0 V0 x% }4 W
  24. - y' w4 Y. G, m) L( m5 }
  25.   /* USER CODE BEGIN SysInit */
    , e, z* p5 \3 E# l) a

  26. . u, p6 ]+ d* z/ Q
  27.   /* USER CODE END SysInit */" R3 x; {: }: `! Q8 J

  28. 9 O. Y( I; ]! W. V0 H1 z
  29.   /* Initialize all configured peripherals */
    , N8 r( u' g, i' Y
  30.   MX_GPIO_Init();# R# \( q( _7 i( X
  31.   MX_DMA_Init();
    $ y/ z6 y$ B% K+ d
  32.   MX_USART2_UART_Init();
    5 R, S7 A1 }# i- w0 ^% Y! L
  33.   MX_ADC_Init();
    2 s, v+ T# K% r% M" g
  34.   /* USER CODE BEGIN 2 */
    # ?7 |6 c& S9 U6 O) G5 t- S6 y( ~' k
  35.   HAL_ADCEx_Calibration_Start(&hadc);//启动ADC自校验$ X$ H" t7 E' f
  36.   HAL_ADC_Start_DMA(&hadc,(uint32_t *)ADC_ConvertedData,(ADC_SAMPLE*ADC_NUMOFCHANNEL));//启动AD转换并使能DMA传输和中断
    % i( t  b# q$ P' z" P8 q
  37.         HAL_Delay(30);//等待第一轮ADC数据采集完成
    9 j0 ^! y$ ?* J- R0 ^
  38.   /* USER CODE END 2 */5 |7 {1 I0 \* t1 f2 [

  39. ! B* |1 T+ B' u; ~" F
  40.   /* Infinite loop */
    . F8 V; O" Y9 c4 y
  41.   /* USER CODE BEGIN WHILE */
    6 h+ I* s' L2 L0 A/ N
  42.   while (1)' G! m) v: Z; q. s
  43.   {. `; t" f" G6 a1 u; h9 Y! S. |) A, D
  44.                 HAL_Delay(30);//一次采样+转换时间=(239.5+12.5)周期/14MHz=18us,延时30ms$ C! p3 A! d& C# r# z! f2 q
  45.     adc_getvalue();+ a$ f) x" t: x- A9 M% n' v
  46.                   p; |$ m1 Z3 G6 N0 T) \
  47.     if(++out_en_cnt == USART_TIMES)
    2 O( H& y! n: Y3 z1 l/ F: U& {
  48.                 {
    4 g8 J- R" o) `% ^& P) y0 h2 _
  49.                         out_en_cnt = 0;& J& l2 u) P9 d  E/ N/ _" J' z( l8 `- [
  50.                         HAL_Delay(500);2 m* d9 O9 U$ |  y  S- m
  51.                         printf("CHANNEL_0:%.2f\r\n",ADC_ConvertedValueLocal[0]);5 C; H; }7 j1 I0 N# o6 @
  52. }# O6 d/ ^& Q. z% N8 F$ Z
  53. }
    , ^. m0 s3 q6 j
复制代码

5 b. \6 J, Z9 O9 Q3 l最后,附完整工程。
0 B. U! N6 J" ?9 P4 I  f* E. P, r, l: j) H4 M% {: w. o
7 ~' ?6 Q+ s) E- b* H! j- F0 S; P
! x$ ]* f9 _  x

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
. U2 F3 X8 @- {* W5 S, L" U1 u; hCube软件用的爽啊,开发效率高
: A/ C) {* @( W' X9 N  K  ]* y
cube确实用起很方便,但感觉还不完善。有时候出问题就一直解决不了。。。
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
收藏1 r! J! ~- [: c5 v: b- R

所属标签

相似分享

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