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

Nucleo-32F042K6 DMA采集ADC

[复制链接]
电子星辰 发布时间:2018-6-20 11:10
本帖最后由 电子星辰 于 2018-6-20 17:05 编辑
4 ]* W! V0 f  N! Z$ A1 L# r' I, ~6 x. F# z+ j" U% p& [
这是一个基于STM32F042K6T6的Nucleo板,使用Cube配置,通过过DMA连续采集较多采样数的ADC单通道程序。* E! t6 K  M$ I: ]. x' t+ `

$ `2 k, q. y( D, V首先先在Cube新建工程,选择Board Selector标签,在搜索框里打042即可。3 W$ U: d5 M8 n# f( `
新建工程.JPG 8 u" {7 {* L8 C5 N3 d. C0 p  F; O

, L  |' a& ~, I; d  ^- i- G7 u) h选择之后会弹出一个选择是否初始化外设为默认设置的弹窗,选择“YES”的话,时钟、串口、调试什么的它就给你设置好了。选“NO”就全部自己设置。这里我选的是YES。
# i: {) P" E8 W  q, ~# u' | 初始化选择.JPG
0 f$ K! d8 u/ [; u
. U" n7 b% x& ~; Q% _; b: }“Pinout”标签页里的串口默认设置就可以(Nucleo板042K6是使用的USART2,就那个MicroUSB接口,既可以下载也可以串口传输),ADC中勾选IN0。' I7 g! ?* c% p0 W' M/ D
串口pinout.JPG # P1 M$ q& ?, Y6 I
ADCpinout.JPG
. K7 X% h/ Z5 p* I- @ 芯片pinout.JPG 0 n, M- [* N8 c

; e+ [, Z5 \# @5 z- T$ [“Clock Configuration”标签页里,我喜欢主频设为最高,直接把HCLK改成最高48然后回车,它就自己给你弄好。, G6 Z7 y& ?) ]7 _
时钟设置.JPG
5 K! X  [0 [2 w: l. ~+ ], U6 r0 v) ?  p5 S- u
“Configuration”标签页里,先设置USART2,参数设置如图,因为我不需要接收就不勾选中断了。5 X, W% N9 g7 [% L3 N: q5 H! l5 w" c8 w
串口参数设置.JPG & ~# f6 q/ U% r1 J
ADC设置我先要添加DMA,模式选择连续模式Circular,这样就在循环前设置一下,以后直接取数据就行了。数据长度DATA Width一定要注意,12位的ADC两个都选半字,在代码里只取12位,如果使用全字然后代码里又没取对,那就会数据异常。  x$ B  M; G% {
ADC的DMA设置.JPG
* z: |( N6 A+ E3 i ADC参数设置.JPG
' I' N7 v4 x, u: \) _' V- V( `: b0 j  U9 q
最后是生成工程,点击图中红框图标,第一次会弹出设置窗口,以后再点会直接生成。如果想再设置,就在菜单栏里的工程菜单里点设置。) a5 E5 V3 r% q9 l) O1 a- t# B
工程设置.JPG 工程设置2.JPG ) R  H. \# L7 _" Q( B
至此Cube设置完成
3 b8 i5 j$ y2 Q; p5 L1 J# ?' m0 n* d0 U( c( h; R8 C  e/ p
附部分代码,特别说一下DMA采集函数里的ADC_ConvertedData[(ADC_SAMPLE * ADC_NUMOFCHANNEL)]这个地址,因为我设置的是半字传输,所以必须是16位,如果设成32位,数据就会异常(例如2个数据叠加)。
  1. /* USER CODE BEGIN 0 */% x+ B0 @0 Y1 H) s; k7 v
  2. /* ADC variables */
    - P+ i+ o2 r/ a' Q9 h: v" U
  3. __IO uint16_t ADC_ConvertedData[(ADC_SAMPLE * ADC_NUMOFCHANNEL)];//AD转换结果值
    ; ~: G! }% M! z  @9 ~% l% [( ^2 O$ p" A
  4. __IO float ADC_ConvertedValueLocal[ADC_NUMOFCHANNEL];// 以浮点数保存转换计算后的电压值
    5 M! {% J, ~8 _0 o3 P1 q6 B
  5. /* USER CODE END 0 */
    . q- [5 _1 {6 c4 F9 |$ R/ F7 k# M
  6. ; ~+ `1 T: [+ x& Q4 o! X- s
  7. int main(void)0 s" B# D% B1 O
  8. {, t4 I7 g: D* @  Y4 i; q
  9.   /* USER CODE BEGIN 1 */' V/ J9 S% c7 u% V6 r
  10.   uint16_t out_en_cnt=0;
    5 P* i* ]; H( V0 z: {- e2 t& D1 @4 A
  11.   /* USER CODE END 1 */' r$ I8 D% Z# }* Y' [

  12. / G$ z1 ]- x1 ^( T- k. u& x
  13.   /* MCU Configuration----------------------------------------------------------*/
    : J6 ?: Y( U( ]
  14. 0 m/ o6 O5 z7 L
  15.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */( f, S. S& O! n$ M. |6 t/ b3 G3 h6 X
  16.   HAL_Init();
    $ M5 S6 L& x4 y8 G5 N0 O

  17. 5 D) B! W. i! V- U/ _
  18.   /* USER CODE BEGIN Init */
    $ u' B8 Z* w% L" P! S6 s5 p) u

  19. 7 Q* Y) G" o# I3 ~! P4 o. I
  20.   /* USER CODE END Init */
    & d$ g+ }) v: r
  21. 0 W' x3 h' V5 n0 M
  22.   /* Configure the system clock */
    : [, v- _9 [8 S1 }# d& f* s
  23.   SystemClock_Config();' ]+ z# k/ g8 z* R- Q/ T* P" E
  24. & H# f0 a: H1 ?4 p1 W2 B3 Y' j
  25.   /* USER CODE BEGIN SysInit */
    ; ^" t- w: X9 N7 K$ w. W; p
  26. % B8 `/ F/ d* h
  27.   /* USER CODE END SysInit */
    - s7 V; k7 }; @! t1 s2 C+ ]# o/ H
  28. 0 `0 C$ H) ~+ M  k& J
  29.   /* Initialize all configured peripherals */: c+ ?: @' S8 B) c3 c/ {/ ^
  30.   MX_GPIO_Init();4 t1 l- x9 y& Y. W( m, O
  31.   MX_DMA_Init();
    1 ^) J3 D0 G! k0 M7 ]5 c- ~
  32.   MX_USART2_UART_Init();
    . w: M# C: U" k+ ?! @  g1 f+ B
  33.   MX_ADC_Init();
    8 Y0 \# D4 P8 z# b* S
  34.   /* USER CODE BEGIN 2 */! ^+ l5 T$ X9 {% c5 q
  35.   HAL_ADCEx_Calibration_Start(&hadc);//启动ADC自校验
    - p  B; ]' A& p) b6 v( T
  36.   HAL_ADC_Start_DMA(&hadc,(uint32_t *)ADC_ConvertedData,(ADC_SAMPLE*ADC_NUMOFCHANNEL));//启动AD转换并使能DMA传输和中断$ P( X, A" }' \8 G' z) N: @
  37.         HAL_Delay(30);//等待第一轮ADC数据采集完成
    8 J! J7 q6 N( C- N6 q
  38.   /* USER CODE END 2 */
    0 @, V4 K4 k& C  y& ]1 N

  39. ( [# U3 U: M+ }, y
  40.   /* Infinite loop */
    ' d, m; g% H, P+ o1 k  x
  41.   /* USER CODE BEGIN WHILE */
    1 M6 Y' |! R: ]; ^  J
  42.   while (1)
    ' D) X* J0 p8 ~- i. g0 T+ D
  43.   {
    ( s  S) X- G" y, x
  44.                 HAL_Delay(30);//一次采样+转换时间=(239.5+12.5)周期/14MHz=18us,延时30ms
    : `$ D: l8 U. `, T8 @. R% Z2 J
  45.     adc_getvalue();
    ) y6 F1 \8 K" U- d4 Q2 G
  46.                
    ! I/ r% v2 q6 ]" Y
  47.     if(++out_en_cnt == USART_TIMES)- r, P" c% e4 D* a+ m! q7 b8 T/ m
  48.                 {
      m& H8 t3 c4 c% r8 J: s) t
  49.                         out_en_cnt = 0;
    7 ~1 Y- x0 f6 F3 v
  50.                         HAL_Delay(500);) ~) S0 V" e6 @; j# U& `
  51.                         printf("CHANNEL_0:%.2f\r\n",ADC_ConvertedValueLocal[0]);
    8 T( ?  O' ^. @' ^$ v7 O% @
  52. }
    # Z. N0 j9 G* X7 l3 q
  53. }4 E# [  `$ Z1 d1 _( A
复制代码

/ o* Z2 d# J* z7 c, c1 Y最后,附完整工程。* o/ Y. Z6 N* q7 f, J( Q
1 T9 V; Q9 E+ G( i

3 Y* S9 V4 V7 ~* u6 g. [7 ^4 N3 `7 d% 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
5 ~/ Y/ g& X. ^( LCube软件用的爽啊,开发效率高
$ m0 X9 P' M- c4 P, X! {( 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
收藏
3 \# o# j3 [; z5 G1 O7 N- Q

所属标签

相似分享

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