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

Nucleo-32F042K6 DMA采集ADC

[复制链接]
电子星辰 发布时间:2018-6-20 11:10
本帖最后由 电子星辰 于 2018-6-20 17:05 编辑 / X2 N0 h! q/ ]! H& q

; k; B+ k5 ]! L, E5 ~+ W+ G这是一个基于STM32F042K6T6的Nucleo板,使用Cube配置,通过过DMA连续采集较多采样数的ADC单通道程序。4 C4 P2 u, \# b9 J
  V2 A% X: }  m. ~7 ~" q% N! i# T
首先先在Cube新建工程,选择Board Selector标签,在搜索框里打042即可。
3 z! Q! I& i. r 新建工程.JPG
  H" S3 Q& k( j% J
1 @+ ^6 V# J3 G/ F% y选择之后会弹出一个选择是否初始化外设为默认设置的弹窗,选择“YES”的话,时钟、串口、调试什么的它就给你设置好了。选“NO”就全部自己设置。这里我选的是YES。
5 ]9 o. g* p# W: K% Y 初始化选择.JPG 9 y" M" T3 j# M$ L- X; g

+ W  F+ q8 @; e. X& }- W. X“Pinout”标签页里的串口默认设置就可以(Nucleo板042K6是使用的USART2,就那个MicroUSB接口,既可以下载也可以串口传输),ADC中勾选IN0。
2 O' x+ A( t4 K 串口pinout.JPG ; }) K. p3 K- D, u; h6 k1 T. {; v# L8 Z
ADCpinout.JPG
% {2 a% ^0 M, i: r/ V 芯片pinout.JPG
. B/ c$ U) l) {2 ^  v/ }
4 w1 y6 g) [) }% Y9 r: Z0 t“Clock Configuration”标签页里,我喜欢主频设为最高,直接把HCLK改成最高48然后回车,它就自己给你弄好。
: w9 F7 ?4 t: E5 L7 R- t 时钟设置.JPG
- J: S! H1 ~& P$ x5 y$ T5 F4 k# H  ?1 v, j* m  O
“Configuration”标签页里,先设置USART2,参数设置如图,因为我不需要接收就不勾选中断了。
$ I( A9 D) u+ Y$ U& ~" ~; q 串口参数设置.JPG 5 `4 X+ \) e) H6 j4 {9 y! J8 G. Z
ADC设置我先要添加DMA,模式选择连续模式Circular,这样就在循环前设置一下,以后直接取数据就行了。数据长度DATA Width一定要注意,12位的ADC两个都选半字,在代码里只取12位,如果使用全字然后代码里又没取对,那就会数据异常。
2 [: ^2 f- d1 e5 R0 U! F ADC的DMA设置.JPG ( E: c# v# P/ ^& k2 l3 I6 W$ L
ADC参数设置.JPG 6 f' N! X! p* [! @" v; Z3 x/ K

; B5 l6 I1 u) o- K- ~最后是生成工程,点击图中红框图标,第一次会弹出设置窗口,以后再点会直接生成。如果想再设置,就在菜单栏里的工程菜单里点设置。- k. U0 r! V2 T: L- P, k6 i- a0 G
工程设置.JPG 工程设置2.JPG
7 ], F2 X, Z5 W! G( y  O7 Q' [至此Cube设置完成
# U% [2 W1 T2 [- H# v3 @/ a8 @0 B" f9 _; v1 r; Q- ^
附部分代码,特别说一下DMA采集函数里的ADC_ConvertedData[(ADC_SAMPLE * ADC_NUMOFCHANNEL)]这个地址,因为我设置的是半字传输,所以必须是16位,如果设成32位,数据就会异常(例如2个数据叠加)。
  1. /* USER CODE BEGIN 0 */
    1 s3 J+ Z1 |; s6 Y4 B! S
  2. /* ADC variables */; W8 ~% w& v* y6 U
  3. __IO uint16_t ADC_ConvertedData[(ADC_SAMPLE * ADC_NUMOFCHANNEL)];//AD转换结果值
    4 }% v( K" k. J: }/ X: K
  4. __IO float ADC_ConvertedValueLocal[ADC_NUMOFCHANNEL];// 以浮点数保存转换计算后的电压值
    " [+ ~* L$ B( T. M0 @' I( D. M: Q
  5. /* USER CODE END 0 */
    ( E/ X! N$ c8 P2 v% r0 f

  6. 0 e1 I, {+ V3 e
  7. int main(void)
    & y! G2 N9 G  \# i
  8. {
    5 j. p  L9 K9 @+ |4 p: A( W
  9.   /* USER CODE BEGIN 1 */# a( n0 B  m" W8 J* E" {0 v
  10.   uint16_t out_en_cnt=0;
    3 i; \% I# A2 B: q. S
  11.   /* USER CODE END 1 */8 q" ?8 [) l" H

  12. . I: W6 Q5 g/ k8 o0 A5 F% z5 L
  13.   /* MCU Configuration----------------------------------------------------------*/
    8 J, ]0 k3 t6 m

  14. 3 n' {' W3 L( A4 {9 w. |& M
  15.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    4 \/ s+ Y6 B$ l$ P
  16.   HAL_Init();4 ^, Z, r% @" u* n3 j+ a9 f, _
  17. ) n0 H! Z" h2 B8 z' ?3 s
  18.   /* USER CODE BEGIN Init */. p- U! K* c: s
  19. 3 `; z( g- ^; S7 z$ C. s, m4 j
  20.   /* USER CODE END Init */: O- P; n, O5 ^/ ?. |+ ~" s; l

  21. + g" p5 ~4 ~; w" f4 z0 p
  22.   /* Configure the system clock */
    " t9 O' r& a/ K* y+ |% Z
  23.   SystemClock_Config();6 @# w* o3 o+ U1 W; {, F' f) ]
  24. - ]& E8 t/ _, W# g1 E; l6 M
  25.   /* USER CODE BEGIN SysInit */+ q( V) b3 ?2 L) W2 {9 G
  26. ( ]% U# ?) d/ U* c/ h
  27.   /* USER CODE END SysInit */
    ( x. N& J0 L# c8 i) ?" c

  28. 1 s- b* H. I% A4 M8 F0 x
  29.   /* Initialize all configured peripherals */
    / \) M/ z) A4 N7 b
  30.   MX_GPIO_Init();
      w6 n5 R0 z4 g0 O8 g
  31.   MX_DMA_Init();  h  Q7 \9 o7 u4 ]+ c
  32.   MX_USART2_UART_Init();
    : Z* q1 R: X; ?$ M: ?3 _
  33.   MX_ADC_Init();
    " o' B5 s- W0 ]/ _. Z) O$ x. n( c
  34.   /* USER CODE BEGIN 2 */0 K3 A7 p! J9 q7 i
  35.   HAL_ADCEx_Calibration_Start(&hadc);//启动ADC自校验
    , x  l! @6 @' v6 ?* j. g; l; u
  36.   HAL_ADC_Start_DMA(&hadc,(uint32_t *)ADC_ConvertedData,(ADC_SAMPLE*ADC_NUMOFCHANNEL));//启动AD转换并使能DMA传输和中断; g2 A; C% z. R+ v  a+ P) g7 u
  37.         HAL_Delay(30);//等待第一轮ADC数据采集完成
    4 f# U9 L$ c6 G0 c/ c: h
  38.   /* USER CODE END 2 */# {) ]: n+ A3 m
  39. % q+ y- L2 d& q3 u9 d7 a! P
  40.   /* Infinite loop */
      b8 F8 C1 ~. O- e4 b) O2 ^
  41.   /* USER CODE BEGIN WHILE */7 l& D. l! k) C/ E4 L" l2 s
  42.   while (1)
    * i1 K/ g3 Q, e8 K$ R
  43.   {
    / Z$ @8 Z% S9 g$ W& e
  44.                 HAL_Delay(30);//一次采样+转换时间=(239.5+12.5)周期/14MHz=18us,延时30ms
    3 \- V5 d6 b) e2 _( `; ~
  45.     adc_getvalue();- C" R# I% q7 v6 S; v' e
  46.                 2 j1 j$ N% @/ }! O* B6 U. [
  47.     if(++out_en_cnt == USART_TIMES)4 l* }/ V; v- d  A# _
  48.                 {$ _! g7 Z) v4 B" L# T7 n; g
  49.                         out_en_cnt = 0;5 e1 s+ x  z: }: _+ I
  50.                         HAL_Delay(500);
    . s3 c% K: g; u; R
  51.                         printf("CHANNEL_0:%.2f\r\n",ADC_ConvertedValueLocal[0]);+ r7 P0 _$ r5 O2 P* z! W' x
  52. }4 g6 w3 f% V' r+ G
  53. }
    & S  I) g7 @; j! e3 _5 ~% h4 Y
复制代码
) b8 p3 m8 M* g$ i0 j$ q! S! s5 N# F
最后,附完整工程。
/ ?& X9 q' O  w* b/ r. T- M) [
4 `/ D0 B( @4 P" x' k" A) ^' U! W$ m0 ]- ?
' J' G( q& T7 B

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
* O4 }/ B# ]! O0 X4 f) c/ }, ]Cube软件用的爽啊,开发效率高
# R% Y  @8 }* }+ @; ]: Z
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
收藏0 {% X3 @4 r! n1 h

所属标签

相似分享

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