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

Nucleo-32F042K6 DMA采集ADC

[复制链接]
电子星辰 发布时间:2018-6-20 11:10
本帖最后由 电子星辰 于 2018-6-20 17:05 编辑
2 m9 ?# c1 W  `9 P! K5 H) p/ U
# o/ `4 P9 u! ^- a) g' `4 L这是一个基于STM32F042K6T6的Nucleo板,使用Cube配置,通过过DMA连续采集较多采样数的ADC单通道程序。' W% `2 `2 C" Q$ B* S, y8 N/ P$ G

& |. M) ~2 H  N' G$ F! N: ^8 @) B首先先在Cube新建工程,选择Board Selector标签,在搜索框里打042即可。
* l* I* j8 \, a# C" Y9 ^ 新建工程.JPG $ q  E" g; d: I, `" R/ y

" _' ]& Y6 u7 _  o1 Q( D, t7 l0 ^7 O选择之后会弹出一个选择是否初始化外设为默认设置的弹窗,选择“YES”的话,时钟、串口、调试什么的它就给你设置好了。选“NO”就全部自己设置。这里我选的是YES。
$ u! ~$ H1 s. Q% [" p7 K 初始化选择.JPG 2 k6 d% p. Z/ P" T4 ]
6 N* S* v5 w. L7 ], w# Y
“Pinout”标签页里的串口默认设置就可以(Nucleo板042K6是使用的USART2,就那个MicroUSB接口,既可以下载也可以串口传输),ADC中勾选IN0。
5 }: a: \8 n6 i 串口pinout.JPG
+ d8 p+ `# _4 H/ g# ^+ N. l8 G5 [6 D+ A ADCpinout.JPG
7 a: t1 B$ r, F0 H 芯片pinout.JPG . V7 ~' I0 v3 i: h7 t0 ?

9 H- D* E  D0 [  h: B9 {) v9 {“Clock Configuration”标签页里,我喜欢主频设为最高,直接把HCLK改成最高48然后回车,它就自己给你弄好。
+ q! f  i& b5 m' G$ X- d 时钟设置.JPG 1 A1 F3 v; I; g0 y! W) F% {+ i

, q8 g3 c! a8 s% V" i0 P4 x“Configuration”标签页里,先设置USART2,参数设置如图,因为我不需要接收就不勾选中断了。0 K7 [/ o2 S" f
串口参数设置.JPG
: `7 l# |! y; Y0 x) NADC设置我先要添加DMA,模式选择连续模式Circular,这样就在循环前设置一下,以后直接取数据就行了。数据长度DATA Width一定要注意,12位的ADC两个都选半字,在代码里只取12位,如果使用全字然后代码里又没取对,那就会数据异常。
  t! v, q/ s2 k( c! W  r1 _0 Z ADC的DMA设置.JPG " E& D, d: ~* P3 w! O
ADC参数设置.JPG
! \. |# F/ j/ `4 U& I9 X  B% o: }- a. |, }6 A
最后是生成工程,点击图中红框图标,第一次会弹出设置窗口,以后再点会直接生成。如果想再设置,就在菜单栏里的工程菜单里点设置。
0 Z& z: w9 a! a  q: u 工程设置.JPG 工程设置2.JPG * f6 I7 s. c% R2 `% o  Y. R
至此Cube设置完成8 I% e( e4 d6 R! J/ Z

2 w) W3 S1 E% k# y附部分代码,特别说一下DMA采集函数里的ADC_ConvertedData[(ADC_SAMPLE * ADC_NUMOFCHANNEL)]这个地址,因为我设置的是半字传输,所以必须是16位,如果设成32位,数据就会异常(例如2个数据叠加)。
  1. /* USER CODE BEGIN 0 */
    : O$ l# N3 M. d
  2. /* ADC variables */# Q* T, b4 ~+ ?5 A
  3. __IO uint16_t ADC_ConvertedData[(ADC_SAMPLE * ADC_NUMOFCHANNEL)];//AD转换结果值
    5 `( l2 G' x3 \: E! ]
  4. __IO float ADC_ConvertedValueLocal[ADC_NUMOFCHANNEL];// 以浮点数保存转换计算后的电压值/ K/ a$ l& ]; q' N
  5. /* USER CODE END 0 */
    3 X$ {% W1 h3 s3 ~* k" e3 o
  6. # N- k  x7 [  W& p4 v8 W5 F
  7. int main(void)5 V  o; m3 a% D/ Q' z9 u
  8. {+ N- Q% f' F0 n
  9.   /* USER CODE BEGIN 1 */
    ! l/ Z& ]# S" K! @4 n/ J
  10.   uint16_t out_en_cnt=0;
    % B. s* H# b" }8 y5 d/ G
  11.   /* USER CODE END 1 */. c  _/ {3 z/ Z+ n
  12. ) y1 R$ U$ ^# u% W, i$ @
  13.   /* MCU Configuration----------------------------------------------------------*/  _5 n: A/ n! l+ z/ \' n

  14. 2 U* W2 S/ m) y4 e. n" U! M7 E3 G
  15.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */  w- s5 G' F5 R- E( `) {
  16.   HAL_Init();1 L1 Q2 B( N/ T
  17. " K( @! T. l# v8 H, X) O* a) s
  18.   /* USER CODE BEGIN Init */
    8 }1 l. X% ]6 c. ]0 L

  19.   z% _% a, D* z# f+ {
  20.   /* USER CODE END Init */
    / r4 j  b* t8 f: Q
  21. 0 _; f. l" {0 E$ Z# X/ {' V# M# A/ o
  22.   /* Configure the system clock */
    ' W# d7 x, r9 R1 x+ j& F0 J( G$ f+ r
  23.   SystemClock_Config();
    1 |4 r: N( C: P" i9 j* l  r
  24. 6 y' ]+ n$ h' o0 Z. g4 z( C5 p0 [
  25.   /* USER CODE BEGIN SysInit */
    9 x% e4 s- v. e) f
  26. ; `: O9 y4 ~! V+ U# R$ N/ H$ }
  27.   /* USER CODE END SysInit */
    : i( u& V# n; V- {9 D% }
  28. 2 y/ S0 N! {; T/ `! p$ o
  29.   /* Initialize all configured peripherals */
    4 B, Z! c5 f* t4 z1 d
  30.   MX_GPIO_Init();
    # I7 v6 W) ~6 }+ r& |
  31.   MX_DMA_Init();+ V' y2 e3 i$ n8 Z1 x$ O5 p1 Y% {
  32.   MX_USART2_UART_Init();
    " ?; z& s5 k- ]' X6 P5 A) O
  33.   MX_ADC_Init();
    & v  Z/ H  U* K# S
  34.   /* USER CODE BEGIN 2 */
    # A/ f+ g" g8 E; c- f
  35.   HAL_ADCEx_Calibration_Start(&hadc);//启动ADC自校验
    # J# {- P" Q7 U/ b% _
  36.   HAL_ADC_Start_DMA(&hadc,(uint32_t *)ADC_ConvertedData,(ADC_SAMPLE*ADC_NUMOFCHANNEL));//启动AD转换并使能DMA传输和中断6 d) l0 `8 w+ t
  37.         HAL_Delay(30);//等待第一轮ADC数据采集完成
    / I$ s4 b' A9 E) O
  38.   /* USER CODE END 2 */
    . [" u. L' J6 Z* ]/ n  h. |+ t6 G0 e  ]2 M

  39. # B) T% D% l5 a; X+ J$ }! P$ A" N1 y
  40.   /* Infinite loop *// Z6 z8 `5 Y! Z/ Y6 N
  41.   /* USER CODE BEGIN WHILE */: H: {. G: S: E7 d' C2 `
  42.   while (1)
    0 i6 ]2 t& p4 R. T0 \; r# W
  43.   {
    2 i& x( O+ l$ ^( Z' n  Q
  44.                 HAL_Delay(30);//一次采样+转换时间=(239.5+12.5)周期/14MHz=18us,延时30ms
    , z( ~: p* f( Y5 j, U1 q) W
  45.     adc_getvalue();
    + n% m* i6 _0 s# E2 B9 Y( m
  46.                
    ( s) v+ v) A1 g% }9 S4 _
  47.     if(++out_en_cnt == USART_TIMES)# d; {7 b' t1 w7 |) l2 ~9 F
  48.                 {) `0 r- |! v/ A: {5 e) u
  49.                         out_en_cnt = 0;
      `) A: j7 ]) E) v9 j/ w9 p; m3 C
  50.                         HAL_Delay(500);$ ?7 D9 V0 e0 H$ `
  51.                         printf("CHANNEL_0:%.2f\r\n",ADC_ConvertedValueLocal[0]);
    ' K0 ^$ a8 ^  d  b, o6 C  j8 A
  52. }
    : t7 S& q2 b9 {
  53. }
    ! \- [! ]5 G: `) w
复制代码
' t, s' q7 q" e4 J8 X8 N
最后,附完整工程。
7 z' I2 C: y2 V. V' r" L
; `/ F( @$ G- Q8 r7 ]5 @! j, E) Y1 `

/ R' y0 J9 G' t0 S9 F( F; _

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:524 B; N' D4 H/ I5 }3 U
Cube软件用的爽啊,开发效率高

+ K: s: b" ^2 y- K5 O" acube确实用起很方便,但感觉还不完善。有时候出问题就一直解决不了。。。
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 v% O; U( f* P9 W5 d, _
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版