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

【实测教程】STM32CubeMX-STM32L4之研究(ADC)

[复制链接]
STMCU小助手 发布时间:2023-1-15 00:07
一、开发板平台简介:
; Y! Q+ c% @5 {. [1、开发板资源简介
# [' x0 ~) ?) w( e: E
(1)开发板主芯片型号:STM32L431RCT63 C5 |9 p( {. ]* ~8 ]9 p" m
(2)开发板主芯片封装:LQFP-64_10x10x05P
0 s' M  S& x' P8 e" c9 Q(3)开发板主芯片内核:ARM® Cortex®-M4
9 r  V% ^) ?% r5 r4 r(4)开发板主芯片主频:80MHz! c9 e# N/ a$ s2 ]- r9 i4 u
(5)开发板主芯片Flash大小:256KB
' o0 q& n" l( ^4 H0 U4 `* y(6)开发板主芯片RAM大小:64KB
% H# p: {+ _0 Z! S  N* Q. r (7)其他外设:请参考芯片手册
% ?7 V7 P  o* l8 Y( P3 j1 i, P; R/ ]8 I+ w/ }
bb91345227434ee7a43a34bf3fe366e6.png : [( _$ i/ C: [( C1 y8 R1 ?! L
​
+ @% O5 [* w7 C* P& m& } 929c0cce04aa4115a8623703982bf3e1.png
- z, L5 \6 _$ r; o5 G( @& a
+ O" V: S& g0 \
2、串口简介

$ N, x0 X9 h/ u" b         串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。
/ e) c# [! y$ l        (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也试验该串口1进行。
8 [+ e9 Y8 Z& g7 M        (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。" m9 d" S0 O6 }) [( f

. j6 @" d: u& N8 f; R  二、新建工程  U8 @( v/ b1 \! {# K
1、新建STM32CubeMX基础工程
% Z  f/ P: u# [6 L
(1)打开STM32CubeMX,点击“File”-->"New Project"​; O5 q! c4 `2 `8 o, g
6 f" o) q2 X* ]7 L
2399170347904e959c855fefd5877f84.png # U8 h6 H: u1 d7 I& l

2 r, o0 F7 D5 u: [8 X6 t9 \(2)等待打开主芯片选项界面(大约1分钟时间)。
* P1 r3 V0 u2 J8 W. L* K; V, N: H; z8 n, ]$ U/ v$ G) ~+ b' g
d74d2fdc60c9440483e2b7cf8d928e7f.png
5 T6 p3 o% N- S" W4 w​9 U7 z7 B0 f' f4 p/ n, Z! W
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处现在STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
% j7 i% P' X$ f2 }/ `6 g* Y( d0 K* J4 z+ J
7b80345238d74bea82ce70e1a348f7b4.png 8 p6 u! ?6 w5 b# a) F
​
8 m$ w- K5 q: U7 o( y(4)选择时钟源。
4 S7 W: |2 W( G9 w( @6 L* `# Q——因为开发板上有8M外部时钟,此处选择外部高速时钟(HSE)。6 ]8 O& W6 N( x
——因为我们没有用到外部低速时钟(LSE),此处不做处理。
8 h. y) B% I# }+ Q% [3 t3 i7 b! G
72119b971f62410fa8344f7f9fb9f389.png
1 c* B2 [: t2 h' f# d4 q! G​
% o- x8 g4 j/ V" R3 ^. L2、配置GPIO控制LED
3 `- |+ K6 Y" m# X# t8 Z! x$ Y备注:LED灯用来指示系统是否正常工作。& M- u( R4 r8 n, u- U8 G
(1)查STM32L431RCT6开发板原理图得LED1控制引脚为PC0,则配置GPIO的引脚PC0。% B! |% [% i! O1 C1 f+ v' ~- H, B
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。
# {% R5 b+ a& ~/ ?: o
0 C5 x$ K9 O5 A
492907c1e71149819adbaee4516a2af4.png
* l& G7 A3 z/ V1 }5 Q. U$ T ​1 A% U4 r0 N, p$ I5 c2 F- j3 D
(2)根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。​8 L' G3 A" f8 Y& P' ^+ w
* z. `: s7 A3 T' Z2 s- H
38ff4b80e1c5495ba3076a5158fd91fa.png 5 `6 V& _* x7 ]# N5 I
' V( {; @5 Z* G2 I- ?5 j
3、设置串口1参数
* `6 ^7 Z2 _8 J  m
(1)查原理图得知,串口0使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:
7 O# S. b" T0 d3 N& @. B! T
9 L, `. R) c. _" w! O
497b8ee0243e446784e64a3c31e8a26f.png , Q7 T( J' H3 {+ Q( ^2 {
/ n! u1 J9 H, L3 Q( Q! V, [
(2)序号1用来设置串口收发引脚的选择。; W4 o& X8 Q; j. A4 j) m  j
(3)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。' A) Y. M1 r( S, x5 w" ~2 ]5 d
; Q4 s- \4 D# b1 p- c+ Z& e5 w
4、配置ADC(单次转换模式)& W* a( {$ R- _7 c# h. E- z
(1)ADC简介:
8 }- u" ?8 F; V☆ADC全称 Analog-to-Digital Converter,即模拟-数字转换器,可以将连续变化的模拟信号转换为离散的数字信号,进而使用数字电路进行处理,称之为数字信号处理。: ^8 e6 A! ?0 g; j7 D$ R& A+ Y4 H
' k4 S6 G3 ?) K) q" c: g
☆STM32L431xx 系列有 1 个 ADC,ADC 分辨率高达 12 位,每个 ADC 具有多达 20 个的采集通道,这些通道的 A/D 转换可以单次、连续、扫描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。
& p3 K0 ~# ]% G" g, ?2 T" ]3 ]* F: n  |6 w
☆STM32L431 的 ADC 最大的转换速率为 5.33Mhz,也就是转换时间为 0.188us(12 位分辨率时),ADC 的转换时间与 AHB 总线时钟频率无关。
) z6 V+ q7 O9 c  q+ ]
) B% A, I7 ^* w+ R6 j(2)首先选择ADC1,开启通道9- t! c' F7 t( }9 `

3 t; \4 [7 Z& E8 ?
f31d2998798b4294a5efa1cda1de7c31.png
; n- o1 K* q+ Q, j
2 g: b* h. ^6 T/ T" D
(3) 进行ADC配置,这里保持默认即可。* Y3 E9 I6 n: r# R. H' G
4 g5 w. \6 o2 }0 K
01e7319ac29443dda07463a86cb4343e.png
+ H7 q1 Y5 S/ v0 M# ]' M
( J  ?- ]$ i2 z- G  G" o6 w! }(4) 配置ADC的转换规则,选择channel95 \4 p; g* n1 q( E! n
/ e5 t5 B, R* l7 F( C+ _! d
5092b6c6ba3644239c3805164afda05b.png
0 h! A) ?6 k! g6 @. z8 g8 r% Z  Y3 \
5、配置项目工程参数
( E  F' _, K* j; m. @3 W(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。1 K3 F3 x0 ~: h

( O  ]$ s" L$ Z% V. R) \! ~* m
9cfb5e43f4b945c491d1ffa27f1e3284.png 7 k6 N' h: @( r5 u8 }# m/ Z
​
1 {$ e1 W) }' n7 Z% F- u(2)完成配置工程。
8 V3 }0 G. R" I, y2 [备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
/ v( t) s+ ]+ [: q) I. Q1 Q+ w) t
' K4 [6 w; Y3 Z% u- T* s5 k8 P
efdb616174f54925b6eac31109f227b5.png : f4 q' Q& W- m& Z( N) R
​$ r* j+ d! E5 v1 y1 W/ _' ~
41c3f2716e4e4eda8f62fa3a1d871322.png
& y0 V$ u1 v: s, L, n1 l: w
! H4 n6 L) l8 l# ?$ o
(3)生成代码。. Q5 |! z$ m! z9 q& c

8 s% n) H3 |. B
8eaa7d0babea40ee93f158481a6ee471.png % @, n, k  }4 Q
​8 W1 m- F/ U2 W1 z3 U8 l
三、在KEIL 5中编写代码
" u- d9 _& `; q# z# T! ^1、使用KEIL 5(MDK)打开项目工程文件
  k! g; V0 n, y9 V& u0 r
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程。+ B' ]) h' K8 I* x* M

( J9 f, X( K' X1 g+ C$ z, u
c4c0e8cadfbb4646acf84aca2c5938b4.png - t& q3 `+ X3 f) s3 h2 O& z& E
​) W% q. {# `* P5 c$ ~
2、 添加LED系统指示灯提示1 G4 K$ [9 P1 n( {0 ?0 Y4 D7 I
(1)添加每隔500ms,LED1闪烁一次的系统提示,用于提示程序运行正常。' V0 V! T1 R% g1 v# H

2 m% i4 Z5 L0 |5 Q9 a
6ab72ceaeb7a41af833842fe5ba6f34d.png # F3 Q; E  Z1 L$ {9 o' }3 W6 X+ [
​
/ Z9 k+ d) w/ g  t  m
2 W% k, B% p3 W  {* t% G3、添加ADC相关函数代码
4 j) @! z  e0 \
(1)在adc.c文件中添加ADC采样函数,返回值即是ADC的电压值
' Z+ G3 B* c+ V
  1. /* USER CODE BEGIN 1 */) _3 F0 U: V# O7 ~0 Y. t7 N' f
  2. , O& r  n1 R0 ]' P" `% i
  3. /* USER CODE BEGIN 3 */! y$ A+ c" ?5 h( L+ C  v

  4. % s- E4 g! h9 B9 I
  5. /***************************
    9 m8 i" {7 N5 D' B+ h) i! s
  6. *函数名称:uint8_t z_ADC_sample(void)
    * X( C4 O4 u5 l% l/ B
  7. *函数功能:获取ADC采样电压
    ) v9 W. ^' ^# S# U
  8. *返回值:返回ADC电压8 z- W! H  `- c( e$ o* \4 |, r9 c
  9. *备注:
    / A* ~% o5 z" |1 ]
  10. ****************************/
    , X  R; v1 g$ w3 C# ?; K2 B
  11. float z_ADC_sample(void)- z" L2 X1 k& h
  12. {               
    ( @3 `5 E: v, |8 l6 Q8 u+ m
  13.                 uint16_t adc_value=0;                                                  //ADC采样
    , z- f, f6 z& J+ S* F4 S
  14.                 float adc_vol=0.0f;                                                                //ADC采样后转换的电压
    8 N  w6 w0 L. U
  15.                 for(int i = 0; i < 4096; i++)7 ~. n- ?0 S% }# |
  16.     {% L! C9 W. ^4 N" p
  17.         if(i%1024 == 0)2 @9 y3 H. M9 ~0 l  P1 ^( d1 }$ g* b# G
  18.         {
    7 F  g% {" ]' |+ `! W5 F
  19.             /* 使用ADC采样 */  K5 v8 c$ [$ d: I7 q0 w% `
  20.             HAL_ADC_Start(&hadc1);                        //启动ADC单次转换" I( N; r( c( q4 ]
  21.             HAL_ADC_PollForConversion(&hadc1, 50);        //等待ADC转换完成
    " N1 f" }0 E- }
  22.             adc_value = HAL_ADC_GetValue(&hadc1);         //读取ADC转换数据
    ' I' r5 z0 v& [
  23.                                           adc_vol = ((double)adc_value/4096)*3.3; //转换为电压忿
    % w+ m, R2 I  h+ d
  24.         }0 A! N# M( O) F1 G
  25.     }
    ' W7 c5 J1 w, Q; a- l
  26.                 return adc_vol;  h6 k( U' Z, [. o
  27. }  : k6 `  _6 T8 Q* \0 Q( s* \0 n
  28. : m2 S$ q$ A5 H# |4 ^7 i/ c+ T( h
  29. /* USER CODE END 1 */
复制代码

5 G. Q8 t& K5 `3 q- q2 N(2)在adc.h中添加外部调用所需的函数声明。: _: }% ?% ]' l: q, A6 b5 d+ Y
  1. /* USER CODE BEGIN Private defines */3 x8 ?! \# \8 K0 z) a9 K
  2. float z_ADC_sample(void);1 \$ m$ y# P+ J
  3. /* USER CODE END Private defines */
复制代码

2 o8 y( U/ P! c4、添加使用串口发送函数打印log的代码; w4 _+ Q1 j2 a+ \
(1)STM32 Cube函数库的串口发送函数分别为:
& s7 W6 ^; c0 r1 z& [9 T
3 O% j# M6 N. G7 IHAL_UART_Transmit、HAL_UART_Transmit_IT、HAL_UART_Transmit_DMA。本例程为串口发送函数HAL_UART_Transmit的展示。2 W  r0 u% M! K/ r0 s9 f
  1. HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size, uint32_t Timeout)* k) q1 E5 w% v$ r. Z& W9 o: l
  2.    
    8 q5 X7 ~3 U2 t# C2 D% v9 d* P( a; V$ C
  3. HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)
    1 R' M) I3 Z9 @/ R

  4. . o( }7 `# A3 X. J) O$ N4 g
  5. HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)
复制代码
( n* E8 R. G  B$ o* F0 D
(2)添加串口函数发送数据的log。; m* d0 E1 U7 J8 A" h9 a3 D
' D9 o- R) i, u: s+ X  B, U# w
6b0880ff9a7e44c18ba92b20895fa204.png , U0 _) w5 e- @  ?5 b4 g
​
- m' _) l5 @) M* Y1 z9 |9 v
  1. while (1)
    % X. I% v  P/ C% e" Q
  2.   {
    7 F. d/ u7 h9 |0 y. r9 U( Y
  3.     /* USER CODE END WHILE */
    3 \* v( R1 A# s* y# w* t8 \( q

  4. 7 d- b- x! b  |. ^
  5.     /* USER CODE BEGIN 3 */
    3 r' |; Y. x* [- x. U6 a/ P" V0 ^
  6.                                 HAL_Delay(500);
    * y# M  y  r, f8 M# c* ]! J
  7.                                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                //控制LED1反转
    2 ^+ u3 L$ o8 ^1 ^  D+ B
  8.                                 HAL_UART_Transmit(&huart1, (uint8_t*)"hello world,this is Transmit function!\r\n", 100, 5);
    * w2 a- K. ?% K3 x( {, d. r# s
  9.   }
    % t9 p1 R& A& M* L$ U
  10.   /* USER CODE END 3 */
复制代码
* H) B4 y! N4 b# c
(3)在main.c中添加调用和打印语句。
+ i* t* @8 {- P* C- X% x. c
; m: o5 `5 t+ Y$ Q
  1.   /* Infinite loop */
    $ }+ ~! X6 a5 Q4 t/ ^# P7 G
  2.   /* USER CODE BEGIN WHILE */) [4 a- l$ w# W7 d% g2 z
  3.   while (1)
    + |0 A: Y! B, ^7 R
  4.   {
    " _) l. x/ r% A/ ?6 I
  5.     /* USER CODE END WHILE */! @$ ]# }' o* k. K# d

  6. " R3 _3 B  U4 y' z$ Z/ `, J
  7.     /* USER CODE BEGIN 3 */
    ! J  \/ N) I5 C
  8.                                 HAL_Delay(500);
    . c* W5 \# N3 C3 N$ B1 K
  9.                                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                //设置LED1反转, n9 s/ L4 s0 h# \) g& Y1 B5 m
  10.                                 adc_vol=z_ADC_sample();                      //获取ADC的vol倿
    9 N) R4 n& ~" P
  11.                                 sprintf((char*)str_adc_vol,"hello world,this is adc test,adc==%.2f\r\n",adc_vol);                       
    2 v8 y% S! U" }- M+ T
  12.                                 HAL_UART_Transmit(&huart1, (uint8_t*)str_adc_vol,100,5);
    # |" T6 z6 i) F0 |3 [
  13.   }
    8 f+ v' q: m) ~$ [2 B4 B
  14.   /* USER CODE END 3 */
复制代码
  1. /* Private includes ----------------------------------------------------------*/
    9 h7 D% B% c$ s6 N( X& N8 \
  2. /* USER CODE BEGIN Includes */" b! G7 ?5 P& J( q' s
  3. #include "stdio.h". C' p- C( _) q/ h- u
  4. /* USER CODE END Includes */
复制代码
3 M1 t) w* r( j6 g% }& l' u4 ?
5、设置编程仿真下载模式

7 s2 n% N+ Z" y3 h7 ]4 ^5 i& j(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。+ k; E0 _  z% m# a, R- P
6 E: x$ @( z, i/ Z3 k( i
edefb6b9a2a14be3b1221ad6d5c7a8a2.png
* M! t  k* E" T) n2 t( s/ [​- A* B- M4 I6 q8 G; i
(2)点击Download(或者快捷键F8),即可下载程序。
/ o% N: M5 V( D+ B$ c  }5 F2 N  N4 w9 f, j9 u. l4 A0 v( y
ba221842d5db40808aa129dd83c593d0.png
0 ^8 h' l* w& E& r) F​
& M1 C6 D. E  o0 w1 R(3) 如果下载程序后,没有看到LED1灯闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
* V* w; [. P4 ?/ R: D! l& N) F/ z- x! s5 g, e# f4 u' i
9f8aa1a4e8f04041bcf5cb183facd100.png - t, n! P4 _4 L, q3 v( G/ y
​' p# N( S  G6 _+ n0 J
6、查看串口发送函数打印log效果9 J9 B' }3 ?, `9 \$ L4 C; V
(1)设置串口助手参数为:115200、NONE、8、 1(和代码中串口初始化参数一致)。
0 d( ]& @# ^: e2 Q$ m(2)设置成功后,就可以看到串口打印的效果。每隔500ms闪烁LED1指示灯一次,且串口输出一个log。
* C! v4 S' |0 F9 z备注:PA4接GND的时候,输出值为0V,PA4接3.3V的时候,输出值为3.25V。" e! t9 h9 ^, H0 `( v

& b, X0 Z* \  ]/ P* l! K: p c36c94b1faa644f89200cbd7d8cac7be.png & g6 L/ n' ~* H6 c; |+ E; B
: `+ ]; k# I. r/ ]! E
————————————————
) a9 c( U7 O, z  H" p版权声明:智能小屋ZYXC" c: t! o! x! ?8 v, p; M& h! x& u

: l3 F8 t2 o/ `7 t4 V; F) u# q
赞 收藏 评论1 发布时间:2023-1-15 00:07

举报

1个回答
crkylin 回答时间:2025-3-24 13:26:32

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版