一、开发板平台简介:" P7 }" h* m- k9 I5 O% w) ~
1、开发板资源简介
& `% E* t0 q& T: u6 {# b' g' A. W(1)开发板主芯片型号:STM32L431RCT6
* f" O0 {8 Y1 ^+ l(2)开发板主芯片封装:LQFP-64_10x10x05P
# U1 W( E$ _% `* F/ |(3)开发板主芯片内核:ARM® Cortex®-M4
1 Q+ }9 D' l1 M2 H(4)开发板主芯片主频:80MHz
; N+ _4 x& V4 Q6 f" G7 e1 j(5)开发板主芯片Flash大小:256KB
( L5 B5 K* S$ h3 l1 }0 b0 A# {(6)开发板主芯片RAM大小:64KB
- w9 H$ b' I& _% a# F$ N3 k
q0 h+ N7 w: \2 y5 p1 Q3 A
& X& V) l) T* m* M
: \! Y; B& N( c' g5 v8 k
$ A$ q, Y7 j* s* V
, V3 r2 h2 l5 y6 m+ v7 |' [2、LED灯资源/ f7 q! I% i( W6 [, @& y
(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:! Z3 J* P0 f0 u" }2 Q4 _
# o2 F l- b. m2 M- a
! b; h- J" W% ]
: u& P( v. V7 A1 U$ p
(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:
' T2 n5 P$ ~1 G3 I/ Z p; ^; A+ {! k& _1 |
0 H. g& e& L' I0 F! g' n, C- o$ H
: a8 l" H' w2 n3、串口printf打印工作原理) k' y% a+ }7 t3 v
串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。
2 W" H+ K2 c( l+ d& ?5 O) U# Y$ i% o! O1 z3 |+ p% [, V
(1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也可使用该串口作为debug串口。
( H4 e7 |/ M9 X2 q$ [
* k' N1 k3 c/ P, h) o: _ (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。
. K# e, r/ C! m! R2 ~8 \
, ?9 K6 M% e8 C4 d6 P5 h8 G' }$ STTL转CH340串口,硬件原理图如下所示:* Y2 p7 K2 C& o( q; d J3 C
2 O7 ^+ S6 V5 C9 D, n% L, R5 N
. N0 A1 O9 [7 W& Q2 v8 P' t
, z4 x- Q; Q3 N8 Q/ B; U3 r& f* O) A6 Q
二、串口printf实验过程
! c( A/ o( A4 a3 L; H2 V* B% |9 f1、新建STM32CubeMX基础工程
) ^, ~, l* S# B8 j9 d) c* b, L(1)打开STM32CubeMX,点击“File”-->"New Project"
/ y+ k' i3 R1 s& _+ j
^5 y! [( p& k
9 {; D2 f' e" d3 K- X! l! B5 p: q# D1 m/ z0 [
(2)等待打开主芯片选项界面(大约1分钟时间)。+ i& |6 U0 \: o% c; s- S
, Y; n* S; N+ [! Z7 ]( y# P8 o; u
$ {7 Y- I# z6 A# \" }
& @. |! y# n2 O, M
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
% \' F: b" q& W% S% F. Y# H
! g/ M. q0 w1 G8 c. R) P* b
4 I; M/ S1 v2 `" S7 c3 w
6 i4 U; Z9 d1 h% u! t& e' X, H& e
(4)选择时钟源。7 Y t, ^4 K( y
(1)因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。
1 U1 Z/ t8 r5 W4 V8 l/ J
4 {5 `/ P$ N+ v/ p7 Z- d
5 J1 b; I A. Y! Z
0 u1 c) e" h, @4 B( D
(2)因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。
7 K0 b, h% n. Y
, \( c/ t( s( i: q R4 `3 v' R
& A* F4 {4 i6 h: T/ W
/ x# E9 R5 g! H& N2、配置GPIO控制LED$ g) c: K4 S, a3 X' e
(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:
6 p+ q( E, q$ m# Z6 t' u* C7 X
; K$ M. M( c: X; W$ n( {9 ALED1——PC0
( l" N) `! c% E: [( N% B5 a3 CLED2——PC1" [' o* i) H( \$ T6 Q2 }
LED3——PC2
9 w0 f" q" u3 J4 I5 pLED4——PC3: F' }" i: h# g: N) N% X) `5 ^
& n+ B& C6 T% ] X f4 v7 Z
(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。
' H! {6 Y4 S& m, ?2 D- C6 e, R/ m
( q; b# g# C" Z鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。& T/ b' S1 K! H$ U! P5 O; }0 Z
鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。
6 G6 c/ @2 D( e8 Z5 ^鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。
: D9 |/ a) n# s. Z鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。+ f8 f6 P. ?6 C2 i$ E p
/ |/ D" l9 L L- l6 X2 f
7 ^1 I, J# K! H& [) P3 L" i
4 g L' d, O2 b+ c j- ~
/ o4 y: k! W) \" J
% g$ J |' h# _& W
(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。: B% ?2 t) E6 }, m
1 k1 D7 u4 Q- T5 u
8 y8 ~+ A1 @8 Z9 {( H1 ^
( J0 A5 Q9 n+ \% f A7 v8 ~6 l3、配置PA9、PA10为串口
$ Z4 c+ l; h2 G0 m% t查原理图得知,串口1使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:7 M% F, u- ?, a9 F8 X/ m
% B' x p' L3 z$ [0 z* U
+ t# Q5 A% L* L3 Q1 @! P5 B8 X
* F8 c7 K* S& G# s (1)序号1用来设置串口收发引脚的选择。
! k `9 S( d) p! m- h(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。
& d3 Y1 B1 C1 d) i( a4 B; Y! y2 R
3、配置项目工程参数$ b$ T/ m f: [
(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。
) r* B' i( v( U# k( G: [, m( P9 T' w$ c9 `* [. R5 P2 Q
8 b2 V& V K/ c$ Q" @! i
1 g% D+ J2 A- C7 j
(2)完成配置工程。8 U% C$ Z+ F) W" b* R6 |
6 R7 |. t9 h* A/ R& w
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
' V* ]6 b+ p+ O4 S: Y0 y% b3 @6 F M+ a8 {8 e
7 q: H6 D5 ~" h: t9 N% G. ~' U3 m$ u* o3 V
& A; @, ?1 N& M* h; a. h& r/ I
3 B) ]6 j* M, m3 P8 R/ Q: Y& a2 ?(3)生成代码。; y3 f" v: J' y/ O# ?
/ w6 p) H$ W& i9 k备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。
+ w6 R0 u+ w. e9 b
0 z/ ]* M9 z3 l4 B; F$ M( Y8 Z$ K
, X" _4 p( E: }2 w$ o. N9 k! X, s2 M
/ s5 |! j& @9 E2 l
(4)工程代码生成成功。. s+ j0 o% P' Y3 m
* T Q/ e6 P5 ]- v0 o1 Y
1 P9 f$ }/ w% Z2 S( [1 ?) x! e0 `+ D0 V Z
三、在KEIL 5中编写代码) s. H2 J- i% k( _# p: |
1、使用KEIL 5(MDK)打开项目工程文件) t/ V# v$ [. m5 D* D% T
源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。% F7 t+ Y3 y x; L" C' Y7 b
4 K) D( W/ N2 N% u: g9 ?; |
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。7 r1 C, u& r1 ]* b
0 l& w3 Q' p0 @! t
' @& b* n1 t& I1 b+ V% N a) y( ?* s& ~* [0 Q& U& I* {. H+ w
2、添加串口printf验证程序
: b# Z- V8 z: @4 [* Q, l' D(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加控制程序,如下所示:实现每隔500ms后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换,并且串口每隔500ms打印一次。
5 V/ P7 |( z$ t m* s8 b1 _1 Q2 O+ E8 t( o- W$ U
备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。
& k4 {: B0 H. T, j% `6 i2 Y H8 N+ r# O4 j* n
8 |# C6 s- U+ J7 i9 y- M3 G/ ?
6 @: L$ H( V \4 ?4 c' @
& f4 a. Q' n) k# k) ~$ ?& i
3 {$ f* J6 o. e) q" b9 R1 f(2)main 函数代码如下所示:( |2 H, @) M7 q* Q$ w, @
- /* Private includes ----------------------------------------------------------*/; t: `. \. ^9 |: v/ U
- /* USER CODE BEGIN Includes */
0 E3 f, w0 V/ }5 P1 e8 G. J - #include "stdio.h" //添加printf打印函数头文件2 F7 e# S6 Z: f- R2 C
- /* USER CODE END Includes */
- ?5 @7 O& j5 ^1 M -
2 ~' ~/ E% e8 Q - ) i' S! Q+ l- G. O3 s" j
-
0 c9 l0 R; P9 c5 _ -
- J) R& f, ^$ [7 D5 x - - |8 W' H" O0 S8 Y C% e
-
( c( L5 ]: y2 F$ q7 J - 7 t$ F: W! L( k) a2 d, m
- int main(void)
+ w3 J3 c' ?2 k- M/ X$ a, G - {3 d5 s' y9 ^# i3 c. Q- t* n
- /* USER CODE BEGIN 1 */
' O N+ ?1 x8 c, c+ T - ) _/ _, u- q) R3 v! j/ i
- /* USER CODE END 1 */* W5 ]9 |6 ] O+ x$ u4 A
-
* w/ S& t( G2 i [; n - /* MCU Configuration--------------------------------------------------------*/6 O' t/ G9 R( V, P: j6 U, v, ]
-
8 [( V0 h; g# b/ c- b - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */8 m! P2 E2 s4 T6 g' ~
- HAL_Init();& S4 O% I9 c a0 ` O
-
2 o$ p/ ~7 G1 Z. W, F$ ~ - /* USER CODE BEGIN Init */6 ?% P% \/ }! s/ |0 q& h
-
. w7 v0 R+ x- \5 C0 n: R - /* USER CODE END Init */. d" V; `& t& Z5 _5 l" B+ S: y& `
-
) _; `0 P) n1 b2 K( w - /* Configure the system clock */
% r% K$ L8 z; U& q& E - SystemClock_Config();
0 a2 H& z+ Z6 b& e* A -
+ w! f) c1 i3 h5 i - /* USER CODE BEGIN SysInit */
5 w# u3 ~$ M$ D -
- g ]1 h& T2 b9 z7 N - /* USER CODE END SysInit */
- S% m) L! C& O: b, H -
5 d$ t1 O. k7 u5 j! n# x8 y9 w - /* Initialize all configured peripherals */
; z" }5 K' h3 ?9 X. B1 y. Q0 ~ - MX_GPIO_Init();& J: Q5 S* A# @$ c
- MX_USART1_UART_Init();+ V9 f/ g9 l( c. o
- /* USER CODE BEGIN 2 */+ N3 h& z& v7 k* b
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET); //初始化LED灯,默认点亮
* \( X* g. R9 R6 W( [& a' X - HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET); //初始化LED灯,默认点亮
" w, @) M3 m+ \, w. Y - HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET); //初始化LED灯,默认点亮
+ z j1 L& T# I W ] - HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET); //初始化LED灯,默认点亮
# J3 O# I" \9 x5 N - 4 T& h Z2 Y3 f+ x5 o( \
- /* USER CODE END 2 */
) C8 z- A) E ?' S" B -
# A0 `7 B5 ~$ K/ K% J" y- K - /* Infinite loop */
* n% @3 D: ~$ Z1 c - /* USER CODE BEGIN WHILE */' {8 @# M }+ y: Y. F2 i: _
- while (1)
, h# ^/ V: R) n9 A7 A - {
% x% ]2 {( X; F* U* r' } - /* USER CODE END WHILE */9 E( l" f5 _# Q
- /* USER CODE BEGIN 3 */4 q3 B" U |7 n! J# p9 Z4 k! t/ ~
- HAL_Delay(500);: Q8 [ ^" a. Y! L @6 G! k
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0); //反转LED灯& h& O7 W6 S* v6 `# W/ f7 e
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1); //反转LED灯
. l! n4 c9 E' Y+ E6 ] - HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2); //反转LED灯
% ~" ^: i, f9 P5 U" [, A, ~& s2 B - HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3); //反转LED灯
6 _0 y. n$ n3 a& j - printf("hello world,this is printf function!\r\n"); //printf打印
! h9 j8 J, _" c6 J8 ], N! k0 Q - }5 L2 e( Z2 k) a/ V+ M
- /* USER CODE END 3 */) e6 N' @% d1 b2 H
- }
复制代码 ( s" p. ?, |* J5 T: I3 V: D
3、设置编程仿真下载模式
' k& g9 P6 A4 E9 x! y4 S(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
$ \, e* v3 D8 H/ i
% i$ C# {5 z8 [1 {
& c5 h/ ~1 X& h: C. E6 B
3 q, i8 t, l4 X1 k, X1 N
(2)点击编译,完成后提示“0 error(s),0 warning(s)”。9 N6 o1 _# {2 |# B
& o) D3 l. V8 I1 I) f9 c# V9 G
& I" ?* `. ^! N+ g, q; \4 l3 j$ h& ^% T( B6 U# j. o1 ~
(3)点击Download(或者快捷键F8),即可下载程序。0 n6 ?: A; Z, E0 g9 F, c- N( C- Q
' T; E- v4 A# ] o
8 V9 ?: L7 @3 _% m+ {$ z
# `) K5 S2 P, y3 ]9 f) Q2 D. o- R& ~2 s; I2 `% x
(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。6 k1 O, \1 k( s7 `5 U; p! o- D( ^
* I, s3 |; f+ u1 p
4 D' N4 B% q6 O+ h: T9 n/ h& r
9 C H0 m2 n% C) x4 m7 r4、串口printf打印实验效果展示) T! c2 j, ]! Q O S4 D* g
程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后每隔500ms闪烁一次,并且打开串口助手后(串口参数:波特率115200、N、8、1),可以看到printf每隔500ms打印一次log数据。: N8 c9 W3 N! k
6 \1 A- B" d4 ~9 H+ h) r( ?; h
" g9 S, a! {* R0 l1 b$ W
# e% V/ Y" d3 p5 |5 X/ B————————————————
' D# u6 x. R2 _4 C' {版权声明:智能小屋ZYXC
/ O# u- U9 N+ Z
) {9 v n2 S6 D, P) a+ K- D |