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

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

[复制链接]
STMCU小助手 发布时间:2023-1-15 00:07
一、开发板平台简介:6 s! L' P) c, U5 c1 k( V
1、开发板资源简介

5 ?5 b% P# A1 [1 Q2 M- K$ e0 l(1)开发板主芯片型号:STM32L431RCT6
- r* n5 d% a7 I; c; ~9 C6 \(2)开发板主芯片封装:LQFP-64_10x10x05P
; g" [* G* `- V6 O) v/ b(3)开发板主芯片内核:ARM® Cortex®-M4  V- Y3 n& U) p+ W/ a
(4)开发板主芯片主频:80MHz$ X6 F. ?: m1 ^4 p9 e- M; ~
(5)开发板主芯片Flash大小:256KB
) I! D; L" J  ]5 G" X(6)开发板主芯片RAM大小:64KB' w' W! o6 }6 N( O2 `, L- P: i" [
(7)其他外设:请参考芯片手册
' d# B1 Q2 `. \% D0 q. K* |7 L3 q+ R8 C9 g1 ]% Q
bb91345227434ee7a43a34bf3fe366e6.png
9 m% I8 P4 D) Z: ?( E: B" ]/ Z
7 `$ v9 Z' J. G, @ 929c0cce04aa4115a8623703982bf3e1.png
0 d! a( h! a+ T7 ]2 ?8 {9 t  v+ U7 y

" P  d2 j$ h: c9 D( R3 [2 g2、串口简介
; x4 l" ]+ q1 E* a
         串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。
! B9 p- D2 g$ e4 K  X- P6 e, @        (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也试验该串口1进行。
0 L1 c6 M' q" b& `; K; }! L& U        (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。& t/ A( ]: p4 C3 j- \

( L9 j% N2 ^7 Q, q+ C  二、新建工程- V( D9 J4 j% m6 l1 y
1、新建STM32CubeMX基础工程
. r, e' y; o) \
(1)打开STM32CubeMX,点击“File”-->"New Project"​+ ~- A! P, @9 u+ T3 m( Q% p, O0 m
, q; t, z& S5 @) p& k
2399170347904e959c855fefd5877f84.png
: D& C( k9 q# _/ y
6 D1 G6 O" X, F
(2)等待打开主芯片选项界面(大约1分钟时间)。
! F% C% t$ a/ _: y" `- F8 W6 D- r/ C" ~
d74d2fdc60c9440483e2b7cf8d928e7f.png ! K1 r, Z% R) X3 v% v2 {
7 {1 `. w3 W7 |% D; I
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处现在STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。  n% y; Y1 X+ v6 I. L* `5 f" v% e

. P) E) ~8 x7 s$ Q( n" X- Y
7b80345238d74bea82ce70e1a348f7b4.png
4 T' J& J7 {7 |" n' z. r- S  b3 N. M, g) g
(4)选择时钟源。! C9 c" T+ v. k$ F% o  k- x6 z4 n* m
——因为开发板上有8M外部时钟,此处选择外部高速时钟(HSE)。
2 a2 H, d( Q9 U$ N' x4 J- C  V——因为我们没有用到外部低速时钟(LSE),此处不做处理。
! B4 X5 q& W0 w# Q. `  e- h' V7 Y2 S# E4 w+ o0 m
72119b971f62410fa8344f7f9fb9f389.png 9 a" G7 f/ y: ?- L3 F7 J9 l

& [: R( z1 u) s5 a9 q$ n6 i. S2、配置GPIO控制LED# ]: _, f) n, K9 ]' n1 s
备注:LED灯用来指示系统是否正常工作。
0 k3 K! e- \2 v* o(1)查STM32L431RCT6开发板原理图得LED1控制引脚为PC0,则配置GPIO的引脚PC0。
" I2 X, X$ a. V# M- i9 B鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。; H3 z2 v3 f1 C
& O  D, g$ X/ v: g  Q
492907c1e71149819adbaee4516a2af4.png
5 S& x, n# m  z+ V5 y
. k1 i& _1 m5 f' y! R(2)根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。​
' ]! k( @- ?  w8 Z
& u: q0 e$ @1 y4 O
38ff4b80e1c5495ba3076a5158fd91fa.png
. {* J' u; R5 P0 h; D
  i$ F) ?3 D+ U6 e0 n1 ]
3、设置串口1参数
( c- _" d& x2 P4 `3 k+ J& d8 z
(1)查原理图得知,串口0使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:
) S) X+ G/ m4 g$ P( o' U- p8 B. W) b
497b8ee0243e446784e64a3c31e8a26f.png
* n5 L7 F: v0 q; b, i/ T8 q5 Y! `: k- u. |/ Q) Z% Z- y
(2)序号1用来设置串口收发引脚的选择。; v9 t9 b' |/ L: {! |8 f( D
(3)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。& |( D' b2 u5 z, D

# x5 _3 M. Z/ ^4、配置ADC(单次转换模式)+ j# _# P  s- B8 q' P
(1)ADC简介:% w7 K0 ~; ^' b( h/ @
☆ADC全称 Analog-to-Digital Converter,即模拟-数字转换器,可以将连续变化的模拟信号转换为离散的数字信号,进而使用数字电路进行处理,称之为数字信号处理。
* y& S; E( o% r* W" o
" C2 H9 ^9 U, I, j) `# ^
☆STM32L431xx 系列有 1 个 ADC,ADC 分辨率高达 12 位,每个 ADC 具有多达 20 个的采集通道,这些通道的 A/D 转换可以单次、连续、扫描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。' A2 }' ^3 o7 D# r, a6 F

1 C3 v" v! y- E/ ~☆STM32L431 的 ADC 最大的转换速率为 5.33Mhz,也就是转换时间为 0.188us(12 位分辨率时),ADC 的转换时间与 AHB 总线时钟频率无关。
" O7 c  T! `: ?& ~$ r  @
: w' B0 \6 B0 E: C* ]! s( n. E/ \& u(2)首先选择ADC1,开启通道9
% a* [$ {3 C5 }, m/ g0 Q' J& X* U, N# e, C! z+ ?4 ~3 z! [
f31d2998798b4294a5efa1cda1de7c31.png 6 ^0 k! ?- j, [6 i: Q/ K& q7 h0 n& v
' T+ V9 c9 U4 \! q+ W+ T! g6 ~$ j. b
(3) 进行ADC配置,这里保持默认即可。+ b* V; l5 }0 A( P  J/ ?

) u: z2 C% s+ P: _
01e7319ac29443dda07463a86cb4343e.png
1 h$ w5 r1 D9 K! b% k' H, j' O
" [4 i) K# K0 x9 {) E. A: x(4) 配置ADC的转换规则,选择channel95 N7 Z: c) z# O2 k" ~. k% L

6 D2 y: `1 r: P- y% Q% t! s  J
5092b6c6ba3644239c3805164afda05b.png
/ X: s0 F! e, A; X! j, m+ ?9 c4 I3 m9 T/ m
5、配置项目工程参数
. C" K4 t5 Z0 E2 a/ `$ r. S(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。' S$ M  N, F( _# c' \- u. _" h: \

! U% i, _& Y# ?$ a
9cfb5e43f4b945c491d1ffa27f1e3284.png
% J' P9 r1 z; |6 t( l; p) {- H
" f& b$ j/ d& L; N3 @(2)完成配置工程。
- H# i/ r& c1 `6 K) ]( U3 Y3 X备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
" t8 g0 S( B: {# [3 h: T$ D! X* f, i0 G' B0 d6 y0 x5 P
efdb616174f54925b6eac31109f227b5.png ! Z. g# f6 e6 P  F4 R( E/ z
1 W4 ^9 T0 t+ @, q  h6 m
41c3f2716e4e4eda8f62fa3a1d871322.png 8 V, W+ k- ]/ `; u. A: I( y

& O) [! B2 {1 W5 Z7 Z(3)生成代码。; ?9 d3 J* m5 C0 M  e
6 Y. x; @; l1 f
8eaa7d0babea40ee93f158481a6ee471.png 3 i' J6 j( h* Y1 q

; f& m7 z$ M) D' a0 U: j( e 三、在KEIL 5中编写代码
% `3 {' q" P5 ^. g- p8 f# ?1、使用KEIL 5(MDK)打开项目工程文件
5 \3 K8 [- ?- ^9 e* _8 L
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程。1 `+ w7 w# D. ^! R; @, }
2 T+ J+ A) ^- ?" X
c4c0e8cadfbb4646acf84aca2c5938b4.png & q: J$ @/ p2 _$ t
" ]' v( r4 M& b1 {' j
2、 添加LED系统指示灯提示7 F( x6 Z# {$ z$ U4 @2 s) b
(1)添加每隔500ms,LED1闪烁一次的系统提示,用于提示程序运行正常。
0 |% \; X# s+ l9 }. q" M; K! a( J4 ]
6ab72ceaeb7a41af833842fe5ba6f34d.png 4 n$ d: ?* X) n' E0 J, w7 D
/ ]$ t$ Q: I% I" K/ Z

  d5 @+ K# T  f/ \7 L# y) ]$ R3、添加ADC相关函数代码

+ e  J1 X& [. g5 F' [7 T(1)在adc.c文件中添加ADC采样函数,返回值即是ADC的电压值% l, @! Z: U$ \+ g
  1. /* USER CODE BEGIN 1 */) v) J& d. A. i3 k( c

  2. 9 F! `7 c1 x5 K0 ^7 Q
  3. /* USER CODE BEGIN 3 */
    4 `# t1 G# b3 R
  4. 9 R( V0 ~; Q4 ?& B$ }* N
  5. /***************************1 [: _8 P( a1 J! f; L# U/ H
  6. *函数名称:uint8_t z_ADC_sample(void)1 M( F" _8 z# i$ i
  7. *函数功能:获取ADC采样电压0 x- T& U6 e6 {7 f6 ?0 R' ^& j
  8. *返回值:返回ADC电压
    $ d. _6 Q2 O# `9 b8 i3 k
  9. *备注:7 H( @# K& m0 S2 U  x
  10. ****************************/
    * V* x4 N+ W2 C# J. v  R
  11. float z_ADC_sample(void)1 ?1 e; x  a% {/ i
  12. {                ( L4 u5 D5 r! X1 l
  13.                 uint16_t adc_value=0;                                                  //ADC采样2 B! J, m5 f8 z6 r# {1 N
  14.                 float adc_vol=0.0f;                                                                //ADC采样后转换的电压, B. L+ P6 a$ A) C6 |
  15.                 for(int i = 0; i < 4096; i++)
    4 D, J+ l6 S. d9 ]% d" X# m+ h" C
  16.     {
    9 _: W: M6 f$ q# o3 f! Z" d5 O
  17.         if(i%1024 == 0)
    . d' P+ Q4 @5 q/ m" s! h! h
  18.         {8 o) k( }- D; q( S
  19.             /* 使用ADC采样 */# _& \9 N$ p& f+ s  u$ Q! _3 W0 c
  20.             HAL_ADC_Start(&hadc1);                        //启动ADC单次转换4 S; V$ B; l* m' m1 J+ I  M4 L
  21.             HAL_ADC_PollForConversion(&hadc1, 50);        //等待ADC转换完成" \; g: w4 f8 Y9 m0 [1 O4 j
  22.             adc_value = HAL_ADC_GetValue(&hadc1);         //读取ADC转换数据
    2 ^- V8 G2 K5 s, }5 |
  23.                                           adc_vol = ((double)adc_value/4096)*3.3; //转换为电压忿; `) Z% N' H- n7 {
  24.         }+ k7 I: ^! J& A8 u8 o
  25.     }
    ' c9 `) Z% l$ d: v6 y  m1 U
  26.                 return adc_vol;
    . D6 ?. v5 i  L' ?2 u, X- C
  27. }  
    # u7 c; b4 F" Z/ ?; O

  28. 8 m# g! }2 u6 O# \6 J
  29. /* USER CODE END 1 */
复制代码
3 i: z5 \( j& ?
(2)在adc.h中添加外部调用所需的函数声明。
+ S. _- ^: y6 v8 ]
  1. /* USER CODE BEGIN Private defines */$ D$ L2 ]( H5 O0 |. l6 Q3 k! C
  2. float z_ADC_sample(void);
      c" [+ S8 T  }1 G: }( j( d) c
  3. /* USER CODE END Private defines */
复制代码
0 j5 G) K2 D, x
4、添加使用串口发送函数打印log的代码
* m8 L( C! a; ~4 X2 Q(1)STM32 Cube函数库的串口发送函数分别为:
+ y$ e! H2 n9 Z$ a  a' W+ _/ r4 k9 h" }/ u* l& w
HAL_UART_Transmit、HAL_UART_Transmit_IT、HAL_UART_Transmit_DMA。本例程为串口发送函数HAL_UART_Transmit的展示。
0 t7 d# S) a% [, E9 ]4 X9 m
  1. HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size, uint32_t Timeout)( W( K0 E7 g( i0 U, G6 w, V/ c! @) r
  2.    
    + c  H  v6 w9 [( ^6 |* k" r
  3. HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)* V4 f4 T: Y7 l# ]* F
  4. ' V5 E& S6 h' U
  5. HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)
复制代码
7 }: M# ~' u6 q1 ^& `
(2)添加串口函数发送数据的log。' a, W4 C( b1 {3 K9 x: G
, F5 r& `8 D/ I) o6 a
6b0880ff9a7e44c18ba92b20895fa204.png " n% P  K  M6 Z' K1 a
, t6 G9 U. I' X& b9 `* ?  d9 p3 E
  1. while (1)
    0 N6 Q$ z7 n+ U
  2.   {6 @+ B/ ~! ^! U: G" e1 e& `* P! A
  3.     /* USER CODE END WHILE */. U, ~; J5 |) Z, {, C
  4. ' N' S* J2 O/ l3 A
  5.     /* USER CODE BEGIN 3 */
    2 S& y! [' f. W* b; M& Q
  6.                                 HAL_Delay(500);
    ' Y3 }9 `* U/ c$ U6 ]4 {
  7.                                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                //控制LED1反转( T% F6 z) [- B  k+ }
  8.                                 HAL_UART_Transmit(&huart1, (uint8_t*)"hello world,this is Transmit function!\r\n", 100, 5);) ]/ C$ R& O. g2 U* X8 c
  9.   }
    ! d$ U$ Y& q( ~/ n2 n; z
  10.   /* USER CODE END 3 */
复制代码
/ ~! B$ m4 r/ I6 M: q0 P6 {
(3)在main.c中添加调用和打印语句。
0 R$ L' w4 \& P: W' g2 o4 h, q
/ O* [" c; S- {# R' a5 D7 k$ v
  1.   /* Infinite loop */0 M4 |' T8 X* B- |8 }) j4 n8 }4 f! w
  2.   /* USER CODE BEGIN WHILE */; Q7 c1 r( \! W& u
  3.   while (1)
    8 |3 ?. X1 p+ D5 I  q
  4.   {. S# l& c! G# W
  5.     /* USER CODE END WHILE */
    $ `1 K! C6 |' b- z6 Q7 K0 D
  6. 1 m- M, y5 Y  q: A& w# G; x
  7.     /* USER CODE BEGIN 3 */; ]3 g) I  L  q8 }4 H, B1 r
  8.                                 HAL_Delay(500);- ?0 L$ s$ E( v. C9 L- _
  9.                                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                //设置LED1反转0 ^. w! Q1 i; ]0 e+ h; Y5 D' m
  10.                                 adc_vol=z_ADC_sample();                      //获取ADC的vol倿 3 Y7 t1 N5 D: w
  11.                                 sprintf((char*)str_adc_vol,"hello world,this is adc test,adc==%.2f\r\n",adc_vol);                       
    7 @' \# L/ J/ r4 C8 I6 Z& G
  12.                                 HAL_UART_Transmit(&huart1, (uint8_t*)str_adc_vol,100,5);5 Z  g! x2 F% s4 X
  13.   }6 @: `" }' `  G0 u
  14.   /* USER CODE END 3 */
复制代码
  1. /* Private includes ----------------------------------------------------------*/
    % z) f/ \, P: s1 q2 K- o1 z* J
  2. /* USER CODE BEGIN Includes */! w( |- f+ ]& Y
  3. #include "stdio.h"
    ! r6 m  E( u0 Y9 x
  4. /* USER CODE END Includes */
复制代码

1 J3 \: R0 Y+ z: j) A# R! e5、设置编程仿真下载模式
# u# D2 \" y  _7 c+ ~! @; m# K
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
. Q$ X9 U# F6 t+ Q* U/ i; K" u0 s1 M/ W( N" Q# M6 S2 k
edefb6b9a2a14be3b1221ad6d5c7a8a2.png
; K; S; o( _/ n  e; s
, [9 |8 C2 r1 B(2)点击Download(或者快捷键F8),即可下载程序。
4 R4 k) w8 D: K7 S* e9 k
, V# U! p: w. H) h
ba221842d5db40808aa129dd83c593d0.png
  E2 [, F, T! f5 T5 v4 j
9 x! A3 S% L. u  S/ I(3) 如果下载程序后,没有看到LED1灯闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
9 G) \4 \% C* X- H" i' \- H$ T) f1 J6 ?9 r: n$ |1 V- D4 B
9f8aa1a4e8f04041bcf5cb183facd100.png
0 m5 q8 v" }) m3 P$ `4 e& w7 }6 z7 Q  H" o  v9 ?8 `/ x
6、查看串口发送函数打印log效果4 H% f) Q; \$ o6 k9 K
(1)设置串口助手参数为:115200、NONE、8、 1(和代码中串口初始化参数一致)。  g; P4 C, c  ]$ N
(2)设置成功后,就可以看到串口打印的效果。每隔500ms闪烁LED1指示灯一次,且串口输出一个log。
# M# b2 {, S4 W1 J' A& g备注:PA4接GND的时候,输出值为0V,PA4接3.3V的时候,输出值为3.25V。! L' N" p; T5 `! C/ V  a9 |

! @( r1 G; r/ d4 ~, C c36c94b1faa644f89200cbd7d8cac7be.png
9 w$ B! W; h2 V0 Z2 f
, Y" Q0 H' E: ]+ @6 M8 r- w2 t. a————————————————4 F" d2 P8 Q8 v% t
版权声明:智能小屋ZYXC3 ?; F3 W9 [2 H, Y+ r2 ~# N! @
, L5 b' j  u9 H0 j. N+ q
收藏 评论1 发布时间:2023-1-15 00:07

举报

1个回答
crkylin 回答时间:5 天前

所属标签

相似分享

官网相关资源

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