一、开发板平台简介:* X, b O' H6 q) X
1、开发板资源简介. X3 F, `* r0 `) t5 c
(1)开发板主芯片型号:STM32L431RCT6" m! j z; m o8 M V8 ` W
(2)开发板主芯片封装:LQFP-64_10x10x05P
1 r4 O- j5 R* k7 X& E7 ]# L; ?(3)开发板主芯片内核:ARM® Cortex®-M42 L7 a9 B1 p$ ?
(4)开发板主芯片主频:80MHz
; }1 G0 b' i0 b(5)开发板主芯片Flash大小:256KB! G6 C1 G' @. [ `7 d; P5 L
(6)开发板主芯片RAM大小:64KB
- Z$ |! Y& q+ y (7)其他外设:请参考芯片手册
* ^, l3 P6 r3 Z2 A( [
+ P9 Y# K) ?& r& m8 [
* A- F- d3 ^3 k% A1 [2 f$ e% {6 ~- f* B% D! K* a0 |& X
& J( ]; l7 Z: L J7 o* t* W% T+ Q, Q' K1 _
2、串口简介
{5 H4 M- p) o9 |+ w: j, j' R 串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。
6 h' `% P( t2 L- B (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也试验该串口1进行。
. P9 A# n( H& }5 o& c* E (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。6 w9 G% {1 p$ a! r3 [) |% ]' k
" E) R3 x _9 |9 L+ Q 二、新建工程
) F$ m0 x" R$ t7 q) D1、新建STM32CubeMX基础工程
8 \8 Z9 f1 Q5 ?! }4 w- D' h2 b(1)打开STM32CubeMX,点击“File”-->"New Project"( i; e( O8 p# ^: R3 }* e2 ]
0 L, ~* g+ q/ y# U4 ~
$ T9 [9 `8 X7 a
6 m$ B$ A; @( n" W/ a(2)等待打开主芯片选项界面(大约1分钟时间)。
7 L7 L- \, |4 x* m& H' L- ~/ r3 k6 p7 w/ l! E1 X
+ M# o6 p' h" E* D
) X4 w+ W4 p6 }; l, f(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处现在STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。) d1 G: f" z4 N) ?$ _, s' \' u3 v
" ~. N$ L. _+ ~4 [ {9 z: P
6 t9 b3 A* s- h) A3 V( u
0 d/ v) d, o9 O, r6 T5 f+ Y) q(4)选择时钟源。5 s7 Z& h8 ^. k1 ?, P" Q
——因为开发板上有8M外部时钟,此处选择外部高速时钟(HSE)。" D& e3 z2 Q% Y' ^
——因为我们没有用到外部低速时钟(LSE),此处不做处理。
9 V' T0 S! d9 t) ?% f. r3 A4 n, d0 r+ j# ?8 p" q. Z6 v
: |6 ?5 d& Z" x% p, Z% T! Z7 v y! R3 d7 {+ j) Y/ b. l
2、配置GPIO控制LED
( X6 n" @( R' n- |+ ]' F1 m备注:LED灯用来指示系统是否正常工作。$ }7 S# Q; t3 l d4 o
(1)查STM32L431RCT6开发板原理图得LED1控制引脚为PC0,则配置GPIO的引脚PC0。
- L9 Z: Z7 h8 P- [1 h3 O鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。
, _& [& X) @5 u% P' S
4 }* j; v# j3 S/ D) J, m
9 K" g$ [" S; W2 P1 a2 b' U1 n
3 N0 K1 h- k0 G(2)根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。
$ s; x# j, m \4 \9 e* G
) B+ W5 ? r- j5 l/ G
" |% h: m, ^4 V4 a) @
7 V: ?! F: U9 k
3、设置串口1参数
% T f A* ~9 F8 @ @(1)查原理图得知,串口0使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:- s( }' ^3 C; j
* H0 K) Q* g5 c1 Q# N% D8 {* V5 Z
3 M; P2 o9 ^" v7 I8 h
( \; L1 w# r4 S# s/ j3 n9 K (2)序号1用来设置串口收发引脚的选择。
; ^9 \% s& R, a) Z" w9 m* h (3)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。
7 U5 r- P6 ^0 f: u
+ C9 @, ?- D' a0 @8 I/ K2 _' Q4、配置ADC(单次转换模式)
* y8 O$ {; N' B: o(1)ADC简介:
+ U3 l4 ~% P; I4 b1 q, r☆ADC全称 Analog-to-Digital Converter,即模拟-数字转换器,可以将连续变化的模拟信号转换为离散的数字信号,进而使用数字电路进行处理,称之为数字信号处理。
, B5 |( ?" }6 l! u% M0 B) F/ Y$ } V4 e) U
☆STM32L431xx 系列有 1 个 ADC,ADC 分辨率高达 12 位,每个 ADC 具有多达 20 个的采集通道,这些通道的 A/D 转换可以单次、连续、扫描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。9 F( @3 Y, B- Z" `
' P" r: K1 }/ H( }
☆STM32L431 的 ADC 最大的转换速率为 5.33Mhz,也就是转换时间为 0.188us(12 位分辨率时),ADC 的转换时间与 AHB 总线时钟频率无关。 }7 @' h/ ]& U5 b0 |
* x: A$ d0 w8 O* Y3 L0 l i' v4 n; {! M3 @
(2)首先选择ADC1,开启通道98 _) ~6 z8 @ t( l
6 _' ?) x2 V% m, e
- d0 s& L! I: l+ i, M( n% q1 }
3 b; |5 j# o1 a% Z, t8 l# g(3) 进行ADC配置,这里保持默认即可。( k4 W2 {. J1 s9 W7 F+ R/ h7 f, m
4 G5 }0 l8 O8 l, \9 _, R; v
. Z+ I" l( m; U5 G7 {3 L
% J# q. l; r- G(4) 配置ADC的转换规则,选择channel9# \& ]5 {2 w6 q1 t$ ], j0 U
' D) U& m: ]: h) H. S6 Y; ^: |
v; R4 e) n2 n9 V2 o$ _2 F& _
2 K) k2 x. A7 ~+ e# B
5、配置项目工程参数
* F8 U7 V& o* u' A) l! F(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。! H3 `4 Q; X/ b4 K% k
4 _3 t0 Z4 Z2 \0 ~( v5 ]
3 v. n% ?& r8 I, z( [( s
" ]9 V- j+ ?: O' G8 P6 N) v(2)完成配置工程。% E* [% f! Z3 f2 |1 h. i
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
' Q& y2 o# L1 \1 h4 `; `3 k k4 }0 F4 M; Y5 W- u- | G
/ H7 \; Y. T+ B4 u; p! s, H
, k* K# [7 {7 q
; i7 |1 l: _1 |: G+ x$ Y
. u( C* y) j* @(3)生成代码。# f) h) _0 X G9 H/ C; I5 }3 r
% m7 ?( k! c5 v, g- ^# z+ q) R6 G
6 K- V* w1 y3 ?1 s' W8 U: p
. M/ H0 L" ?" ^ 三、在KEIL 5中编写代码
& _: ?0 a9 f- D3 g; L$ G$ r, K* P1、使用KEIL 5(MDK)打开项目工程文件
, y- Z+ r+ U! b! J& H(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程。
: W' R% R8 H& S/ i. K; I; j) P; v; \. T
@: N% e* O" d6 e7 o7 O
6 { L0 G$ s0 y% Y. M2、 添加LED系统指示灯提示) Y5 n) r# V0 A: g$ h; E
(1)添加每隔500ms,LED1闪烁一次的系统提示,用于提示程序运行正常。
, ?/ Y( o+ C# q+ v5 h
) _% I9 u3 k) S* U
/ h% H4 n% y g+ W9 s: t k
; S/ R( t" m$ Y' l0 H5 H% c1 S
7 r2 j" I& K4 a4 l& o+ c& E0 s
3、添加ADC相关函数代码
1 h6 ?4 `" P3 _# o; Y(1)在adc.c文件中添加ADC采样函数,返回值即是ADC的电压值+ S$ e7 f' P" w7 U. T% I
- /* USER CODE BEGIN 1 */
: r1 E8 L7 G' _/ p' L' i) b - - n7 a1 N6 N2 i# d
- /* USER CODE BEGIN 3 */" D2 @( i% b2 Y4 o$ d- P5 A
-
- p7 `* Y. X j R/ R - /***************************
# x F, x/ b# q! O# c0 ` - *函数名称:uint8_t z_ADC_sample(void)/ T2 x" W9 w+ H% p( J# S/ O
- *函数功能:获取ADC采样电压. y- [; ^! w3 }- o7 W2 `6 a- }/ f
- *返回值:返回ADC电压3 V, B, p7 y6 U e, I! F: E% ~
- *备注:* [ f4 ~" ]9 ^) ~: G! P* a6 F5 h3 \
- ****************************/
$ w$ ~3 w, i& y( K9 F# r - float z_ADC_sample(void)% c; v$ O: W$ e
- {
9 [# ]- ~' m' r - uint16_t adc_value=0; //ADC采样
6 L+ Y/ f4 d% B) H, X8 {/ Z' ? - float adc_vol=0.0f; //ADC采样后转换的电压
' ]( q- t0 Y+ e3 S( M - for(int i = 0; i < 4096; i++)7 l3 c$ Y; y* t/ @ Q
- {) |: U4 G, ?/ J! K/ ^
- if(i%1024 == 0)
6 |7 t& D; ` F' j0 u - {0 C* p+ |4 Z" R Z
- /* 使用ADC采样 */
* _2 \; X( {) B8 d - HAL_ADC_Start(&hadc1); //启动ADC单次转换
" k. a: |. @1 h6 P - HAL_ADC_PollForConversion(&hadc1, 50); //等待ADC转换完成$ g r1 m4 z1 {! i3 w; V
- adc_value = HAL_ADC_GetValue(&hadc1); //读取ADC转换数据
3 z/ _- y; y. K9 y: b - adc_vol = ((double)adc_value/4096)*3.3; //转换为电压忿) A1 ]/ i1 P% d* q: E
- }/ n' N/ c# T4 l u- F, h. ]
- }
9 M. q3 r- C V) v0 h8 U1 Z7 h - return adc_vol;
" X( I* X& V+ I - }
$ F+ L& h3 t7 H* V5 x. D2 r& T - " p" E' E2 j; C, x1 s. g
- /* USER CODE END 1 */
复制代码 + s, _( [3 N- X* p; t! y+ q
(2)在adc.h中添加外部调用所需的函数声明。
, U" N: u( k( p2 D& d% i, n- /* USER CODE BEGIN Private defines */
; D# D u3 X$ _- Z8 O6 B - float z_ADC_sample(void);& A/ m( w M- E
- /* USER CODE END Private defines */
复制代码 # d4 x# O5 y5 y: |
4、添加使用串口发送函数打印log的代码4 n: F- W6 n& J r* F/ T3 B2 C
(1)STM32 Cube函数库的串口发送函数分别为:% r9 i/ R* ~( @ T/ a
% u* C8 D W) s& |; H- K
HAL_UART_Transmit、HAL_UART_Transmit_IT、HAL_UART_Transmit_DMA。本例程为串口发送函数HAL_UART_Transmit的展示。6 A; q$ U- m: ~( E" ?
- HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size, uint32_t Timeout): y# i8 j0 I8 a
- $ p2 f7 ~( u2 W# j! E) C1 h0 W( [ g
- HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)6 Y# R/ Z) e( O: J# V5 U
-
1 J# K3 K0 i3 j, r% z - HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)
复制代码
2 y, Q) O$ _8 D- f( }; T(2)添加串口函数发送数据的log。
5 I5 V: L* p5 D6 X( U Z$ ]
+ Q7 \) @5 H- ?1 z" h
3 J% d8 f) H; |7 R
" V9 q" m' V9 w/ b" O- while (1)
9 z7 @/ }* ] ?) f" f - {8 l/ J! U. j' v7 m, a n
- /* USER CODE END WHILE *// `8 P8 k6 w4 q! u& Z& ?/ Y% O
-
+ P+ s4 M5 g! U7 O; e - /* USER CODE BEGIN 3 */
% ~; \' Y8 h# W7 Y; o' V - HAL_Delay(500);0 D. n( J1 b- @% w# h5 ]
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0); //控制LED1反转" |. o5 r% O! W- F$ o( M
- HAL_UART_Transmit(&huart1, (uint8_t*)"hello world,this is Transmit function!\r\n", 100, 5);
! M% v* P$ t# C( Q& K - }8 d, V( I+ `, ]
- /* USER CODE END 3 */
复制代码 " J, N# j& e$ y7 k8 G( {* U& @
(3)在main.c中添加调用和打印语句。
/ I5 U& {7 x$ ^6 I/ H4 n4 N+ h, M2 R7 {3 z0 I: ~7 r
- /* Infinite loop */: d6 {7 ?* f1 L8 B: v
- /* USER CODE BEGIN WHILE */
8 ~! o4 p1 H! M) ^# D. ^( k) t2 e - while (1)- l3 S' u9 a# e0 O. [7 W& s1 X" \
- {
) B) S& ~2 \7 s" f) A- } - /* USER CODE END WHILE */
- ~ T& q s' Z - 1 o: g0 a% T( R% X, E
- /* USER CODE BEGIN 3 */; e8 u+ u( n, y
- HAL_Delay(500);
3 `+ d0 w6 O& m! G) a9 U% ~4 O% i - HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0); //设置LED1反转
6 M' u' z- p& d$ \$ ~ - adc_vol=z_ADC_sample(); //获取ADC的vol倿
, o. I& Y8 Z, j, D) p - sprintf((char*)str_adc_vol,"hello world,this is adc test,adc==%.2f\r\n",adc_vol); . V( I- V' X( O" T. g' l x
- HAL_UART_Transmit(&huart1, (uint8_t*)str_adc_vol,100,5);
7 r4 w+ r% U7 b - }
1 z$ J' \+ G, W" y - /* USER CODE END 3 */
复制代码- /* Private includes ----------------------------------------------------------*/3 U, a+ C' @! ~5 k2 f1 O9 x- w2 ]) {
- /* USER CODE BEGIN Includes */7 B" O) R/ J. }* f' N- ]4 E
- #include "stdio.h"
8 G, u+ F8 i: R, x - /* USER CODE END Includes */
复制代码 # |% W6 u: b$ m4 L7 ^) w) P7 F% l9 r
5、设置编程仿真下载模式
9 @7 p% d1 x/ a' w(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
9 x7 d1 i. N3 e- n3 z! {% m, l) K
! L9 G* w! [3 h$ x- d! k
* Q" ^) n" e0 d. H
(2)点击Download(或者快捷键F8),即可下载程序。/ n h+ ]8 d8 g% Y# l V
9 [; P8 R; E: f6 g1 L
6 F1 ~3 X! g# @9 y! {0 ~3 P' Y
7 c: H( l. t" M) L5 L: H(3) 如果下载程序后,没有看到LED1灯闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
4 |& J# s0 Q4 Y5 e0 x5 S9 ~. ^/ r+ G
6 ?5 v4 r& n6 n- U2 ~4 o
$ i7 r) O1 G# S" B, ]$ h1 \* p/ ]. t
6、查看串口发送函数打印log效果
2 }$ Y- {: x6 \ K- [, ? f% H* @. F(1)设置串口助手参数为:115200、NONE、8、 1(和代码中串口初始化参数一致)。
& E% z, `- `- R" V# }2 A1 k(2)设置成功后,就可以看到串口打印的效果。每隔500ms闪烁LED1指示灯一次,且串口输出一个log。7 [9 \" m* `$ x% o( I1 Z
备注:PA4接GND的时候,输出值为0V,PA4接3.3V的时候,输出值为3.25V。+ e" s2 G% N/ i' r2 L( @$ d* m
% p. p. I9 x& q. X8 L
4 z4 R9 {' a4 a f( F6 [
; o5 B& I6 L7 H————————————————
3 _ r8 U4 ^* \. f* E版权声明:智能小屋ZYXC
; q5 v3 e, J% L
0 I j# c5 M, V/ t9 T% Q. B. Z |