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

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

[复制链接]
STMCU小助手 发布时间:2023-1-15 00:07
一、开发板平台简介:5 c% e. [6 R* f
1、开发板资源简介

+ X/ I( C4 m' H(1)开发板主芯片型号:STM32L431RCT6
3 ^0 q* u, C( c! A; H8 m& v/ {! J(2)开发板主芯片封装:LQFP-64_10x10x05P
! z" F2 J( I; G! i: V5 K1 i(3)开发板主芯片内核:ARM® Cortex®-M46 c/ L; x, E7 |% c0 [" [
(4)开发板主芯片主频:80MHz! }1 h" [+ q) p) Z. f6 u
(5)开发板主芯片Flash大小:256KB
. y. A5 r' M/ {(6)开发板主芯片RAM大小:64KB
" a- g/ e2 J8 ? (7)其他外设:请参考芯片手册
+ `6 o. J- \6 Q9 F/ y  ~- r: U, D$ J( w# E+ j" f
bb91345227434ee7a43a34bf3fe366e6.png
  C) W+ D/ P# S+ X
; J7 s. `5 A. U$ u 929c0cce04aa4115a8623703982bf3e1.png
$ M* O  K7 j6 L1 q
2 z1 W0 Y0 g! f. M$ k! b. \
2、串口简介
5 O8 P; {  J6 ~1 c+ j
         串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。
) O/ c3 _; |/ T6 ~% C% q        (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也试验该串口1进行。* b$ k5 L1 Z: y. K2 q
        (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。
9 g+ [7 v8 ^- @. u1 x" U# g- \1 r
  p- Y4 [- {9 @7 a; ]& f
  二、新建工程/ g) S  \$ ?  X  j
1、新建STM32CubeMX基础工程

) P; |+ T+ j: G) A  S# n' r+ }(1)打开STM32CubeMX,点击“File”-->"New Project"​
$ c2 W" Z% v: c2 {& ]
' N3 C; t5 A1 ^
2399170347904e959c855fefd5877f84.png , O9 p  e% r7 t  Q) U
; U+ d" O+ f7 V5 ^  L
(2)等待打开主芯片选项界面(大约1分钟时间)。
0 s. }) r$ r  c) R) N- A+ q; p9 a% y
d74d2fdc60c9440483e2b7cf8d928e7f.png ' t3 j+ a8 D  c) a; X# V0 Z- m
. U) f5 w6 s* `) k; Y
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处现在STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。4 D2 y0 t- l0 N  E$ V) e
) r$ R! L# @6 w  \1 f
7b80345238d74bea82ce70e1a348f7b4.png / f+ P) P) g) W9 T

- a. W$ y; o* w(4)选择时钟源。
0 L/ p) k. e) T——因为开发板上有8M外部时钟,此处选择外部高速时钟(HSE)。& v/ C, X6 y% ^6 s% {! o
——因为我们没有用到外部低速时钟(LSE),此处不做处理。
, U( J' M; ^+ w- P0 y8 c* n
+ I, G4 I5 i& X! B" l4 q( a! T
72119b971f62410fa8344f7f9fb9f389.png
/ \7 M( j8 }- g8 u+ x" }( s+ w& h5 X4 Q) g( i
2、配置GPIO控制LED
' H# ~9 \! O7 |9 z0 _. H备注:LED灯用来指示系统是否正常工作。
; f2 }- C+ I/ N5 A! S; u* J(1)查STM32L431RCT6开发板原理图得LED1控制引脚为PC0,则配置GPIO的引脚PC0。6 K% y6 t- Y8 O- v" g
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。2 C* c7 G* s2 Q

: U$ y- U  _2 x; _4 d% n9 {" y; k
492907c1e71149819adbaee4516a2af4.png
& S: N8 n; T: Z( O" r4 E5 E4 C% a
+ Y+ ~' d% P! |. O8 `4 c(2)根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。​
- f) l1 b- M: k  m4 w' k8 M
! M4 I$ e7 ?; r8 [* y1 G
38ff4b80e1c5495ba3076a5158fd91fa.png
9 Q1 z, }& N# G! i: c
4 C  C7 |) Q- Z+ B2 j" f4 J0 \
3、设置串口1参数

$ |. `$ U  F$ M: ]' \- M/ y5 Q(1)查原理图得知,串口0使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:$ B, x4 x% T6 J

2 t( W" M. u  }; z
497b8ee0243e446784e64a3c31e8a26f.png
  S" d6 {2 G" T2 }3 N8 L3 K+ e2 u9 ?0 T2 X3 }+ u  }+ I. c
(2)序号1用来设置串口收发引脚的选择。- w% Y8 E' ^, O  i5 p
(3)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。, U2 s4 }* c1 O) H0 m

3 `0 K# G) ^. x. n+ ~& Q4 F6 k9 a3 |4、配置ADC(单次转换模式)7 A1 t4 E0 G- Y1 C; ?0 y
(1)ADC简介:( F3 e2 h% M" i0 F9 ^" A! C3 D0 W
☆ADC全称 Analog-to-Digital Converter,即模拟-数字转换器,可以将连续变化的模拟信号转换为离散的数字信号,进而使用数字电路进行处理,称之为数字信号处理。- d. O. k( _" F

  [& T: R+ H9 F% _' M! \. W☆STM32L431xx 系列有 1 个 ADC,ADC 分辨率高达 12 位,每个 ADC 具有多达 20 个的采集通道,这些通道的 A/D 转换可以单次、连续、扫描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。$ k$ T6 [4 j$ \5 z$ C

5 z9 h9 q- W, I0 j☆STM32L431 的 ADC 最大的转换速率为 5.33Mhz,也就是转换时间为 0.188us(12 位分辨率时),ADC 的转换时间与 AHB 总线时钟频率无关。
- n9 v2 F" o6 n- b% L5 l  t' X7 z6 M9 ]1 M# q9 O+ @8 G
(2)首先选择ADC1,开启通道97 R0 ~% R& ^+ A3 L1 O5 M6 o# h

9 _& U  |7 T# {* E
f31d2998798b4294a5efa1cda1de7c31.png " _; r% T* l. j4 A
: Y! @" {/ o2 y0 u
(3) 进行ADC配置,这里保持默认即可。
9 r# c1 t% v0 f8 J1 ]/ \% i" e# ?: Y7 p6 k
01e7319ac29443dda07463a86cb4343e.png
$ z* I* U! F0 h. I5 H) U9 f. T9 ~3 q. {5 U  |
(4) 配置ADC的转换规则,选择channel9
1 l3 N8 W7 X& c# a* a0 n+ ]% E4 l7 D7 `, L
5092b6c6ba3644239c3805164afda05b.png ) R. g) W! l1 n% G* e( }

5 ?7 Y3 K0 }6 ^3 k5、配置项目工程参数, J% Q/ n5 p. q- e% t2 [
(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。
* C" X! ~7 J3 D. p3 O$ m4 E: o! X6 p
9cfb5e43f4b945c491d1ffa27f1e3284.png
8 t  R4 e  k4 p1 n7 J- n+ {1 j- R
% o7 W* Q3 ^) a(2)完成配置工程。3 b; l# q+ W. Y+ e% o8 b" b% }
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
$ C6 ^9 E5 D6 B2 q" \7 C3 y' h' q, n% |1 V; t  Y* i) O4 p- B
efdb616174f54925b6eac31109f227b5.png 6 E" `. L5 n& `, `
8 V9 Q& o5 Z. ]" U( {  [! ^' a, d
41c3f2716e4e4eda8f62fa3a1d871322.png
$ X; y6 z8 r9 v. s. m7 V. j

) Y1 v/ K9 f# _2 m(3)生成代码。" a. b  T: c* L1 Z2 w

1 G. I  v3 T1 ?6 |+ V
8eaa7d0babea40ee93f158481a6ee471.png
: W$ Y5 V+ r& ?/ G: A: N
5 L& s  {, }) I* }5 y  z5 y' I 三、在KEIL 5中编写代码
& y( d1 \7 d+ _- x& u( d1、使用KEIL 5(MDK)打开项目工程文件
* O2 ]  Z' L, V$ A) W# Q* S0 ]  M
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程。& v9 l: k8 {, c' E

, a! _4 h" |5 e0 d3 O- o* ~7 Q
c4c0e8cadfbb4646acf84aca2c5938b4.png " `8 w* C" K* d+ @
3 B% W/ D/ x  `0 S
2、 添加LED系统指示灯提示/ W% }" r$ K; h
(1)添加每隔500ms,LED1闪烁一次的系统提示,用于提示程序运行正常。
2 V; u5 }' H6 ?6 X; p% m! H. T- v0 d7 Y+ S, J1 {- k+ C) s
6ab72ceaeb7a41af833842fe5ba6f34d.png
! h* Y- D+ u7 W# Z$ l! G* R
0 s- B7 g5 P4 U  ^1 W- w. `  K; Z6 k# p  W) @* K
3、添加ADC相关函数代码
7 ]- m3 x/ t6 h* K% J# c/ w
(1)在adc.c文件中添加ADC采样函数,返回值即是ADC的电压值
7 z0 _$ z  B7 n6 ?
  1. /* USER CODE BEGIN 1 */. h! [: g" H0 w  U( ~  q: c

  2. 3 C& g; D, O4 M& w
  3. /* USER CODE BEGIN 3 */! s/ @6 r; a; j6 P8 h5 W% n1 {

  4. 8 b0 k# o" O* s! I: W; ]5 H& w4 R
  5. /***************************/ m2 t! b# I6 U) \4 k& ^
  6. *函数名称:uint8_t z_ADC_sample(void)* H& @* Y6 V1 ?" ~8 ~% c/ z: }2 ]
  7. *函数功能:获取ADC采样电压- e% p% T: Q$ @5 V4 M9 o
  8. *返回值:返回ADC电压# k! C' p7 c  `; f9 ]) r. F' e
  9. *备注:
    9 G, H* x$ Z& m; B
  10. ****************************/
    8 h$ a( C! ]9 g. H9 U" ?
  11. float z_ADC_sample(void)
    . L  _# ~. d6 y6 H8 k
  12. {                4 t( I" s% ~7 i+ Q0 Y: H; ?
  13.                 uint16_t adc_value=0;                                                  //ADC采样, a1 R% x% c+ D+ I
  14.                 float adc_vol=0.0f;                                                                //ADC采样后转换的电压
    : S% F9 `8 d8 W- K7 `6 I
  15.                 for(int i = 0; i < 4096; i++)# i& H' r' ]1 j3 }. X
  16.     {
    % y8 R- @; `. |* S- J
  17.         if(i%1024 == 0)
    : M; V$ M! m4 t1 R! P
  18.         {1 O1 G  {( D% L: l
  19.             /* 使用ADC采样 */1 ]! M  m& z/ T1 x
  20.             HAL_ADC_Start(&hadc1);                        //启动ADC单次转换
    7 u! w5 C2 ~+ q
  21.             HAL_ADC_PollForConversion(&hadc1, 50);        //等待ADC转换完成
    ) |1 p. g: H, ?+ y) _( O7 g/ [
  22.             adc_value = HAL_ADC_GetValue(&hadc1);         //读取ADC转换数据
    ) M9 u4 y9 _6 `7 q
  23.                                           adc_vol = ((double)adc_value/4096)*3.3; //转换为电压忿
    4 u1 o6 ^! H) n+ ]; Q4 x! F2 [
  24.         }
    . s1 I( x* z' \0 I4 C; S
  25.     }
      E7 s/ y" p$ n  Z  |
  26.                 return adc_vol;
      ^0 N& x+ `! t* ?
  27. }  
    ' G) i1 N2 x$ F/ t. l* s7 H
  28. , H4 u4 t% ]  h( W: s, T
  29. /* USER CODE END 1 */
复制代码

. O1 U8 Y5 N* z6 F, f+ K5 d(2)在adc.h中添加外部调用所需的函数声明。
: j7 e5 ?& O5 \6 O9 ~4 W: p
  1. /* USER CODE BEGIN Private defines */, [. B2 v1 }/ z0 p* p/ ^/ L
  2. float z_ADC_sample(void);
    / R5 a# J# i* V; m4 ~1 z4 H
  3. /* USER CODE END Private defines */
复制代码
/ V* Z) o, t; N- @
4、添加使用串口发送函数打印log的代码- O0 r; r( X1 A+ E4 \
(1)STM32 Cube函数库的串口发送函数分别为:; H3 i% I! W2 e2 \
) T8 P5 m: _, ~" d8 q
HAL_UART_Transmit、HAL_UART_Transmit_IT、HAL_UART_Transmit_DMA。本例程为串口发送函数HAL_UART_Transmit的展示。
* L( G" J/ k  X5 n. R# `/ ~) {
  1. HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size, uint32_t Timeout)$ v& V6 W/ W* F8 z, `
  2.    
    3 e3 A: f" h4 z1 e) ]1 V
  3. HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size). V/ i: _5 w- U' ], ^, E
  4. , d/ Z, f3 X' V  o2 ?
  5. HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)
复制代码

; V# ?' I0 g, X  R7 M(2)添加串口函数发送数据的log。
: J2 `$ S* p2 L4 A/ [- I  N1 i( @9 ^
6b0880ff9a7e44c18ba92b20895fa204.png
3 l& I1 m% f" Q3 C9 c; r( P$ A  K( U' {2 t
  1. while (1): E! t0 h+ f! `* l; o, i0 i
  2.   {' ]" M% Y  u  x
  3.     /* USER CODE END WHILE */; \# `2 u. x0 F+ d# d
  4. # u" J, C  ~( o7 p- R
  5.     /* USER CODE BEGIN 3 */
    1 e* K- }) x; V" [/ Q1 t2 D: `( X
  6.                                 HAL_Delay(500);9 F$ E; _0 C$ N: N3 b
  7.                                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                //控制LED1反转. a0 K* o/ @& B+ a
  8.                                 HAL_UART_Transmit(&huart1, (uint8_t*)"hello world,this is Transmit function!\r\n", 100, 5);
    & r6 K: d  _/ T; s8 K: n' z6 a% x: M
  9.   }
    ; d/ U+ J& }3 s* g4 k
  10.   /* USER CODE END 3 */
复制代码
# F( T0 e& M8 e3 U
(3)在main.c中添加调用和打印语句。' }# R* A" b) U1 B' v' J
' I- [2 x6 \& T1 z4 d7 t2 W" ^0 m4 z
  1.   /* Infinite loop */1 ~6 }, l" ]9 ]+ `8 q9 _8 E4 F7 J# [
  2.   /* USER CODE BEGIN WHILE */
    & Y: N" y* U9 w) }' s. c
  3.   while (1)/ H* Q; H9 d3 F. f+ F7 \. ?
  4.   {8 \# M) O3 u$ J! t! x' Q
  5.     /* USER CODE END WHILE */! t. m* T% [) W' a" p

  6. ) N( n2 U- ]7 V& ]- H- \
  7.     /* USER CODE BEGIN 3 */3 A/ b# S( U" m( E" h! J
  8.                                 HAL_Delay(500);& f; M. V6 A. V, T
  9.                                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                //设置LED1反转9 E3 R: k! G! y& z* i
  10.                                 adc_vol=z_ADC_sample();                      //获取ADC的vol倿
    % s  y9 O1 Z, s; R
  11.                                 sprintf((char*)str_adc_vol,"hello world,this is adc test,adc==%.2f\r\n",adc_vol);                       
    3 p+ h8 R+ S' j. I2 l2 J" \  l
  12.                                 HAL_UART_Transmit(&huart1, (uint8_t*)str_adc_vol,100,5);& f5 }3 \- Q# z$ U" k
  13.   }, A  H* Z8 _$ m8 v0 M- Y1 M5 y
  14.   /* USER CODE END 3 */
复制代码
  1. /* Private includes ----------------------------------------------------------*/' x& p; Y0 @# {* }; b. p
  2. /* USER CODE BEGIN Includes */5 u$ a8 l# L& d% d: @" ?* e: E" G
  3. #include "stdio.h"
    * D% N0 p+ T) P0 q
  4. /* USER CODE END Includes */
复制代码
- X/ z" Z2 j3 q- F
5、设置编程仿真下载模式
( p2 y% Y! H& v: ]  ]; d
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。* W! f/ f3 ?- ^' C3 A1 K5 Q

9 T. s2 L1 P% ^7 S4 o, q- N% Z( r
edefb6b9a2a14be3b1221ad6d5c7a8a2.png , r  R, k8 I, O4 d) Z
. W+ E) q9 x' F5 L9 H% }' \
(2)点击Download(或者快捷键F8),即可下载程序。. Y: {( R+ j* n% c

# G; E+ @; t; y3 }6 F. [
ba221842d5db40808aa129dd83c593d0.png ' U# z% S$ D3 }  N& D

) C/ T/ G( J0 s! J6 W. S* M& C(3) 如果下载程序后,没有看到LED1灯闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。' [! }. U3 {* l. m; @" V) ~! L1 ~
  M' O& F  r# N+ o& d' {
9f8aa1a4e8f04041bcf5cb183facd100.png
/ T3 ~1 y+ p) o; P& r. h5 U% N5 ~% s& u! U  e2 }- _
6、查看串口发送函数打印log效果
7 e2 ]7 k( T) H% T4 Z# L(1)设置串口助手参数为:115200、NONE、8、 1(和代码中串口初始化参数一致)。
8 M9 x4 G0 H3 s: O(2)设置成功后,就可以看到串口打印的效果。每隔500ms闪烁LED1指示灯一次,且串口输出一个log。/ {$ M3 J2 F' ^5 g. G
备注:PA4接GND的时候,输出值为0V,PA4接3.3V的时候,输出值为3.25V。4 ]/ h; y! o- }( P: \8 p( U. ]- F: P

/ ?& i0 G5 R4 M+ | c36c94b1faa644f89200cbd7d8cac7be.png * G; p# j. \+ R3 J4 X4 P

- J- t" J/ o( G( W' s- c+ ~————————————————" _6 B- t/ ~: r9 R2 w( k' O2 Q
版权声明:智能小屋ZYXC. R$ Q- N, X$ |0 k
7 |, W0 l# j* _
收藏 评论0 发布时间:2023-1-15 00:07

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版