请选择 进入手机版 | 继续访问电脑版

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

Nucleo-32F042K6 DMA采集ADC

[复制链接]
电子星辰 发布时间:2018-6-20 11:10
本帖最后由 电子星辰 于 2018-6-20 17:05 编辑
: ?0 d2 X% C& |+ n1 Z1 X8 K9 Y% O) s3 o1 U1 `9 H3 c/ l& f, c1 b; T
这是一个基于STM32F042K6T6的Nucleo板,使用Cube配置,通过过DMA连续采集较多采样数的ADC单通道程序。1 H, b- V& F* d4 x
" c) ]. V3 @; I
首先先在Cube新建工程,选择Board Selector标签,在搜索框里打042即可。/ w+ X; `1 T  r( [! l
新建工程.JPG & y; G) f& i& K9 }* r8 `' W  o# `. {
/ W& J$ f, w$ O; F8 T) S
选择之后会弹出一个选择是否初始化外设为默认设置的弹窗,选择“YES”的话,时钟、串口、调试什么的它就给你设置好了。选“NO”就全部自己设置。这里我选的是YES。
2 c. F1 K- g4 [ 初始化选择.JPG
# y/ y4 Q+ F, P; J) [. K" H3 j8 w+ o' d8 t0 r0 V  V6 {
“Pinout”标签页里的串口默认设置就可以(Nucleo板042K6是使用的USART2,就那个MicroUSB接口,既可以下载也可以串口传输),ADC中勾选IN0。" r& c0 j4 }" k7 v% x6 _- u2 o
串口pinout.JPG
: Z7 o9 q% D* D% k9 Z) w1 t ADCpinout.JPG
6 G2 S/ C: f  k; p3 d9 N 芯片pinout.JPG
' g/ t9 V' {2 z, }, ~: S
  d4 l) W/ ~4 u0 r1 ~( g$ ^“Clock Configuration”标签页里,我喜欢主频设为最高,直接把HCLK改成最高48然后回车,它就自己给你弄好。
( \+ Z! O1 X6 j2 a  m3 H 时钟设置.JPG
0 X. V7 f  O8 Z* {, e- t. m) V5 u$ c8 r6 o" p$ d
“Configuration”标签页里,先设置USART2,参数设置如图,因为我不需要接收就不勾选中断了。) f1 R+ [  U2 ^1 Z3 J
串口参数设置.JPG ( J2 V; S( ]1 I/ M; h
ADC设置我先要添加DMA,模式选择连续模式Circular,这样就在循环前设置一下,以后直接取数据就行了。数据长度DATA Width一定要注意,12位的ADC两个都选半字,在代码里只取12位,如果使用全字然后代码里又没取对,那就会数据异常。
& E: B$ e- K; ^2 B: F0 Q ADC的DMA设置.JPG 8 P: G! }9 u2 ^2 e: u8 Z3 l
ADC参数设置.JPG 3 P! z9 h! {$ r6 p8 k; a# \5 p

, [/ [1 e0 |/ A最后是生成工程,点击图中红框图标,第一次会弹出设置窗口,以后再点会直接生成。如果想再设置,就在菜单栏里的工程菜单里点设置。* ~8 F# F7 S8 v
工程设置.JPG 工程设置2.JPG ) z6 J" \2 B2 P# S+ P8 F1 R
至此Cube设置完成# z" c/ N5 d! N
% w: E; V* P# U: D5 Q/ r
附部分代码,特别说一下DMA采集函数里的ADC_ConvertedData[(ADC_SAMPLE * ADC_NUMOFCHANNEL)]这个地址,因为我设置的是半字传输,所以必须是16位,如果设成32位,数据就会异常(例如2个数据叠加)。
  1. /* USER CODE BEGIN 0 */
    ; S. e; e# O! E
  2. /* ADC variables */& \- j( y# g2 G- S. b: L, H
  3. __IO uint16_t ADC_ConvertedData[(ADC_SAMPLE * ADC_NUMOFCHANNEL)];//AD转换结果值
    0 f, X& T% A2 u  u" \: R
  4. __IO float ADC_ConvertedValueLocal[ADC_NUMOFCHANNEL];// 以浮点数保存转换计算后的电压值
    - E) ~- |9 S9 Q% }- Y  j
  5. /* USER CODE END 0 */1 [5 I) c* B+ m, [4 m3 v. V4 g
  6. # R& z& u* E* v
  7. int main(void)
    : d" k( ^; T1 j  t
  8. {/ C/ t7 A# f0 E% C0 O. P
  9.   /* USER CODE BEGIN 1 */7 V8 i- R, O- U2 h8 g
  10.   uint16_t out_en_cnt=0;1 v! Q! Q8 I3 e) Y9 H
  11.   /* USER CODE END 1 */
    / b+ u& X& x( g3 L) ]7 {! ^+ t9 a

  12. : W4 u0 B/ d* H3 t$ X7 E
  13.   /* MCU Configuration----------------------------------------------------------*/
    % D# g; y$ S9 \3 S) B7 e. V8 N3 t
  14. $ y+ ?4 U. Q% n' m
  15.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */0 l" O: U. g0 W+ }/ v( p; ]
  16.   HAL_Init();( G, ]' I8 G" I% U+ v" |

  17. ; v+ j  X" V/ h
  18.   /* USER CODE BEGIN Init */! [5 R- w8 e* T  V: A

  19. ; h& X6 i# d$ u' }( e8 w6 ]
  20.   /* USER CODE END Init */1 _& }% e. E: U; X1 A# C1 K

  21. ; y# p0 F' A* R  V0 H/ [
  22.   /* Configure the system clock */
    * S9 I, y% t3 M
  23.   SystemClock_Config();; f7 O: z) ~3 [7 O
  24. 7 c& r# F' o" j3 i0 P( h- _; }0 P
  25.   /* USER CODE BEGIN SysInit *// j8 ?2 |+ x, t

  26. 7 b: g- V5 K( M) V
  27.   /* USER CODE END SysInit */( J; Q) k3 j& L- u

  28. 7 j5 {5 J  k1 E9 A
  29.   /* Initialize all configured peripherals */
    ' Z; a* I/ h' c% Q6 A% v# y# w
  30.   MX_GPIO_Init();3 ]/ }! N1 C/ G' u
  31.   MX_DMA_Init();% d1 @' W4 o& z, \! M1 P. t
  32.   MX_USART2_UART_Init();& j4 b$ T2 g5 A( l
  33.   MX_ADC_Init();
    ' _9 Y- K- E! d3 z. ?& D3 X
  34.   /* USER CODE BEGIN 2 */
    " t$ z) Q* [% W- H8 v# O7 `
  35.   HAL_ADCEx_Calibration_Start(&hadc);//启动ADC自校验
    $ H( [, Y  i0 \3 W) m
  36.   HAL_ADC_Start_DMA(&hadc,(uint32_t *)ADC_ConvertedData,(ADC_SAMPLE*ADC_NUMOFCHANNEL));//启动AD转换并使能DMA传输和中断9 [4 V" Q" Y1 O2 u
  37.         HAL_Delay(30);//等待第一轮ADC数据采集完成
    - c4 b8 s! ?  B7 X* u% J  t
  38.   /* USER CODE END 2 */2 u, r$ D4 O, R( w3 u
  39. ) E2 z3 B% L8 I9 l1 l  J
  40.   /* Infinite loop */
    ! o( S- |8 G1 I, u
  41.   /* USER CODE BEGIN WHILE */) ~4 v+ H: A# E" U0 ~
  42.   while (1)9 U" F, A$ e- r5 j; k( |+ I( n! j
  43.   {( Y  e! y' i% B" W8 B; P( J& p
  44.                 HAL_Delay(30);//一次采样+转换时间=(239.5+12.5)周期/14MHz=18us,延时30ms( ~, U, k. l) U' o; h4 ~% o8 D; ~
  45.     adc_getvalue();" x' P7 o/ t1 ]5 l6 `! _& K, B) J- m
  46.                
    $ d: R2 ?+ ?1 k  Q' j6 D
  47.     if(++out_en_cnt == USART_TIMES)
    : s& O! M: L' U! X. T6 D) w
  48.                 {/ X1 x5 o& I. @! U# N+ w
  49.                         out_en_cnt = 0;2 q8 t! o8 e5 X  p" b. o  x7 l
  50.                         HAL_Delay(500);
    9 G% R; a3 h: [; g+ N
  51.                         printf("CHANNEL_0:%.2f\r\n",ADC_ConvertedValueLocal[0]);2 k9 L& J/ H2 l) l' `- m
  52. }# P& o4 p3 w- \' t
  53. }5 T" V  B$ T8 t" z6 q
复制代码
/ Z4 L2 m# A4 g; ~1 w: `
最后,附完整工程。
. [: C) g0 h3 a2 \
' F% S* p' K3 l4 R* N. B6 H3 p, g9 V
0 Q& l. \) V% s" p) K5 ?1 ^' X7 K) b) o

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
7 n& c3 `7 M  b* p6 ]Cube软件用的爽啊,开发效率高
. \; y3 n4 A5 x- \( P
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
收藏  E* `( y1 S! {8 z7 R; {

所属标签

相似分享

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