一、开发板平台简介:
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 |
' m6 d2 m4 l. l% H6 J; g! G* d
2 c& i6 V4 `- p+ q1 P5 h6 t& z
# 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
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
, 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
, 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
) 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
) 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
/ 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
; 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
/ 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
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
, [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 _
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
6 s" [* K0 J5 Q4 x+ l2 \: |2 q
, B7 @7 z& C5 s
% {: 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
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+ }
+ 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
. 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- /* USER CODE BEGIN 1 */
& J% c @& k0 [& W- H/ t. y - + D& z4 Z' ~# A2 y# f; R
- /* USER CODE BEGIN 3 */' ^+ c: f: ]! [
-
$ Y7 P7 P+ m. z: ~: L - /***************************
; ?5 }4 u* Z6 w7 s - *函数名称:uint8_t z_ADC_sample(void)& N# |4 |9 ~/ Q; `
- *函数功能:获取ADC采样电压& O# x) q; u# Z
- *返回值:返回ADC电压
, H& y, N' Y, n8 s. `, ^$ B - *备注:
x: e% X# B0 A: V' E - ****************************/
. y1 ~ T t* I8 d) { - float z_ADC_sample(void)3 f3 G* T7 W9 u7 y+ e* C8 ?- ^
- {
1 m$ o/ \% k; F - uint16_t adc_value=0; //ADC采样
/ L$ Y8 v$ u' F: _# ] - float adc_vol=0.0f; //ADC采样后转换的电压
/ |; J, O% y* k+ ]4 G( {2 I; Q - for(int i = 0; i < 4096; i++)) ` ?# U" z8 O# I! z
- {( M6 J! E+ }3 T
- if(i%1024 == 0)7 z$ r: d' X' o* U* k4 |, h
- {9 }& z# i0 Q4 i7 Y0 S
- /* 使用ADC采样 */& o2 y e4 b" C" D
- HAL_ADC_Start(&hadc1); //启动ADC单次转换
( }+ B& G, t1 `; o& o( W+ N - HAL_ADC_PollForConversion(&hadc1, 50); //等待ADC转换完成9 u$ O5 `, H$ Y. s' s
- adc_value = HAL_ADC_GetValue(&hadc1); //读取ADC转换数据 g8 O/ v- K( l$ N2 R, Q
- adc_vol = ((double)adc_value/4096)*3.3; //转换为电压忿
3 G% k0 Z# c& ~$ ?: j: O% G - }( e7 l# e- D4 v( E
- }* G1 j* k7 H$ ?! _; n
- return adc_vol;; N; l5 ^# d. B R
- } 0 { s! ^6 \( b. k3 ~3 l" _( U: N/ V2 B
-
: a1 O* M+ m" N9 \1 X - /* USER CODE END 1 */
复制代码
i+ P' H# F4 @ J2 S(2)在adc.h中添加外部调用所需的函数声明。
. d" c" }+ k2 f. W7 w. j- /* USER CODE BEGIN Private defines */
* @' t F; r8 `# b- `. y - float z_ADC_sample(void);
( b% F2 ^. K4 O1 e0 p - /* 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
- 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
-
8 E l; c/ r& i4 J ?2 M I( h5 m - HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)# `! R/ B) y/ R0 m- p
-
7 s) X5 w/ Y- J! D+ E5 G - 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
1 N* g3 l! d" M: h% Z
g) _( S& r E8 A9 X7 R0 w- while (1)
7 m9 e$ b8 b* ]/ w - {
* N+ H& H- a5 F# O - /* USER CODE END WHILE */# D. e- I g/ Q; F, W3 ^, `# Y
- ) P* Q, Y( V# h, |) H' J
- /* USER CODE BEGIN 3 */% { M6 h' Z; h7 N1 E& o% w! Q
- HAL_Delay(500);- a+ H) ^7 s* l+ p
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0); //控制LED1反转: W h( d) A2 m# P' q9 h& N
- HAL_UART_Transmit(&huart1, (uint8_t*)"hello world,this is Transmit function!\r\n", 100, 5);
' l& K, n/ y4 N - }
$ ~% s/ D. j, ]9 h$ W' Q - /* 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- /* Infinite loop */# x; `" c* M$ d9 Z; o
- /* USER CODE BEGIN WHILE */
6 o- K% W6 O7 {2 v; y - while (1)
" F; z6 x6 N& \2 Q E8 S - {
$ q$ p/ i( @5 b! u - /* USER CODE END WHILE */
; u! k" i; p. r3 D) ? -
% i8 O& @7 n9 v0 v, j, q - /* USER CODE BEGIN 3 */
|4 P& c* M- s* q - HAL_Delay(500);
1 X, V+ v n5 h* \% T! g% |7 _ - HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0); //设置LED1反转3 B( R) F. ~! P& p& j3 J
- adc_vol=z_ADC_sample(); //获取ADC的vol倿
9 ^/ q9 e9 K: f; s, D' _ - 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
- HAL_UART_Transmit(&huart1, (uint8_t*)str_adc_vol,100,5);) P5 s$ S5 W9 A
- }; B# X% ^1 h0 c1 s! g* \
- /* USER CODE END 3 */
复制代码- /* Private includes ----------------------------------------------------------*/
5 ~, R. B& C1 } T4 n/ |2 B - /* USER CODE BEGIN Includes */
8 N& W; j3 i- K' o4 z% g$ J - #include "stdio.h"
; @7 Y! w% s# U6 b2 R - /* 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/ [
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
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 ~
+ 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
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
|