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

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

[复制链接]
STMCU小助手 发布时间:2023-1-15 00:07
一、开发板平台简介:* X, b  O' H6 q) X
1、开发板资源简介
. X3 F, `* r0 `) t5 c
(1)开发板主芯片型号:STM32L431RCT6" m! j  z; m  o8 M  V8 `  W
(2)开发板主芯片封装:LQFP-64_10x10x05P
1 r4 O- j5 R* k7 X& E7 ]# L; ?(3)开发板主芯片内核:ARM® Cortex®-M42 L7 a9 B1 p$ ?
(4)开发板主芯片主频:80MHz
; }1 G0 b' i0 b(5)开发板主芯片Flash大小:256KB! G6 C1 G' @. [  `7 d; P5 L
(6)开发板主芯片RAM大小:64KB
- Z$ |! Y& q+ y (7)其他外设:请参考芯片手册
* ^, l3 P6 r3 Z2 A( [
+ P9 Y# K) ?& r& m8 [
bb91345227434ee7a43a34bf3fe366e6.png
* A- F- d3 ^3 k% A1 [2 f$ e% {6 ~- f* B% D! K* a0 |& X
929c0cce04aa4115a8623703982bf3e1.png
& J( ]; l7 Z: L  J
7 o* t* W% T+ Q, Q' K1 _
2、串口简介

  {5 H4 M- p) o9 |+ w: j, j' R         串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。
6 h' `% P( t2 L- B        (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也试验该串口1进行。
. P9 A# n( H& }5 o& c* E        (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。6 w9 G% {1 p$ a! r3 [) |% ]' k

" E) R3 x  _9 |9 L+ Q  二、新建工程
) F$ m0 x" R$ t7 q) D1、新建STM32CubeMX基础工程

8 \8 Z9 f1 Q5 ?! }4 w- D' h2 b(1)打开STM32CubeMX,点击“File”-->"New Project"​( i; e( O8 p# ^: R3 }* e2 ]

0 L, ~* g+ q/ y# U4 ~
2399170347904e959c855fefd5877f84.png $ T9 [9 `8 X7 a

6 m$ B$ A; @( n" W/ a(2)等待打开主芯片选项界面(大约1分钟时间)。
7 L7 L- \, |4 x* m& H' L- ~/ r3 k6 p7 w/ l! E1 X
d74d2fdc60c9440483e2b7cf8d928e7f.png + M# o6 p' h" E* D

) X4 w+ W4 p6 }; l, f(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处现在STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。) d1 G: f" z4 N) ?$ _, s' \' u3 v
" ~. N$ L. _+ ~4 [  {9 z: P
7b80345238d74bea82ce70e1a348f7b4.png 6 t9 b3 A* s- h) A3 V( u

0 d/ v) d, o9 O, r6 T5 f+ Y) q(4)选择时钟源。5 s7 Z& h8 ^. k1 ?, P" Q
——因为开发板上有8M外部时钟,此处选择外部高速时钟(HSE)。" D& e3 z2 Q% Y' ^
——因为我们没有用到外部低速时钟(LSE),此处不做处理。
9 V' T0 S! d9 t) ?% f. r3 A4 n, d0 r+ j# ?8 p" q. Z6 v
72119b971f62410fa8344f7f9fb9f389.png
: |6 ?5 d& Z" x% p, Z% T! Z7 v  y! R3 d7 {+ j) Y/ b. l
2、配置GPIO控制LED
( X6 n" @( R' n- |+ ]' F1 m备注:LED灯用来指示系统是否正常工作。$ }7 S# Q; t3 l  d4 o
(1)查STM32L431RCT6开发板原理图得LED1控制引脚为PC0,则配置GPIO的引脚PC0。
- L9 Z: Z7 h8 P- [1 h3 O鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。
, _& [& X) @5 u% P' S
4 }* j; v# j3 S/ D) J, m
492907c1e71149819adbaee4516a2af4.png
9 K" g$ [" S; W2 P1 a2 b' U1 n
3 N0 K1 h- k0 G(2)根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。​
$ s; x# j, m  \4 \9 e* G
) B+ W5 ?  r- j5 l/ G
38ff4b80e1c5495ba3076a5158fd91fa.png " |% h: m, ^4 V4 a) @
7 V: ?! F: U9 k
3、设置串口1参数

% T  f  A* ~9 F8 @  @(1)查原理图得知,串口0使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:- s( }' ^3 C; j
* H0 K) Q* g5 c1 Q# N% D8 {* V5 Z
497b8ee0243e446784e64a3c31e8a26f.png
3 M; P2 o9 ^" v7 I8 h
( \; L1 w# r4 S# s/ j3 n9 K (2)序号1用来设置串口收发引脚的选择。
; ^9 \% s& R, a) Z" w9 m* h (3)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。
7 U5 r- P6 ^0 f: u
+ C9 @, ?- D' a0 @8 I/ K2 _' Q4、配置ADC(单次转换模式)
* y8 O$ {; N' B: o(1)ADC简介:
+ U3 l4 ~% P; I4 b1 q, r☆ADC全称 Analog-to-Digital Converter,即模拟-数字转换器,可以将连续变化的模拟信号转换为离散的数字信号,进而使用数字电路进行处理,称之为数字信号处理。
, B5 |( ?" }6 l! u% M0 B
) F/ Y$ }  V4 e) U
☆STM32L431xx 系列有 1 个 ADC,ADC 分辨率高达 12 位,每个 ADC 具有多达 20 个的采集通道,这些通道的 A/D 转换可以单次、连续、扫描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。9 F( @3 Y, B- Z" `
' P" r: K1 }/ H( }
☆STM32L431 的 ADC 最大的转换速率为 5.33Mhz,也就是转换时间为 0.188us(12 位分辨率时),ADC 的转换时间与 AHB 总线时钟频率无关。  }7 @' h/ ]& U5 b0 |
* x: A$ d0 w8 O* Y3 L0 l  i' v4 n; {! M3 @
(2)首先选择ADC1,开启通道98 _) ~6 z8 @  t( l
6 _' ?) x2 V% m, e
f31d2998798b4294a5efa1cda1de7c31.png
- d0 s& L! I: l+ i, M( n% q1 }

3 b; |5 j# o1 a% Z, t8 l# g(3) 进行ADC配置,这里保持默认即可。( k4 W2 {. J1 s9 W7 F+ R/ h7 f, m
4 G5 }0 l8 O8 l, \9 _, R; v
01e7319ac29443dda07463a86cb4343e.png
. Z+ I" l( m; U5 G7 {3 L
% J# q. l; r- G(4) 配置ADC的转换规则,选择channel9# \& ]5 {2 w6 q1 t$ ], j0 U

' D) U& m: ]: h) H. S6 Y; ^: |
5092b6c6ba3644239c3805164afda05b.png   v; R4 e) n2 n9 V2 o$ _2 F& _
2 K) k2 x. A7 ~+ e# B
5、配置项目工程参数
* F8 U7 V& o* u' A) l! F(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。! H3 `4 Q; X/ b4 K% k

4 _3 t0 Z4 Z2 \0 ~( v5 ]
9cfb5e43f4b945c491d1ffa27f1e3284.png 3 v. n% ?& r8 I, z( [( s

" ]9 V- j+ ?: O' G8 P6 N) v(2)完成配置工程。% E* [% f! Z3 f2 |1 h. i
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
' Q& y2 o# L1 \1 h4 `; `3 k  k4 }0 F4 M; Y5 W- u- |  G
efdb616174f54925b6eac31109f227b5.png / H7 \; Y. T+ B4 u; p! s, H
, k* K# [7 {7 q
41c3f2716e4e4eda8f62fa3a1d871322.png
; i7 |1 l: _1 |: G+ x$ Y

. u( C* y) j* @(3)生成代码。# f) h) _0 X  G9 H/ C; I5 }3 r
% m7 ?( k! c5 v, g- ^# z+ q) R6 G
8eaa7d0babea40ee93f158481a6ee471.png 6 K- V* w1 y3 ?1 s' W8 U: p

. M/ H0 L" ?" ^ 三、在KEIL 5中编写代码
& _: ?0 a9 f- D3 g; L$ G$ r, K* P1、使用KEIL 5(MDK)打开项目工程文件

, y- Z+ r+ U! b! J& H(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程。
: W' R% R8 H& S/ i. K; I; j) P; v; \. T
c4c0e8cadfbb4646acf84aca2c5938b4.png   @: N% e* O" d6 e7 o7 O

6 {  L0 G$ s0 y% Y. M2、 添加LED系统指示灯提示) Y5 n) r# V0 A: g$ h; E
(1)添加每隔500ms,LED1闪烁一次的系统提示,用于提示程序运行正常。
, ?/ Y( o+ C# q+ v5 h
) _% I9 u3 k) S* U
6ab72ceaeb7a41af833842fe5ba6f34d.png / h% H4 n% y  g+ W9 s: t  k
; S/ R( t" m$ Y' l0 H5 H% c1 S
7 r2 j" I& K4 a4 l& o+ c& E0 s
3、添加ADC相关函数代码

1 h6 ?4 `" P3 _# o; Y(1)在adc.c文件中添加ADC采样函数,返回值即是ADC的电压值+ S$ e7 f' P" w7 U. T% I
  1. /* USER CODE BEGIN 1 */
    : r1 E8 L7 G' _/ p' L' i) b
  2. - n7 a1 N6 N2 i# d
  3. /* USER CODE BEGIN 3 */" D2 @( i% b2 Y4 o$ d- P5 A

  4. - p7 `* Y. X  j  R/ R
  5. /***************************
    # x  F, x/ b# q! O# c0 `
  6. *函数名称:uint8_t z_ADC_sample(void)/ T2 x" W9 w+ H% p( J# S/ O
  7. *函数功能:获取ADC采样电压. y- [; ^! w3 }- o7 W2 `6 a- }/ f
  8. *返回值:返回ADC电压3 V, B, p7 y6 U  e, I! F: E% ~
  9. *备注:* [  f4 ~" ]9 ^) ~: G! P* a6 F5 h3 \
  10. ****************************/
    $ w$ ~3 w, i& y( K9 F# r
  11. float z_ADC_sample(void)% c; v$ O: W$ e
  12. {               
    9 [# ]- ~' m' r
  13.                 uint16_t adc_value=0;                                                  //ADC采样
    6 L+ Y/ f4 d% B) H, X8 {/ Z' ?
  14.                 float adc_vol=0.0f;                                                                //ADC采样后转换的电压
    ' ]( q- t0 Y+ e3 S( M
  15.                 for(int i = 0; i < 4096; i++)7 l3 c$ Y; y* t/ @  Q
  16.     {) |: U4 G, ?/ J! K/ ^
  17.         if(i%1024 == 0)
    6 |7 t& D; `  F' j0 u
  18.         {0 C* p+ |4 Z" R  Z
  19.             /* 使用ADC采样 */
    * _2 \; X( {) B8 d
  20.             HAL_ADC_Start(&hadc1);                        //启动ADC单次转换
    " k. a: |. @1 h6 P
  21.             HAL_ADC_PollForConversion(&hadc1, 50);        //等待ADC转换完成$ g  r1 m4 z1 {! i3 w; V
  22.             adc_value = HAL_ADC_GetValue(&hadc1);         //读取ADC转换数据
    3 z/ _- y; y. K9 y: b
  23.                                           adc_vol = ((double)adc_value/4096)*3.3; //转换为电压忿) A1 ]/ i1 P% d* q: E
  24.         }/ n' N/ c# T4 l  u- F, h. ]
  25.     }
    9 M. q3 r- C  V) v0 h8 U1 Z7 h
  26.                 return adc_vol;
    " X( I* X& V+ I
  27. }  
    $ F+ L& h3 t7 H* V5 x. D2 r& T
  28. " p" E' E2 j; C, x1 s. g
  29. /* USER CODE END 1 */
复制代码
+ s, _( [3 N- X* p; t! y+ q
(2)在adc.h中添加外部调用所需的函数声明。
, U" N: u( k( p2 D& d% i, n
  1. /* USER CODE BEGIN Private defines */
    ; D# D  u3 X$ _- Z8 O6 B
  2. float z_ADC_sample(void);& A/ m( w  M- E
  3. /* USER CODE END Private defines */
复制代码
# d4 x# O5 y5 y: |
4、添加使用串口发送函数打印log的代码4 n: F- W6 n& J  r* F/ T3 B2 C
(1)STM32 Cube函数库的串口发送函数分别为:% r9 i/ R* ~( @  T/ a
% u* C8 D  W) s& |; H- K
HAL_UART_Transmit、HAL_UART_Transmit_IT、HAL_UART_Transmit_DMA。本例程为串口发送函数HAL_UART_Transmit的展示。6 A; q$ U- m: ~( E" ?
  1. HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size, uint32_t Timeout): y# i8 j0 I8 a
  2.     $ p2 f7 ~( u2 W# j! E) C1 h0 W( [  g
  3. HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)6 Y# R/ Z) e( O: J# V5 U

  4. 1 J# K3 K0 i3 j, r% z
  5. HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)
复制代码

2 y, Q) O$ _8 D- f( }; T(2)添加串口函数发送数据的log。
5 I5 V: L* p5 D6 X( U  Z$ ]
+ Q7 \) @5 H- ?1 z" h
6b0880ff9a7e44c18ba92b20895fa204.png 3 J% d8 f) H; |7 R

" V9 q" m' V9 w/ b" O
  1. while (1)
    9 z7 @/ }* ]  ?) f" f
  2.   {8 l/ J! U. j' v7 m, a  n
  3.     /* USER CODE END WHILE *// `8 P8 k6 w4 q! u& Z& ?/ Y% O

  4. + P+ s4 M5 g! U7 O; e
  5.     /* USER CODE BEGIN 3 */
    % ~; \' Y8 h# W7 Y; o' V
  6.                                 HAL_Delay(500);0 D. n( J1 b- @% w# h5 ]
  7.                                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                //控制LED1反转" |. o5 r% O! W- F$ o( M
  8.                                 HAL_UART_Transmit(&huart1, (uint8_t*)"hello world,this is Transmit function!\r\n", 100, 5);
    ! M% v* P$ t# C( Q& K
  9.   }8 d, V( I+ `, ]
  10.   /* USER CODE END 3 */
复制代码
" J, N# j& e$ y7 k8 G( {* U& @
(3)在main.c中添加调用和打印语句。
/ I5 U& {7 x$ ^6 I/ H4 n4 N+ h, M2 R7 {3 z0 I: ~7 r
  1.   /* Infinite loop */: d6 {7 ?* f1 L8 B: v
  2.   /* USER CODE BEGIN WHILE */
    8 ~! o4 p1 H! M) ^# D. ^( k) t2 e
  3.   while (1)- l3 S' u9 a# e0 O. [7 W& s1 X" \
  4.   {
    ) B) S& ~2 \7 s" f) A- }
  5.     /* USER CODE END WHILE */
    - ~  T& q  s' Z
  6. 1 o: g0 a% T( R% X, E
  7.     /* USER CODE BEGIN 3 */; e8 u+ u( n, y
  8.                                 HAL_Delay(500);
    3 `+ d0 w6 O& m! G) a9 U% ~4 O% i
  9.                                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                //设置LED1反转
    6 M' u' z- p& d$ \$ ~
  10.                                 adc_vol=z_ADC_sample();                      //获取ADC的vol倿
    , o. I& Y8 Z, j, D) p
  11.                                 sprintf((char*)str_adc_vol,"hello world,this is adc test,adc==%.2f\r\n",adc_vol);                        . V( I- V' X( O" T. g' l  x
  12.                                 HAL_UART_Transmit(&huart1, (uint8_t*)str_adc_vol,100,5);
    7 r4 w+ r% U7 b
  13.   }
    1 z$ J' \+ G, W" y
  14.   /* USER CODE END 3 */
复制代码
  1. /* Private includes ----------------------------------------------------------*/3 U, a+ C' @! ~5 k2 f1 O9 x- w2 ]) {
  2. /* USER CODE BEGIN Includes */7 B" O) R/ J. }* f' N- ]4 E
  3. #include "stdio.h"
    8 G, u+ F8 i: R, x
  4. /* USER CODE END Includes */
复制代码
# |% W6 u: b$ m4 L7 ^) w) P7 F% l9 r
5、设置编程仿真下载模式

9 @7 p% d1 x/ a' w(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
9 x7 d1 i. N3 e- n3 z! {% m, l) K
edefb6b9a2a14be3b1221ad6d5c7a8a2.png ! L9 G* w! [3 h$ x- d! k
* Q" ^) n" e0 d. H
(2)点击Download(或者快捷键F8),即可下载程序。/ n  h+ ]8 d8 g% Y# l  V

9 [; P8 R; E: f6 g1 L
ba221842d5db40808aa129dd83c593d0.png 6 F1 ~3 X! g# @9 y! {0 ~3 P' Y

7 c: H( l. t" M) L5 L: H(3) 如果下载程序后,没有看到LED1灯闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
4 |& J# s0 Q4 Y5 e0 x5 S9 ~. ^/ r+ G
9f8aa1a4e8f04041bcf5cb183facd100.png 6 ?5 v4 r& n6 n- U2 ~4 o
$ i7 r) O1 G# S" B, ]$ h1 \* p/ ]. t
6、查看串口发送函数打印log效果
2 }$ Y- {: x6 \  K- [, ?  f% H* @. F(1)设置串口助手参数为:115200、NONE、8、 1(和代码中串口初始化参数一致)。
& E% z, `- `- R" V# }2 A1 k(2)设置成功后,就可以看到串口打印的效果。每隔500ms闪烁LED1指示灯一次,且串口输出一个log。7 [9 \" m* `$ x% o( I1 Z
备注:PA4接GND的时候,输出值为0V,PA4接3.3V的时候,输出值为3.25V。+ e" s2 G% N/ i' r2 L( @$ d* m
% p. p. I9 x& q. X8 L
c36c94b1faa644f89200cbd7d8cac7be.png 4 z4 R9 {' a4 a  f( F6 [

; o5 B& I6 L7 H————————————————
3 _  r8 U4 ^* \. f* E版权声明:智能小屋ZYXC
; q5 v3 e, J% L
0 I  j# c5 M, V/ t9 T% Q. B. Z
收藏 评论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 手机版