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

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

[复制链接]
STMCU小助手 发布时间:2023-1-15 00:07
一、开发板平台简介:
6 u8 }/ u! g+ Z( T4 t8 A& ]% s1、开发板资源简介

* G7 f' g% t; E" z(1)开发板主芯片型号:STM32L431RCT6/ f7 g0 Z% I8 ]3 h. t
(2)开发板主芯片封装:LQFP-64_10x10x05P* F, }. l' G0 ^  r. ~$ A
(3)开发板主芯片内核:ARM® Cortex®-M4
( L- x. ]8 C1 l3 p( Z4 p(4)开发板主芯片主频:80MHz
" K$ P  {8 O& n9 V. B# d1 i(5)开发板主芯片Flash大小:256KB
+ l  {; O$ j! [( X+ M/ W( ]& O(6)开发板主芯片RAM大小:64KB/ b5 F. C) o. y& s
(7)其他外设:请参考芯片手册1 p( ?6 q7 V; T: j3 ~" a* h' f! g

1 N( u( x3 w% L2 u6 \, t8 L4 |
bb91345227434ee7a43a34bf3fe366e6.png ' m6 d2 m4 l. l% H6 J; g! G* d
2 c& i6 V4 `- p+ q1 P5 h6 t& z
929c0cce04aa4115a8623703982bf3e1.png # L/ U9 |: K; O* M" d! o

! f3 e3 F" F% @2、串口简介
6 {6 N- }3 D6 Z! V( W
         串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。/ h4 q6 b+ X! X% y& F$ U+ o
        (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也试验该串口1进行。) Q  |0 W+ Q/ c6 S" D) \
        (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。9 b/ `. Y6 @0 o3 m3 @

* b+ F  s7 q- {" z% [  二、新建工程
5 s6 \; f+ ?- B1 s1、新建STM32CubeMX基础工程

* T  B  @# \) v; c$ ^  T(1)打开STM32CubeMX,点击“File”-->"New Project"​
5 p. U! h* o8 C; Y/ [" z: J9 w7 H; o, j" s- ^1 Y
2399170347904e959c855fefd5877f84.png 0 b0 u. G5 ~: K2 F

0 L9 W9 p! s* }6 ]" s6 H(2)等待打开主芯片选项界面(大约1分钟时间)。! W2 V' `+ s0 J; f9 n9 ]. N6 {* F
: |9 z" o& m( v6 x5 G: ^3 s3 `8 s3 A+ o  S
d74d2fdc60c9440483e2b7cf8d928e7f.png , r9 F% u, \6 E% M
- ~1 Q% d2 k1 Q- @3 i7 o
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处现在STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。% m* m  }5 h. ?7 W) t3 E/ c

6 x  k$ I( `1 |/ G4 D0 b
7b80345238d74bea82ce70e1a348f7b4.png , E9 D. {# T* J1 p( z
# {5 U4 H+ d+ r& A! C9 A
(4)选择时钟源。: G3 n! I  H9 v5 {+ ]8 g3 j
——因为开发板上有8M外部时钟,此处选择外部高速时钟(HSE)。8 C1 c' d/ Q9 R) [' L
——因为我们没有用到外部低速时钟(LSE),此处不做处理。
$ d- i+ m4 ^( }$ Y7 A8 R# m2 u) w* Q6 b, ]  R. r
72119b971f62410fa8344f7f9fb9f389.png ) C2 ?+ n5 z) j
9 a  B, ~9 y' ~8 D
2、配置GPIO控制LED
* Z5 Y0 G6 e% k5 {1 |7 r1 b8 F( d备注:LED灯用来指示系统是否正常工作。% |, S: F! n) c3 t/ [
(1)查STM32L431RCT6开发板原理图得LED1控制引脚为PC0,则配置GPIO的引脚PC0。" I4 m- {: B% [9 `. V1 I
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。+ M( ?% y' o1 G1 d

' E4 k" ?% B& V- r9 h& |5 d( L1 Q9 d
492907c1e71149819adbaee4516a2af4.png
) F2 G& x& D1 x% x0 |
9 f1 }0 ^& s7 _0 A1 i(2)根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。​
+ Z3 }6 W: f% b/ P
( |! E# a) q: A: U- o2 x1 R
38ff4b80e1c5495ba3076a5158fd91fa.png
/ u0 W. @- r6 y0 d+ X5 [- }

' [7 c7 [7 z7 }& D7 w3、设置串口1参数

% u. h$ t7 Q0 H' P(1)查原理图得知,串口0使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:
6 H9 x& x6 h) R5 @3 N1 O
4 `! G) E/ [- o6 ]. C; u1 L3 v
497b8ee0243e446784e64a3c31e8a26f.png
; x- y7 D6 S& J3 v/ J5 ~9 l6 h4 i4 W
* ]; s, {5 B" L& ^1 i" C (2)序号1用来设置串口收发引脚的选择。
5 F  q; t' g1 _% [8 Q& Y0 q (3)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。
- C. A( P$ D  `' K+ h
' o* b# _" a$ r: _" u, ^) U4、配置ADC(单次转换模式)& U# M! G! }* C
(1)ADC简介:6 i- y# f" K) a& O, w! y
☆ADC全称 Analog-to-Digital Converter,即模拟-数字转换器,可以将连续变化的模拟信号转换为离散的数字信号,进而使用数字电路进行处理,称之为数字信号处理。  S7 ?& \; L4 P$ e# \8 i
$ L, v4 O& W( N3 w7 Y) X/ A9 v
☆STM32L431xx 系列有 1 个 ADC,ADC 分辨率高达 12 位,每个 ADC 具有多达 20 个的采集通道,这些通道的 A/D 转换可以单次、连续、扫描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。
$ K% D, n, a+ f- r( R$ s/ Z& W; \+ _# g0 P/ `& U% j
☆STM32L431 的 ADC 最大的转换速率为 5.33Mhz,也就是转换时间为 0.188us(12 位分辨率时),ADC 的转换时间与 AHB 总线时钟频率无关。
' p! X& [5 t, Y* q- B! I# f5 @9 x8 A+ i6 L" F% g/ t9 M5 m1 D) I
(2)首先选择ADC1,开启通道9
# l, B: V& F2 ?* j+ g$ r+ `- k( `, j$ D/ V2 O
f31d2998798b4294a5efa1cda1de7c31.png / Y7 y& f+ s6 e, v
1 t/ C; x: _3 O5 E' ~$ F! o
(3) 进行ADC配置,这里保持默认即可。: m* k3 z: e2 i4 n2 B' q% q. }4 |
2 R% u" H8 G5 {% R
01e7319ac29443dda07463a86cb4343e.png 6 w$ Z8 W' h2 I2 D0 b& \* _4 O

4 r8 H; R7 @$ P8 u/ H9 o/ b" C(4) 配置ADC的转换规则,选择channel9: V1 E' o5 v) G6 r, {
$ g7 o5 b5 M6 z. M% b) D; D
5092b6c6ba3644239c3805164afda05b.png
, [9 m) \9 _8 N3 s. \, s5 L* a+ r4 O
$ |# @5 J1 C. x& B5、配置项目工程参数
9 ?' o6 y, x* |( ]+ v(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。
$ H* I7 D0 j" U3 n
7 k4 y! p& w. W* {: _5 ]4 k6 _
9cfb5e43f4b945c491d1ffa27f1e3284.png 5 X; \( w; `3 x. I9 r: C

; [! g$ t3 b) e$ E, H, \/ G  i+ O(2)完成配置工程。
8 r1 i" L* Y- I+ _$ P8 \备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
% l, Z  V. H5 L9 |6 L
: e3 C& x4 o% \0 K' U
efdb616174f54925b6eac31109f227b5.png 6 s" [* K0 J5 Q4 x+ l2 \: |2 q
, B7 @7 z& C5 s
41c3f2716e4e4eda8f62fa3a1d871322.png
% {: X$ C" l! M  w- y

7 e( d" ~7 F' k5 q(3)生成代码。0 u: p, W4 F$ |9 |* V

" Y) `/ A& F$ n$ X7 \) w
8eaa7d0babea40ee93f158481a6ee471.png
3 s' a$ r7 \5 A: C8 s2 Z; U
: N1 v6 S4 v. F* Z 三、在KEIL 5中编写代码
6 i8 ]/ f, R+ }5 d4 y1、使用KEIL 5(MDK)打开项目工程文件
( y6 a( O$ o9 |* U- L% o# @, [6 r
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程。& |/ c+ [9 S  W3 ]- w; S9 C, I" S

; n$ B0 o& H: N+ }
c4c0e8cadfbb4646acf84aca2c5938b4.png
+ x  g2 h# [; v% E- J" Z
, D* J4 y/ @2 ^8 g2、 添加LED系统指示灯提示
# E9 Q, _2 f. j, U: _(1)添加每隔500ms,LED1闪烁一次的系统提示,用于提示程序运行正常。  m0 _. h) }/ X& u

+ p4 o/ l) M0 I# z
6ab72ceaeb7a41af833842fe5ba6f34d.png . h- P% v" Z9 u. H+ X
- z$ j- g( X; X0 Z3 J3 Q

5 ]9 o& r; {& W3、添加ADC相关函数代码
; \+ A. N1 x4 b
(1)在adc.c文件中添加ADC采样函数,返回值即是ADC的电压值
9 \% S- U  @# Q) C; }8 r3 ~- N
  1. /* USER CODE BEGIN 1 */
    & J% c  @& k0 [& W- H/ t. y
  2. + D& z4 Z' ~# A2 y# f; R
  3. /* USER CODE BEGIN 3 */' ^+ c: f: ]! [

  4. $ Y7 P7 P+ m. z: ~: L
  5. /***************************
    ; ?5 }4 u* Z6 w7 s
  6. *函数名称:uint8_t z_ADC_sample(void)& N# |4 |9 ~/ Q; `
  7. *函数功能:获取ADC采样电压& O# x) q; u# Z
  8. *返回值:返回ADC电压
    , H& y, N' Y, n8 s. `, ^$ B
  9. *备注:
      x: e% X# B0 A: V' E
  10. ****************************/
    . y1 ~  T  t* I8 d) {
  11. float z_ADC_sample(void)3 f3 G* T7 W9 u7 y+ e* C8 ?- ^
  12. {               
    1 m$ o/ \% k; F
  13.                 uint16_t adc_value=0;                                                  //ADC采样
    / L$ Y8 v$ u' F: _# ]
  14.                 float adc_vol=0.0f;                                                                //ADC采样后转换的电压
    / |; J, O% y* k+ ]4 G( {2 I; Q
  15.                 for(int i = 0; i < 4096; i++)) `  ?# U" z8 O# I! z
  16.     {( M6 J! E+ }3 T
  17.         if(i%1024 == 0)7 z$ r: d' X' o* U* k4 |, h
  18.         {9 }& z# i0 Q4 i7 Y0 S
  19.             /* 使用ADC采样 */& o2 y  e4 b" C" D
  20.             HAL_ADC_Start(&hadc1);                        //启动ADC单次转换
    ( }+ B& G, t1 `; o& o( W+ N
  21.             HAL_ADC_PollForConversion(&hadc1, 50);        //等待ADC转换完成9 u$ O5 `, H$ Y. s' s
  22.             adc_value = HAL_ADC_GetValue(&hadc1);         //读取ADC转换数据  g8 O/ v- K( l$ N2 R, Q
  23.                                           adc_vol = ((double)adc_value/4096)*3.3; //转换为电压忿
    3 G% k0 Z# c& ~$ ?: j: O% G
  24.         }( e7 l# e- D4 v( E
  25.     }* G1 j* k7 H$ ?! _; n
  26.                 return adc_vol;; N; l5 ^# d. B  R
  27. }  0 {  s! ^6 \( b. k3 ~3 l" _( U: N/ V2 B

  28. : a1 O* M+ m" N9 \1 X
  29. /* USER CODE END 1 */
复制代码

  i+ P' H# F4 @  J2 S(2)在adc.h中添加外部调用所需的函数声明。
. d" c" }+ k2 f. W7 w. j
  1. /* USER CODE BEGIN Private defines */
    * @' t  F; r8 `# b- `. y
  2. float z_ADC_sample(void);
    ( b% F2 ^. K4 O1 e0 p
  3. /* USER CODE END Private defines */
复制代码

0 w1 K% o3 `4 P/ N1 r4、添加使用串口发送函数打印log的代码
( \7 Z3 p1 @5 H(1)STM32 Cube函数库的串口发送函数分别为:, d$ a" I% H' t/ y

) ], }2 {# I0 R5 THAL_UART_Transmit、HAL_UART_Transmit_IT、HAL_UART_Transmit_DMA。本例程为串口发送函数HAL_UART_Transmit的展示。) ?% u9 c4 e# l, `4 M1 c
  1. HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size, uint32_t Timeout)3 e  f9 i7 f( ~& J2 o5 Z1 i1 c
  2.    
    8 E  l; c/ r& i4 J  ?2 M  I( h5 m
  3. HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)# `! R/ B) y/ R0 m- p

  4. 7 s) X5 w/ Y- J! D+ E5 G
  5. HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)
复制代码
+ O# y9 D- D; [/ R/ i2 r
(2)添加串口函数发送数据的log。
( ~4 s3 M* s8 @# F6 {4 A# n+ s; S& f& Q4 ]" s3 X
6b0880ff9a7e44c18ba92b20895fa204.png 1 N* g3 l! d" M: h% Z

  g) _( S& r  E8 A9 X7 R0 w
  1. while (1)
    7 m9 e$ b8 b* ]/ w
  2.   {
    * N+ H& H- a5 F# O
  3.     /* USER CODE END WHILE */# D. e- I  g/ Q; F, W3 ^, `# Y
  4. ) P* Q, Y( V# h, |) H' J
  5.     /* USER CODE BEGIN 3 */% {  M6 h' Z; h7 N1 E& o% w! Q
  6.                                 HAL_Delay(500);- a+ H) ^7 s* l+ p
  7.                                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                //控制LED1反转: W  h( d) A2 m# P' q9 h& N
  8.                                 HAL_UART_Transmit(&huart1, (uint8_t*)"hello world,this is Transmit function!\r\n", 100, 5);
    ' l& K, n/ y4 N
  9.   }
    $ ~% s/ D. j, ]9 h$ W' Q
  10.   /* USER CODE END 3 */
复制代码

$ X7 @) }0 T2 c$ j; k6 U; O  _$ o(3)在main.c中添加调用和打印语句。
! S! `+ i. o  U6 d
, [0 B6 B" j7 l# @  U
  1.   /* Infinite loop */# x; `" c* M$ d9 Z; o
  2.   /* USER CODE BEGIN WHILE */
    6 o- K% W6 O7 {2 v; y
  3.   while (1)
    " F; z6 x6 N& \2 Q  E8 S
  4.   {
    $ q$ p/ i( @5 b! u
  5.     /* USER CODE END WHILE */
    ; u! k" i; p. r3 D) ?

  6. % i8 O& @7 n9 v0 v, j, q
  7.     /* USER CODE BEGIN 3 */
      |4 P& c* M- s* q
  8.                                 HAL_Delay(500);
    1 X, V+ v  n5 h* \% T! g% |7 _
  9.                                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                //设置LED1反转3 B( R) F. ~! P& p& j3 J
  10.                                 adc_vol=z_ADC_sample();                      //获取ADC的vol倿
    9 ^/ q9 e9 K: f; s, D' _
  11.                                 sprintf((char*)str_adc_vol,"hello world,this is adc test,adc==%.2f\r\n",adc_vol);                        3 }3 r4 l5 p$ H  p. C* t) B6 y/ M$ E
  12.                                 HAL_UART_Transmit(&huart1, (uint8_t*)str_adc_vol,100,5);) P5 s$ S5 W9 A
  13.   }; B# X% ^1 h0 c1 s! g* \
  14.   /* USER CODE END 3 */
复制代码
  1. /* Private includes ----------------------------------------------------------*/
    5 ~, R. B& C1 }  T4 n/ |2 B
  2. /* USER CODE BEGIN Includes */
    8 N& W; j3 i- K' o4 z% g$ J
  3. #include "stdio.h"
    ; @7 Y! w% s# U6 b2 R
  4. /* USER CODE END Includes */
复制代码

# A. J) c( o9 M) G, S+ D3 ?5、设置编程仿真下载模式
! }3 U& q& {1 m: x/ [2 B2 O% l
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
/ P( E" I+ A4 d8 x7 s" R
) }2 O; y# Y7 ^  f/ [
edefb6b9a2a14be3b1221ad6d5c7a8a2.png 9 i8 d1 T  o' V9 x3 P
. h% W  V  m, b- m1 W. n" @+ v
(2)点击Download(或者快捷键F8),即可下载程序。
3 ]4 ^* O+ b% K+ ^/ n# g; i0 u1 \9 U
ba221842d5db40808aa129dd83c593d0.png
  i6 t  B8 {# e+ X8 r4 o3 F' J. D: A% Y$ J# i* C
(3) 如果下载程序后,没有看到LED1灯闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
1 f/ n( }* m$ K9 a: R
3 f3 o  g) n; t  q0 q3 ~
9f8aa1a4e8f04041bcf5cb183facd100.png
+ V( r( X, h; s' x
" d8 L* b  t. P# S" j% x" Q% ~3 U" c6、查看串口发送函数打印log效果! |, [. u/ k  d3 [% L( I
(1)设置串口助手参数为:115200、NONE、8、 1(和代码中串口初始化参数一致)。7 G" u: R* @% ~# q* H
(2)设置成功后,就可以看到串口打印的效果。每隔500ms闪烁LED1指示灯一次,且串口输出一个log。( |  C0 w  ^: j& V4 ?, E4 z& s& ?
备注:PA4接GND的时候,输出值为0V,PA4接3.3V的时候,输出值为3.25V。4 Z5 W, G' X4 z1 z9 S* V/ U
' y0 `' U- w$ H& y- G0 x) R
c36c94b1faa644f89200cbd7d8cac7be.png 4 b4 r' ^2 d# ?6 x! F5 N4 U' o& s, p

! d* Q( K$ c% R5 M. C* a" Y6 C$ r————————————————
. `7 C4 T. v5 D- [8 l版权声明:智能小屋ZYXC  ]9 E& ?6 k# {& Q) R
- \7 q; u, }4 |$ N0 r
收藏 评论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 手机版