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

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

[复制链接]
STMCU小助手 发布时间:2023-1-15 00:07
一、开发板平台简介:/ i# Z- x' [/ w1 ~, M/ o3 q- j
1、开发板资源简介
1 k0 K: V  L4 W- ~2 e/ x" ]6 Y4 S! L9 ]" R
(1)开发板主芯片型号:STM32L431RCT63 @) u4 k( p+ n' ?) z, E
(2)开发板主芯片封装:LQFP-64_10x10x05P
: B" X  X4 t9 ?- G$ ]$ |9 u(3)开发板主芯片内核:ARM® Cortex®-M4( \" ?) n8 D* D1 y" y% l
(4)开发板主芯片主频:80MHz
! n/ Z1 l/ K, p(5)开发板主芯片Flash大小:256KB
# l" h7 p9 E/ Y7 q2 v(6)开发板主芯片RAM大小:64KB
6 {, h- @' q. ?$ N& S (7)其他外设:请参考芯片手册
( H5 D" }7 F5 d
% H8 \- p" t& n, v2 g# \/ G1 z; R' Q
bb91345227434ee7a43a34bf3fe366e6.png 0 O3 s/ Y4 m+ }$ r
7 l* a4 b0 u$ h5 Y& ?
929c0cce04aa4115a8623703982bf3e1.png
! E: {: r$ E$ I$ E: e
+ m' ^- G7 s+ U5 m0 C0 U2 _0 m
2、串口简介
+ }# u5 ?. @/ l+ ]# c
         串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。2 W, t! ]. y5 c0 f
        (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也试验该串口1进行。
% h( t- z1 e: A        (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。# v) Z& j; j  L1 }; S# e3 `: M
% i' u! g2 y& u" c+ `2 X
  二、新建工程4 Z6 o+ q/ j, @5 o7 g
1、新建STM32CubeMX基础工程

1 S  F* k3 [2 o1 i" ](1)打开STM32CubeMX,点击“File”-->"New Project"​
6 P8 X2 O. M# V, ?& `1 }- U" ?1 F* R$ S8 U) X
2399170347904e959c855fefd5877f84.png
) i% J+ I) g5 ?% x5 ~

7 d+ e0 p/ _. J% k7 z0 A' F2 H* G(2)等待打开主芯片选项界面(大约1分钟时间)。6 `/ k+ Z* m& H! O
1 h2 R$ \% a* Q+ h* k( U6 j
d74d2fdc60c9440483e2b7cf8d928e7f.png 9 \. I2 B, ?1 @1 P6 y
2 i1 L8 J4 {, R& f6 J2 c9 C
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处现在STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
! |  V, n" z/ l" a- G! a: v9 L% s0 g$ L( a
7b80345238d74bea82ce70e1a348f7b4.png - M' J6 r& a" C; X  Y9 v( @
' ]+ r( ~  b" x6 T6 d, U
(4)选择时钟源。
4 z. I# L, ^1 F* b5 g——因为开发板上有8M外部时钟,此处选择外部高速时钟(HSE)。4 D2 o6 O  c! y) r3 y
——因为我们没有用到外部低速时钟(LSE),此处不做处理。
. n8 K3 f/ u( X/ Y4 ]6 r
& a  i' R' [. g0 W$ H
72119b971f62410fa8344f7f9fb9f389.png
& V" z4 R) k& F# E- S0 A1 g9 O
: |+ |  O) b# b9 F2、配置GPIO控制LED5 B& S# ~3 |. V
备注:LED灯用来指示系统是否正常工作。
* n; M. a: s: _5 L( t8 f0 ?# ^, Y(1)查STM32L431RCT6开发板原理图得LED1控制引脚为PC0,则配置GPIO的引脚PC0。5 N& j/ p* p6 Y# M0 p  n8 K8 d
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。* O: H3 R) u! i6 U- _$ ?

4 H$ S, k0 o( h2 p8 ~
492907c1e71149819adbaee4516a2af4.png
4 ]8 h: g$ j0 I  W0 B4 l, l( y' Y% e1 \
(2)根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。​' U. d$ i9 _: f" `  A
9 I& w( G# J: S6 w% i3 y2 n6 ]
38ff4b80e1c5495ba3076a5158fd91fa.png - o' w4 h/ m1 b1 Z& }! q
8 ]" a2 U  h2 \: g* e
3、设置串口1参数
* a+ m* t& d: R) v* v  a" j
(1)查原理图得知,串口0使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:. S$ Z. P0 K) x1 h# J; u

' _) X6 @7 B: ?4 Q4 ]/ A( j
497b8ee0243e446784e64a3c31e8a26f.png
3 A; n2 |9 O; Q9 X8 S$ q6 T$ q
# G, m: U( S4 d- @( Z# \ (2)序号1用来设置串口收发引脚的选择。& M& p! Z2 U) }9 y
(3)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。
& Z/ O! ~, a/ w: U8 c4 B" d- |3 R$ Z2 K: y
4、配置ADC(单次转换模式)+ c4 P+ ~* C; o9 }" N8 I5 P1 K& l5 P
(1)ADC简介:
  ~) {  e7 Y+ u/ C% k; _* T☆ADC全称 Analog-to-Digital Converter,即模拟-数字转换器,可以将连续变化的模拟信号转换为离散的数字信号,进而使用数字电路进行处理,称之为数字信号处理。1 _% I! O5 b. F6 h/ b! C3 V
7 V( i" r3 _% Y5 D
☆STM32L431xx 系列有 1 个 ADC,ADC 分辨率高达 12 位,每个 ADC 具有多达 20 个的采集通道,这些通道的 A/D 转换可以单次、连续、扫描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。
0 y, C' r8 u! ]7 A
" L2 S  i" r+ b☆STM32L431 的 ADC 最大的转换速率为 5.33Mhz,也就是转换时间为 0.188us(12 位分辨率时),ADC 的转换时间与 AHB 总线时钟频率无关。
- l, v# O4 f0 @  E7 g4 R
: F+ _+ e6 C! _' |, {(2)首先选择ADC1,开启通道9
; ]5 B+ y/ b  B  @" L$ }: W0 w, F- A
6 D/ q4 H, f; t* c, M
f31d2998798b4294a5efa1cda1de7c31.png
* J) ?1 `" y0 A9 t

* z+ [1 P1 P6 Y2 e: \- c(3) 进行ADC配置,这里保持默认即可。' [* j. k5 U% }# Y: j1 f3 P
8 l. ?. S5 X- b+ Q
01e7319ac29443dda07463a86cb4343e.png 1 b3 x7 I  h& A

( p- N8 @3 i9 t8 c(4) 配置ADC的转换规则,选择channel9
5 J6 Q* a. w0 a* X- o3 Z( V% p1 ]% R" x, Y
5092b6c6ba3644239c3805164afda05b.png ' i' F! u$ a6 w, ~& x/ E2 Z

( |6 k$ D- x; V* c% e5、配置项目工程参数
% k+ h; \" m+ @, ]4 o. L. f1 E3 _0 v0 g(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。  G7 p0 o) H3 ~
( C" N& s6 [+ \4 D: j  P: G
9cfb5e43f4b945c491d1ffa27f1e3284.png
8 P* z4 B& G0 ^# i4 j$ r0 M
4 ]$ j! @5 j; y. |(2)完成配置工程。
9 ^  }* |2 l6 l/ c备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
. _  D8 ?1 H7 W7 Q- u, V1 Z  @/ F' j( M2 w2 Z
efdb616174f54925b6eac31109f227b5.png 4 ]5 |( J5 s7 x
1 {1 l6 S  L/ e3 \
41c3f2716e4e4eda8f62fa3a1d871322.png : v$ s) R& L1 O2 b! h) K

2 X! g) b3 T9 l# |3 v7 k(3)生成代码。5 z" X9 D! A+ e  R2 ^* C7 r

+ e0 Z4 v& ]8 `% H/ j" {( V3 D2 E
8eaa7d0babea40ee93f158481a6ee471.png
; P5 d# z7 C& D  m7 t2 W% u& o4 s$ f/ D  K
三、在KEIL 5中编写代码6 Z7 K% R5 t6 J) F( P
1、使用KEIL 5(MDK)打开项目工程文件
3 q% F' y) P7 ]" r6 l
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程。( _) T" R4 M7 R! I( U6 O6 a
- O) P2 t- l, K4 A; T/ c
c4c0e8cadfbb4646acf84aca2c5938b4.png
* h5 L9 ^' }3 v! l/ F2 {5 B
* J8 s8 x6 i/ ~2、 添加LED系统指示灯提示; U- \% w& Z( F# w0 ~! ^+ ?# s
(1)添加每隔500ms,LED1闪烁一次的系统提示,用于提示程序运行正常。, T. ?8 U1 Y; p1 _) \
6 P& o7 ?; ?6 g# S7 o4 }- K" Q
6ab72ceaeb7a41af833842fe5ba6f34d.png ! q, ^' c. G3 n( N
( y" g0 |% i/ x# r! a% t, Q- N! ]0 e
" E. ~2 ^: }/ K. o7 R
3、添加ADC相关函数代码

, a' g9 }0 Y! Q(1)在adc.c文件中添加ADC采样函数,返回值即是ADC的电压值
" l1 N) D2 \1 w; y
  1. /* USER CODE BEGIN 1 */9 n% x* @" W! l' Z/ c  J
  2. 4 p, ^0 a' y2 A, {! z/ U
  3. /* USER CODE BEGIN 3 */2 }* k6 D% B6 P6 b% I
  4. - Z- g# d+ {% p/ x% ]0 j+ s0 B
  5. /***************************2 \$ ~: e( j4 f! T
  6. *函数名称:uint8_t z_ADC_sample(void)
    4 @- D: W5 p* E$ v: }( ~( l
  7. *函数功能:获取ADC采样电压
    + |6 K2 O8 g' _; k
  8. *返回值:返回ADC电压
    9 h) I0 s# B3 i( Q# H8 t$ H
  9. *备注:
    ) U8 {; V4 P# F  k* g6 s
  10. ****************************/
    $ U% }4 {  W% F  j; o
  11. float z_ADC_sample(void)
    9 m" r# e: Z# l* L
  12. {               
    # ?/ L. P: l, d5 ]1 s, D0 S2 w  ?" {
  13.                 uint16_t adc_value=0;                                                  //ADC采样
    2 A: P( R. E0 Z! ~% ~) T0 X
  14.                 float adc_vol=0.0f;                                                                //ADC采样后转换的电压1 j7 O, v1 l% P/ c+ {- ?
  15.                 for(int i = 0; i < 4096; i++): d9 m/ u$ G: w7 [( |4 r
  16.     {
    7 z3 b1 ]! N, i" Y& n
  17.         if(i%1024 == 0)* U9 F! K6 E9 c0 d! c' f
  18.         {
    # S. c" F) E' u+ k' W
  19.             /* 使用ADC采样 */
    # }' {1 P! U0 u
  20.             HAL_ADC_Start(&hadc1);                        //启动ADC单次转换
    : i9 O9 M# @/ K3 H
  21.             HAL_ADC_PollForConversion(&hadc1, 50);        //等待ADC转换完成7 v' c  V8 I$ n: M  k9 k6 h
  22.             adc_value = HAL_ADC_GetValue(&hadc1);         //读取ADC转换数据: f# y7 l" A! [% v* A3 g6 k% E* Z
  23.                                           adc_vol = ((double)adc_value/4096)*3.3; //转换为电压忿' Y9 E; [- e1 t$ \  g
  24.         }
    1 w: ?- K& u( B, r" [1 T
  25.     }
    6 D7 s- j0 t  i, t
  26.                 return adc_vol;
    , Q, F, g. ^: I. u! U) I
  27. }  ) J$ w* V% o6 J  |6 j8 C

  28. : H4 h. _3 x& k- F
  29. /* USER CODE END 1 */
复制代码

' j( Q6 K- _0 r) \2 E(2)在adc.h中添加外部调用所需的函数声明。
$ \; x1 w6 b8 s7 {0 M7 L- m
  1. /* USER CODE BEGIN Private defines */
    ' `! x! M8 }, i5 ~( Y
  2. float z_ADC_sample(void);& E+ i8 A3 J: c
  3. /* USER CODE END Private defines */
复制代码
. Y8 u! q1 Q9 \) O" }3 X; D
4、添加使用串口发送函数打印log的代码6 _2 U) ^6 p% W
(1)STM32 Cube函数库的串口发送函数分别为:
8 E% |7 E" z1 A) h$ Y. a, ^7 e
% n' q' x- k/ O3 xHAL_UART_Transmit、HAL_UART_Transmit_IT、HAL_UART_Transmit_DMA。本例程为串口发送函数HAL_UART_Transmit的展示。
) _5 j. v7 T: m  w0 ?0 j% y
  1. HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size, uint32_t Timeout)
    8 M8 L4 W' T% J& `0 R
  2.    
    + r1 n: i0 L( q3 \6 F. w
  3. HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)7 K( c  ^; q( k4 _+ U/ o

  4. # h* E5 N% H5 o/ o! b
  5. HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)
复制代码
3 L! }5 O) q6 v0 M
(2)添加串口函数发送数据的log。
. v, h6 U. T3 ]7 o& X- @1 y0 b; ^3 k( x9 ^! U$ i$ T  [
6b0880ff9a7e44c18ba92b20895fa204.png
$ |9 c8 ?- C2 V5 K3 r) @% {- }
6 f6 d/ x9 K  F4 w( `* h" W
  1. while (1)
    ( y) \7 l4 }& _. y& N1 P
  2.   {, m' e2 S# u: u7 h' Q8 A/ @! P/ j( z
  3.     /* USER CODE END WHILE */
    5 L2 o- [& T$ k2 Z; I
  4. " X+ o4 Y5 C1 J
  5.     /* USER CODE BEGIN 3 */
      j% A2 f% i* F
  6.                                 HAL_Delay(500);
    / |  u1 _* `( Z5 V. E9 B
  7.                                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                //控制LED1反转: {. B6 r6 d1 V% E- v3 |: y8 Z5 E
  8.                                 HAL_UART_Transmit(&huart1, (uint8_t*)"hello world,this is Transmit function!\r\n", 100, 5);
    5 a& y; _" {0 t4 V6 B" P/ ~# U
  9.   }% p4 }- v- r. I" j! Q# u' V# x
  10.   /* USER CODE END 3 */
复制代码
( m7 n8 Q3 Q) p8 N
(3)在main.c中添加调用和打印语句。  B" N7 ~; Z. c
* i( |  u- [# P6 C
  1.   /* Infinite loop */
    ! @, V$ t# g1 N# V/ e
  2.   /* USER CODE BEGIN WHILE */$ b4 b& j" M1 w1 x: G* g7 q* H
  3.   while (1)
    7 @$ N9 b* W! O# |' R8 Q) F
  4.   {
    , H& p6 A4 C/ t7 s& }) I- x
  5.     /* USER CODE END WHILE */
    9 H( f1 ~6 B& ?# N
  6. * u$ B  T9 F( v0 k3 [
  7.     /* USER CODE BEGIN 3 */( J2 `: C8 V, e/ C4 T0 \0 S
  8.                                 HAL_Delay(500);# u4 v' l6 V' z+ o, s; [9 C- a' z
  9.                                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                //设置LED1反转
    # N$ U1 Z, C( L0 o) N0 H+ n% G* W
  10.                                 adc_vol=z_ADC_sample();                      //获取ADC的vol倿 1 I* Q- L# _0 Q5 B8 o9 F
  11.                                 sprintf((char*)str_adc_vol,"hello world,this is adc test,adc==%.2f\r\n",adc_vol);                        8 t- F: s% H7 P. J- {) X
  12.                                 HAL_UART_Transmit(&huart1, (uint8_t*)str_adc_vol,100,5);
    $ J. F4 Z; Y8 Q9 E$ x  `$ K
  13.   }
    4 U1 o8 ~( R6 }! t; D6 ^
  14.   /* USER CODE END 3 */
复制代码
  1. /* Private includes ----------------------------------------------------------*/
    0 e( j% V1 s9 P3 q8 U
  2. /* USER CODE BEGIN Includes */4 ^' R1 m. n9 s; P- P, ]
  3. #include "stdio.h"
    " e/ ?( k) \; R: c
  4. /* USER CODE END Includes */
复制代码
/ W" ^3 K/ ^, ?
5、设置编程仿真下载模式

0 ^" H: h( S4 `(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
+ m& B. y7 s2 f! M
3 Y0 A0 h, V1 v) J( b5 {
edefb6b9a2a14be3b1221ad6d5c7a8a2.png $ ^- m: e1 D& F. B! Z3 Q9 v1 y" D

4 {9 L7 r4 d! ^9 \, T1 n(2)点击Download(或者快捷键F8),即可下载程序。7 p+ ?/ M* y/ I/ E' P, f7 D
$ `( @) g+ p( x6 ^) q! Z, R
ba221842d5db40808aa129dd83c593d0.png
; `' I" t2 v& z7 U0 S* i2 h8 o! N$ E* ^# Y. K0 R
(3) 如果下载程序后,没有看到LED1灯闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
. w$ M! X+ {: l$ B' `, n3 ~( u3 _: W' }: ]5 W5 Y
9f8aa1a4e8f04041bcf5cb183facd100.png
6 @4 r, Y; o2 g/ d- c8 o2 s5 k: D* r, w" s/ L% w( P+ e
6、查看串口发送函数打印log效果7 O; G  |5 l" Q$ ^6 i
(1)设置串口助手参数为:115200、NONE、8、 1(和代码中串口初始化参数一致)。
, B1 ^' p0 ^' H: w(2)设置成功后,就可以看到串口打印的效果。每隔500ms闪烁LED1指示灯一次,且串口输出一个log。
- m( x& r% S0 B3 J. _# y备注:PA4接GND的时候,输出值为0V,PA4接3.3V的时候,输出值为3.25V。8 L% E3 T, ]9 q% o5 r5 Z6 h( }) F: p! Q
! l* f4 J; {9 I
c36c94b1faa644f89200cbd7d8cac7be.png
# W% W3 Q+ m4 s2 ?7 w
3 u, ^  ~, E7 r: W/ l————————————————1 M- c# f" w5 s4 T+ w' Q
版权声明:智能小屋ZYXC4 Y' \' i5 |) C6 o$ U( J2 X

% m( q0 [8 z# ?" i" {
收藏 评论1 发布时间:2023-1-15 00:07

举报

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

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版