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

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

[复制链接]
STMCU小助手 发布时间:2023-1-15 00:07
一、开发板平台简介:3 w  k3 z' |3 C6 u5 W
1、开发板资源简介

2 }. J5 G: _- B" I(1)开发板主芯片型号:STM32L431RCT6
" l7 I2 i* @. D: @8 T(2)开发板主芯片封装:LQFP-64_10x10x05P7 f! P) p( v1 Y" E! o: u
(3)开发板主芯片内核:ARM® Cortex®-M4
" ?) N6 e$ c+ k) {) c- }5 a' g(4)开发板主芯片主频:80MHz: `# d8 c! s" L6 \) _2 F5 Y
(5)开发板主芯片Flash大小:256KB$ k$ l0 t+ W# _" L& K& w
(6)开发板主芯片RAM大小:64KB
! i1 x9 E, y3 q; s4 t (7)其他外设:请参考芯片手册% v  W) q( L) b1 Y
* }, g+ c& V0 B; f1 }" W8 h3 a
bb91345227434ee7a43a34bf3fe366e6.png $ n9 P+ J( x4 V
5 v- {3 I& L: V& u/ j2 a
929c0cce04aa4115a8623703982bf3e1.png
8 n2 t5 K; o- R/ j5 X7 @
# c: \0 t8 B" t; V7 x
2、串口简介
7 T! X6 S& L; x) X. @8 y9 z7 j
         串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。; l$ `2 o% [+ B. Y* A: l3 w8 d# b
        (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也试验该串口1进行。3 T9 [) A8 E* p# ~
        (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。
" e3 ~; _2 ]. B# N/ D2 q) p. G3 O
, U$ O6 F" `9 [9 e
  二、新建工程
' @: |4 y8 {# t$ B# L+ q1、新建STM32CubeMX基础工程
- s5 E3 P+ Z6 r/ V, V( r
(1)打开STM32CubeMX,点击“File”-->"New Project"​
, a/ A! j; ~: f
/ O8 }. n5 o, i4 U% B7 i7 ~
2399170347904e959c855fefd5877f84.png & D9 f& Y- Y* g6 E" M+ W% m+ s
! s5 ^- I2 ?% I) |; f, ~$ e
(2)等待打开主芯片选项界面(大约1分钟时间)。9 u2 t  Z5 ^+ _
& [% l& Y5 |2 C) U* w  n
d74d2fdc60c9440483e2b7cf8d928e7f.png ' @, [7 h2 N! a" s" x

. s  u1 f. y4 Z(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处现在STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。$ p9 c6 m; T0 P9 D8 ?; H% @
& Z$ G) B$ y0 i1 N# b
7b80345238d74bea82ce70e1a348f7b4.png
  C- q) p9 m! O9 R4 H2 \2 }
& S: e. v6 c( e; ~% @; y(4)选择时钟源。
! L, l8 ^# L& m——因为开发板上有8M外部时钟,此处选择外部高速时钟(HSE)。
4 j' w; O' k$ g% T6 `' @——因为我们没有用到外部低速时钟(LSE),此处不做处理。+ \( n6 J- Y1 w* H1 t
' x) H: W4 S5 ~) R) t4 R
72119b971f62410fa8344f7f9fb9f389.png $ M2 _: e( v& s  F, o2 t, D* w6 t

% L+ z9 b3 j4 `) G  }; N3 H2、配置GPIO控制LED: a- r# B; N3 ]% V- D2 q2 t3 P
备注:LED灯用来指示系统是否正常工作。& _4 Y' m: L* I
(1)查STM32L431RCT6开发板原理图得LED1控制引脚为PC0,则配置GPIO的引脚PC0。" v: S7 j; {' l- |6 S
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。
& t3 H8 g( l0 X% K7 \1 K9 F6 m" P
8 G9 v. i9 Y' `4 K% W# M6 k
492907c1e71149819adbaee4516a2af4.png
2 r6 b, I) {* l; l. {" K, x+ K3 b, }7 l0 O# f
(2)根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。​
! f3 }* `- ~$ b! ^
- O+ E7 r2 F0 t' G7 Z$ {
38ff4b80e1c5495ba3076a5158fd91fa.png + j8 B1 e2 W+ Z& m! t
6 d% R6 M4 G$ h: J. x
3、设置串口1参数

! }1 L$ d& p8 Y6 R0 z(1)查原理图得知,串口0使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:' A9 N: b" R3 j( [8 s" t

3 {. p$ r/ F9 f8 x; x; v
497b8ee0243e446784e64a3c31e8a26f.png : o: Q+ m& u8 _& w5 M7 r
# y: P  h" t8 ^3 S- u+ u7 h" L# v
(2)序号1用来设置串口收发引脚的选择。2 g$ x2 p7 Z: e9 d, x% ?
(3)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。
- k  f; d. J" U- F
: D6 [2 b$ D& }3 _& l4、配置ADC(单次转换模式)
. J& t9 X) R" f" D, d8 m(1)ADC简介:
' T# e4 b. x; I; C☆ADC全称 Analog-to-Digital Converter,即模拟-数字转换器,可以将连续变化的模拟信号转换为离散的数字信号,进而使用数字电路进行处理,称之为数字信号处理。1 G5 ~$ l/ n% [; o0 ?; O
) d8 I7 T) k& N* R* `; R& u* o7 e
☆STM32L431xx 系列有 1 个 ADC,ADC 分辨率高达 12 位,每个 ADC 具有多达 20 个的采集通道,这些通道的 A/D 转换可以单次、连续、扫描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。
9 _; H- u7 L8 U2 }" ^4 V
' P3 i0 ~7 i5 P☆STM32L431 的 ADC 最大的转换速率为 5.33Mhz,也就是转换时间为 0.188us(12 位分辨率时),ADC 的转换时间与 AHB 总线时钟频率无关。
( K! d( q3 M- E6 i7 K5 y' w0 J! A# I8 o; x9 \
(2)首先选择ADC1,开启通道9! W! E  I% l: ?6 C9 h& `
) _7 Y5 t4 j/ z( y' g
f31d2998798b4294a5efa1cda1de7c31.png
! E- ?& k1 `5 h& C) G, U9 ^

" G6 X$ T' J0 }! b+ E(3) 进行ADC配置,这里保持默认即可。! q4 }! c' C( u7 \' f5 T

( ~) ]; F* z, R3 d0 u
01e7319ac29443dda07463a86cb4343e.png
8 s3 o/ D/ D  X& l) {; _7 k
& `, \4 B! s. Z! C+ ~(4) 配置ADC的转换规则,选择channel9
, a/ S' g4 S: h( L: d! j; d8 G  z
5092b6c6ba3644239c3805164afda05b.png " x$ [* ]4 v& ?9 s

' U4 X+ R! T! v6 i3 ]4 B/ T8 i5、配置项目工程参数( W; [- ?; ?; F* a! R5 q- W4 w- U' C2 b
(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。
2 w* r; ?& f, C$ t, e- {# _- k" M% ~" _2 J& I
9cfb5e43f4b945c491d1ffa27f1e3284.png
' _2 \: p1 `9 G6 a0 x% D; J. o' `5 F  k. x1 p! T+ d
(2)完成配置工程。$ d( a. J3 Y$ W4 Y7 K# d( ~  {
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)4 G1 c# O9 h# j" n; ]) s* G

7 B$ `' V+ q: U0 s0 Z8 _2 A
efdb616174f54925b6eac31109f227b5.png , A" {7 U. `% h8 Q
$ b0 A0 O7 p- s
41c3f2716e4e4eda8f62fa3a1d871322.png
" W* j4 \. O, X$ `% Y( }6 e
! Q2 |4 y% M: W4 ^1 D
(3)生成代码。+ G8 l: ]! W2 V! H9 k0 F) T
( i$ h$ S4 o, J9 X1 J
8eaa7d0babea40ee93f158481a6ee471.png ! i$ l8 n# J$ y$ Z  W* Y4 q

- ~7 H& d) l  V, K- K0 A 三、在KEIL 5中编写代码  m. n. t! {/ ~4 S' \
1、使用KEIL 5(MDK)打开项目工程文件

8 L  R- A5 n% V1 F4 s; o(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程。
; @* o0 H! v& @* \; U: `- h3 \; u" r2 T- [! l2 K- a) w/ Z. S  a* e
c4c0e8cadfbb4646acf84aca2c5938b4.png 5 J% Z6 B+ r3 b, f- H6 ]

6 A+ Q7 H+ F; z; r) g/ T2、 添加LED系统指示灯提示3 n! j# U' C. [3 m' @5 ~
(1)添加每隔500ms,LED1闪烁一次的系统提示,用于提示程序运行正常。* O7 j4 {+ D4 ]

" a, V3 u4 I! W. D2 ?
6ab72ceaeb7a41af833842fe5ba6f34d.png - t. P. R& Y4 n% s  n* J
2 W$ g. T& b; |3 |8 }
2 }$ W) V1 _- L6 }  c" W
3、添加ADC相关函数代码

# O2 D( k# V# D3 ?, P(1)在adc.c文件中添加ADC采样函数,返回值即是ADC的电压值+ W4 b: n/ J3 y; N2 x
  1. /* USER CODE BEGIN 1 */- k2 u2 ?6 m! x1 [' e5 |  w) @) H7 q4 W

  2. 9 x% U& t0 t/ f; E( e+ v  ?3 E; Z8 o3 b
  3. /* USER CODE BEGIN 3 */4 g4 o5 E5 {# C$ u3 X0 M" e/ m9 i

  4. # B- g: |5 L3 K% v4 a: ?  M
  5. /***************************
    + ]4 \! q' ]9 J% L0 K
  6. *函数名称:uint8_t z_ADC_sample(void)
    + e( Y& J' s: r) B" Q" r
  7. *函数功能:获取ADC采样电压
    , G$ \. U+ y  e. V: \/ @! {
  8. *返回值:返回ADC电压
    0 L- ?! l: j7 M3 ~. t
  9. *备注:
    6 K. `! C& \, C6 f
  10. ****************************/
    ; X8 f( }; s0 h5 g8 d/ O. u
  11. float z_ADC_sample(void)' J/ ]# f* u+ l$ B% }2 Z
  12. {               
    : A1 H& ?+ _; u; I3 n+ J
  13.                 uint16_t adc_value=0;                                                  //ADC采样. d5 i" N. r2 {' ^: I
  14.                 float adc_vol=0.0f;                                                                //ADC采样后转换的电压
    - F& J( G, R( I) d8 G' S
  15.                 for(int i = 0; i < 4096; i++)
    3 @# ~2 x. F4 ]- J# e$ g
  16.     {2 \0 T9 O  j$ }* r9 b
  17.         if(i%1024 == 0)
    # m# ], c5 s4 a# w! [1 j) F1 r
  18.         {+ K) }& G0 L$ ], `' O8 B' G2 W
  19.             /* 使用ADC采样 */
    : _+ D& {2 d# C% F5 I& t
  20.             HAL_ADC_Start(&hadc1);                        //启动ADC单次转换3 [! y3 @) I. t8 ~8 m' H: O0 u
  21.             HAL_ADC_PollForConversion(&hadc1, 50);        //等待ADC转换完成9 z; z" T/ Y- c0 c
  22.             adc_value = HAL_ADC_GetValue(&hadc1);         //读取ADC转换数据2 @$ Z; v! f& S1 l% W% o" C5 N, G2 d( X
  23.                                           adc_vol = ((double)adc_value/4096)*3.3; //转换为电压忿$ I# L! i) w- t: d& t/ M! z! W8 U
  24.         }" ?" U5 {$ |( i( Q
  25.     }* o5 x2 b& }: x' p- _  C( D6 g
  26.                 return adc_vol;
    ) `: h+ H3 \7 ]: ~6 H$ K8 {8 ]
  27. }  6 e# r* m8 X( k, {
  28. - a, r- C" ]7 m. t
  29. /* USER CODE END 1 */
复制代码

+ ?2 t) C" i; ?9 D7 @: H8 r( R(2)在adc.h中添加外部调用所需的函数声明。5 B$ v4 ^: W5 _6 Z- x
  1. /* USER CODE BEGIN Private defines */
    " ^4 f3 ]# a7 q% X. T6 a
  2. float z_ADC_sample(void);) W) q' ~2 _8 k* T
  3. /* USER CODE END Private defines */
复制代码

, h! \) ~$ n' r8 K% @5 Y6 E9 @4、添加使用串口发送函数打印log的代码  j# S; U5 ~8 F4 w+ A3 h# L& }5 h
(1)STM32 Cube函数库的串口发送函数分别为:
& c4 d# o6 r. A) V/ U
! W5 q! u3 X) THAL_UART_Transmit、HAL_UART_Transmit_IT、HAL_UART_Transmit_DMA。本例程为串口发送函数HAL_UART_Transmit的展示。
: z% Q9 Q- W. D
  1. HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size, uint32_t Timeout)
    4 G1 q" P1 x0 N+ E! N& B
  2.     # Q; s6 F7 N" T9 t7 o/ o
  3. HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)
    5 I* `1 n5 D; N* l

  4. , o! y: L  h$ ]! E! O
  5. HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)
复制代码
$ Q9 n) @; v2 n- K8 Z
(2)添加串口函数发送数据的log。
+ h6 p: A- Z$ W, o# {7 u. s: i2 G9 ?3 j, W5 h
6b0880ff9a7e44c18ba92b20895fa204.png
8 O0 _2 f6 S6 ?- @& E0 Y& T- k* m& W- N. x7 r
  1. while (1)
    6 B; V' n- @! l+ [
  2.   {
    , }8 C+ S" q, m3 J- D
  3.     /* USER CODE END WHILE */- t  }& I: y! |2 H6 x

  4. 8 b  T+ ?% b0 h
  5.     /* USER CODE BEGIN 3 */% A6 c  v% c4 A* N, g, a
  6.                                 HAL_Delay(500);# M, d6 E3 l3 N6 G
  7.                                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                //控制LED1反转
    6 v. q% b) g# z( J
  8.                                 HAL_UART_Transmit(&huart1, (uint8_t*)"hello world,this is Transmit function!\r\n", 100, 5);/ \' J* F% K8 K1 p3 q- Y3 O# c8 Y
  9.   }9 J* F/ P8 _) r' Y* p- u
  10.   /* USER CODE END 3 */
复制代码

% c5 e6 l! m" H. i2 t8 Z7 f(3)在main.c中添加调用和打印语句。0 l/ h% l; s4 L5 d  L5 Z

7 d+ Q- s. ~* V7 z
  1.   /* Infinite loop */. n# p: Y( L4 h: r* n8 b
  2.   /* USER CODE BEGIN WHILE */
    3 C& t. r) Q* V9 z9 N  [  }; d8 o% p; Y4 a
  3.   while (1)
    $ e: e& M0 Y6 i4 `
  4.   {
    , J# j7 w! d  [& Z& c& p' p* |
  5.     /* USER CODE END WHILE */
    # q( e6 E- A3 Y" T+ m* X3 T' S9 b

  6. 7 w  m! \+ O% H2 o
  7.     /* USER CODE BEGIN 3 */
    2 {; U0 v3 [0 ?4 k1 T* K  Q! Z
  8.                                 HAL_Delay(500);
    ) y2 l# p2 ~# V/ I
  9.                                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                //设置LED1反转
    1 Q# Z% Z0 Y) Y$ F) q
  10.                                 adc_vol=z_ADC_sample();                      //获取ADC的vol倿
    & v5 S. f4 B# _, e5 Z
  11.                                 sprintf((char*)str_adc_vol,"hello world,this is adc test,adc==%.2f\r\n",adc_vol);                        4 s6 \/ e; M$ K& f5 b3 P
  12.                                 HAL_UART_Transmit(&huart1, (uint8_t*)str_adc_vol,100,5);
    ' }! C# A4 B9 I* V/ p, j
  13.   }$ Y5 a4 b1 m1 a% {
  14.   /* USER CODE END 3 */
复制代码
  1. /* Private includes ----------------------------------------------------------*// X7 Q, Y% r" g7 f
  2. /* USER CODE BEGIN Includes */
    : j4 x: M: }1 G$ _5 G
  3. #include "stdio.h"* u& g# o# c1 x& t$ L1 a" P) z
  4. /* USER CODE END Includes */
复制代码
* M  o1 I( d- z4 G1 H& `; }2 T
5、设置编程仿真下载模式
2 S5 A) H! z/ r$ _
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。$ O. W- x# f8 C6 s9 N- J

+ J2 B9 q  k. r4 I3 z
edefb6b9a2a14be3b1221ad6d5c7a8a2.png
- T5 u% X9 @4 n# H9 R% O5 y! C
4 }' F5 i0 _3 }% a+ J: g" N. C(2)点击Download(或者快捷键F8),即可下载程序。
  l: A8 M# q( o: u5 ^; ^6 {* D. {3 a- f' r
ba221842d5db40808aa129dd83c593d0.png ( v$ O) O+ X/ M4 k5 l
& Y. J. x2 F/ L$ K& Y2 w
(3) 如果下载程序后,没有看到LED1灯闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。6 b& K( b& [/ i; O* K* Q+ I. \. J# O

2 v  W5 q3 L3 I7 G7 ]+ I( _6 A, |
9f8aa1a4e8f04041bcf5cb183facd100.png
) f* p+ A5 f  ?0 \' Y% ?+ j2 T/ S) E/ J2 T' A1 p
6、查看串口发送函数打印log效果9 h& n8 I' {7 v2 }. X7 M4 K
(1)设置串口助手参数为:115200、NONE、8、 1(和代码中串口初始化参数一致)。) G5 S" Y% O* {4 e0 Y3 S% ~
(2)设置成功后,就可以看到串口打印的效果。每隔500ms闪烁LED1指示灯一次,且串口输出一个log。  I0 N0 P( n1 Y1 \5 r' ?3 \3 H2 z
备注:PA4接GND的时候,输出值为0V,PA4接3.3V的时候,输出值为3.25V。: F" ]% F9 H7 g
2 s: u" X! n8 J% ~' L
c36c94b1faa644f89200cbd7d8cac7be.png
5 a* @$ i$ D* K$ `) R( I. M6 B: q( z/ x
————————————————1 `9 P  s6 V7 F
版权声明:智能小屋ZYXC* V3 H, a% I9 ]

+ {8 L) u9 h* p7 y' P9 u
收藏 评论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 手机版