一、开发板平台简介: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
C) W+ D/ P# S+ X
; J7 s. `5 A. U$ u
$ M* O K7 j6 L1 q2 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 ^
, 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
' 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
/ 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
/ \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
& 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
9 Q1 z, }& N# G! i: c4 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
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
" _; r% T* l. j4 A
: Y! @" {/ o2 y0 u
(3) 进行ADC配置,这里保持默认即可。
9 r# c1 t% v0 f8 J1 ]/ \% i" e# ?: Y7 p6 k
$ 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
) 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
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
6 E" `. L5 n& `, `
8 V9 Q& o5 Z. ]" U( { [! ^' a, d
$ 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
: 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
" `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
! 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 ?- /* USER CODE BEGIN 1 */. h! [: g" H0 w U( ~ q: c
-
3 C& g; D, O4 M& w - /* USER CODE BEGIN 3 */! s/ @6 r; a; j6 P8 h5 W% n1 {
-
8 b0 k# o" O* s! I: W; ]5 H& w4 R - /***************************/ m2 t! b# I6 U) \4 k& ^
- *函数名称:uint8_t z_ADC_sample(void)* H& @* Y6 V1 ?" ~8 ~% c/ z: }2 ]
- *函数功能:获取ADC采样电压- e% p% T: Q$ @5 V4 M9 o
- *返回值:返回ADC电压# k! C' p7 c `; f9 ]) r. F' e
- *备注:
9 G, H* x$ Z& m; B - ****************************/
8 h$ a( C! ]9 g. H9 U" ? - float z_ADC_sample(void)
. L _# ~. d6 y6 H8 k - { 4 t( I" s% ~7 i+ Q0 Y: H; ?
- uint16_t adc_value=0; //ADC采样, a1 R% x% c+ D+ I
- float adc_vol=0.0f; //ADC采样后转换的电压
: S% F9 `8 d8 W- K7 `6 I - for(int i = 0; i < 4096; i++)# i& H' r' ]1 j3 }. X
- {
% y8 R- @; `. |* S- J - if(i%1024 == 0)
: M; V$ M! m4 t1 R! P - {1 O1 G {( D% L: l
- /* 使用ADC采样 */1 ]! M m& z/ T1 x
- HAL_ADC_Start(&hadc1); //启动ADC单次转换
7 u! w5 C2 ~+ q - HAL_ADC_PollForConversion(&hadc1, 50); //等待ADC转换完成
) |1 p. g: H, ?+ y) _( O7 g/ [ - adc_value = HAL_ADC_GetValue(&hadc1); //读取ADC转换数据
) M9 u4 y9 _6 `7 q - adc_vol = ((double)adc_value/4096)*3.3; //转换为电压忿
4 u1 o6 ^! H) n+ ]; Q4 x! F2 [ - }
. s1 I( x* z' \0 I4 C; S - }
E7 s/ y" p$ n Z | - return adc_vol;
^0 N& x+ `! t* ? - }
' G) i1 N2 x$ F/ t. l* s7 H - , H4 u4 t% ] h( W: s, T
- /* USER CODE END 1 */
复制代码
. O1 U8 Y5 N* z6 F, f+ K5 d(2)在adc.h中添加外部调用所需的函数声明。
: j7 e5 ?& O5 \6 O9 ~4 W: p- /* USER CODE BEGIN Private defines */, [. B2 v1 }/ z0 p* p/ ^/ L
- float z_ADC_sample(void);
/ R5 a# J# i* V; m4 ~1 z4 H - /* 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# `/ ~) {- HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size, uint32_t Timeout)$ v& V6 W/ W* F8 z, `
-
3 e3 A: f" h4 z1 e) ]1 V - HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size). V/ i: _5 w- U' ], ^, E
- , d/ Z, f3 X' V o2 ?
- 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 ^
3 l& I1 m% f" Q3 C9 c; r( P$ A K( U' {2 t
- while (1): E! t0 h+ f! `* l; o, i0 i
- {' ]" M% Y u x
- /* USER CODE END WHILE */; \# `2 u. x0 F+ d# d
- # u" J, C ~( o7 p- R
- /* USER CODE BEGIN 3 */
1 e* K- }) x; V" [/ Q1 t2 D: `( X - HAL_Delay(500);9 F$ E; _0 C$ N: N3 b
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0); //控制LED1反转. a0 K* o/ @& B+ a
- 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 - }
; d/ U+ J& }3 s* g4 k - /* 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
- /* Infinite loop */1 ~6 }, l" ]9 ]+ `8 q9 _8 E4 F7 J# [
- /* USER CODE BEGIN WHILE */
& Y: N" y* U9 w) }' s. c - while (1)/ H* Q; H9 d3 F. f+ F7 \. ?
- {8 \# M) O3 u$ J! t! x' Q
- /* USER CODE END WHILE */! t. m* T% [) W' a" p
-
) N( n2 U- ]7 V& ]- H- \ - /* USER CODE BEGIN 3 */3 A/ b# S( U" m( E" h! J
- HAL_Delay(500);& f; M. V6 A. V, T
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0); //设置LED1反转9 E3 R: k! G! y& z* i
- adc_vol=z_ADC_sample(); //获取ADC的vol倿
% s y9 O1 Z, s; R - 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 - HAL_UART_Transmit(&huart1, (uint8_t*)str_adc_vol,100,5);& f5 }3 \- Q# z$ U" k
- }, A H* Z8 _$ m8 v0 M- Y1 M5 y
- /* USER CODE END 3 */
复制代码- /* Private includes ----------------------------------------------------------*/' x& p; Y0 @# {* }; b. p
- /* USER CODE BEGIN Includes */5 u$ a8 l# L& d% d: @" ?* e: E" G
- #include "stdio.h"
* D% N0 p+ T) P0 q - /* 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
, 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. [
' 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' {
/ 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+ |
* 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* _
|