一、开发板平台简介:/ i# Z- x' [/ w1 ~, M/ o3 q- j
1、开发板资源简介1 k0 K: V L4 W- ~2 e/ x" ]6 Y4 S! L9 ]" R
(1)开发板主芯片型号:STM32L431RCT63 @) u4 k( p+ n' ?) z, E
(2)开发板主芯片封装:LQFP-64_10x10x05P
: B" X X4 t9 ?- G$ ]$ |9 u(3)开发板主芯片内核:ARM® Cortex®-M4( \" ?) n8 D* D1 y" y% l
(4)开发板主芯片主频:80MHz
! n/ Z1 l/ K, p(5)开发板主芯片Flash大小:256KB
# l" h7 p9 E/ Y7 q2 v(6)开发板主芯片RAM大小:64KB
6 {, h- @' q. ?$ N& S (7)其他外设:请参考芯片手册
( H5 D" }7 F5 d
% H8 \- p" t& n, v2 g# \/ G1 z; R' Q
0 O3 s/ Y4 m+ }$ r
7 l* a4 b0 u$ h5 Y& ?
! E: {: r$ E$ I$ E: e+ m' ^- G7 s+ U5 m0 C0 U2 _0 m
2、串口简介+ }# u5 ?. @/ l+ ]# c
串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。2 W, t! ]. y5 c0 f
(1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也试验该串口1进行。
% h( t- z1 e: A (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。# v) Z& j; j L1 }; S# e3 `: M
% i' u! g2 y& u" c+ `2 X
二、新建工程4 Z6 o+ q/ j, @5 o7 g
1、新建STM32CubeMX基础工程
1 S F* k3 [2 o1 i" ](1)打开STM32CubeMX,点击“File”-->"New Project"
6 P8 X2 O. M# V, ?& `1 }- U" ?1 F* R$ S8 U) X
) i% J+ I) g5 ?% x5 ~
7 d+ e0 p/ _. J% k7 z0 A' F2 H* G(2)等待打开主芯片选项界面(大约1分钟时间)。6 `/ k+ Z* m& H! O
1 h2 R$ \% a* Q+ h* k( U6 j
9 \. I2 B, ?1 @1 P6 y
2 i1 L8 J4 {, R& f6 J2 c9 C
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处现在STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
! | V, n" z/ l" a- G! a: v9 L% s0 g$ L( a
- M' J6 r& a" C; X Y9 v( @
' ]+ r( ~ b" x6 T6 d, U
(4)选择时钟源。
4 z. I# L, ^1 F* b5 g——因为开发板上有8M外部时钟,此处选择外部高速时钟(HSE)。4 D2 o6 O c! y) r3 y
——因为我们没有用到外部低速时钟(LSE),此处不做处理。
. n8 K3 f/ u( X/ Y4 ]6 r
& a i' R' [. g0 W$ H
& V" z4 R) k& F# E- S0 A1 g9 O
: |+ | O) b# b9 F2、配置GPIO控制LED5 B& S# ~3 |. V
备注:LED灯用来指示系统是否正常工作。
* n; M. a: s: _5 L( t8 f0 ?# ^, Y(1)查STM32L431RCT6开发板原理图得LED1控制引脚为PC0,则配置GPIO的引脚PC0。5 N& j/ p* p6 Y# M0 p n8 K8 d
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。* O: H3 R) u! i6 U- _$ ?
4 H$ S, k0 o( h2 p8 ~
4 ]8 h: g$ j0 I W0 B4 l , l( y' Y% e1 \
(2)根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。' U. d$ i9 _: f" ` A
9 I& w( G# J: S6 w% i3 y2 n6 ]
- o' w4 h/ m1 b1 Z& }! q
8 ]" a2 U h2 \: g* e
3、设置串口1参数* a+ m* t& d: R) v* v a" j
(1)查原理图得知,串口0使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:. S$ Z. P0 K) x1 h# J; u
' _) X6 @7 B: ?4 Q4 ]/ A( j
3 A; n2 |9 O; Q9 X8 S$ q6 T$ q
# G, m: U( S4 d- @( Z# \ (2)序号1用来设置串口收发引脚的选择。& M& p! Z2 U) }9 y
(3)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。
& Z/ O! ~, a/ w: U8 c4 B" d- |3 R$ Z2 K: y
4、配置ADC(单次转换模式)+ c4 P+ ~* C; o9 }" N8 I5 P1 K& l5 P
(1)ADC简介:
~) { e7 Y+ u/ C% k; _* T☆ADC全称 Analog-to-Digital Converter,即模拟-数字转换器,可以将连续变化的模拟信号转换为离散的数字信号,进而使用数字电路进行处理,称之为数字信号处理。1 _% I! O5 b. F6 h/ b! C3 V
7 V( i" r3 _% Y5 D
☆STM32L431xx 系列有 1 个 ADC,ADC 分辨率高达 12 位,每个 ADC 具有多达 20 个的采集通道,这些通道的 A/D 转换可以单次、连续、扫描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。
0 y, C' r8 u! ]7 A
" L2 S i" r+ b☆STM32L431 的 ADC 最大的转换速率为 5.33Mhz,也就是转换时间为 0.188us(12 位分辨率时),ADC 的转换时间与 AHB 总线时钟频率无关。
- l, v# O4 f0 @ E7 g4 R
: F+ _+ e6 C! _' |, {(2)首先选择ADC1,开启通道9
; ]5 B+ y/ b B @" L$ }: W0 w, F- A
6 D/ q4 H, f; t* c, M
* J) ?1 `" y0 A9 t
* z+ [1 P1 P6 Y2 e: \- c(3) 进行ADC配置,这里保持默认即可。' [* j. k5 U% }# Y: j1 f3 P
8 l. ?. S5 X- b+ Q
1 b3 x7 I h& A
( p- N8 @3 i9 t8 c(4) 配置ADC的转换规则,选择channel9
5 J6 Q* a. w0 a* X- o3 Z( V% p1 ]% R" x, Y
' i' F! u$ a6 w, ~& x/ E2 Z
( |6 k$ D- x; V* c% e5、配置项目工程参数
% k+ h; \" m+ @, ]4 o. L. f1 E3 _0 v0 g(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。 G7 p0 o) H3 ~
( C" N& s6 [+ \4 D: j P: G
8 P* z4 B& G0 ^# i4 j$ r0 M
4 ]$ j! @5 j; y. |(2)完成配置工程。
9 ^ }* |2 l6 l/ c备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
. _ D8 ?1 H7 W7 Q- u, V1 Z @/ F' j( M2 w2 Z
4 ]5 |( J5 s7 x
1 {1 l6 S L/ e3 \
: v$ s) R& L1 O2 b! h) K
2 X! g) b3 T9 l# |3 v7 k(3)生成代码。5 z" X9 D! A+ e R2 ^* C7 r
+ e0 Z4 v& ]8 `% H/ j" {( V3 D2 E
; P5 d# z7 C& D m7 t2 W% u& o4 s$ f/ D K
三、在KEIL 5中编写代码6 Z7 K% R5 t6 J) F( P
1、使用KEIL 5(MDK)打开项目工程文件3 q% F' y) P7 ]" r6 l
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程。( _) T" R4 M7 R! I( U6 O6 a
- O) P2 t- l, K4 A; T/ c
* h5 L9 ^' }3 v! l/ F2 {5 B
* J8 s8 x6 i/ ~2、 添加LED系统指示灯提示; U- \% w& Z( F# w0 ~! ^+ ?# s
(1)添加每隔500ms,LED1闪烁一次的系统提示,用于提示程序运行正常。, T. ?8 U1 Y; p1 _) \
6 P& o7 ?; ?6 g# S7 o4 }- K" Q
! q, ^' c. G3 n( N
( y" g0 |% i/ x# r! a% t, Q- N! ]0 e
" E. ~2 ^: }/ K. o7 R
3、添加ADC相关函数代码
, a' g9 }0 Y! Q(1)在adc.c文件中添加ADC采样函数,返回值即是ADC的电压值
" l1 N) D2 \1 w; y- /* USER CODE BEGIN 1 */9 n% x* @" W! l' Z/ c J
- 4 p, ^0 a' y2 A, {! z/ U
- /* USER CODE BEGIN 3 */2 }* k6 D% B6 P6 b% I
- - Z- g# d+ {% p/ x% ]0 j+ s0 B
- /***************************2 \$ ~: e( j4 f! T
- *函数名称:uint8_t z_ADC_sample(void)
4 @- D: W5 p* E$ v: }( ~( l - *函数功能:获取ADC采样电压
+ |6 K2 O8 g' _; k - *返回值:返回ADC电压
9 h) I0 s# B3 i( Q# H8 t$ H - *备注:
) U8 {; V4 P# F k* g6 s - ****************************/
$ U% }4 { W% F j; o - float z_ADC_sample(void)
9 m" r# e: Z# l* L - {
# ?/ L. P: l, d5 ]1 s, D0 S2 w ?" { - uint16_t adc_value=0; //ADC采样
2 A: P( R. E0 Z! ~% ~) T0 X - float adc_vol=0.0f; //ADC采样后转换的电压1 j7 O, v1 l% P/ c+ {- ?
- for(int i = 0; i < 4096; i++): d9 m/ u$ G: w7 [( |4 r
- {
7 z3 b1 ]! N, i" Y& n - if(i%1024 == 0)* U9 F! K6 E9 c0 d! c' f
- {
# S. c" F) E' u+ k' W - /* 使用ADC采样 */
# }' {1 P! U0 u - HAL_ADC_Start(&hadc1); //启动ADC单次转换
: i9 O9 M# @/ K3 H - HAL_ADC_PollForConversion(&hadc1, 50); //等待ADC转换完成7 v' c V8 I$ n: M k9 k6 h
- adc_value = HAL_ADC_GetValue(&hadc1); //读取ADC转换数据: f# y7 l" A! [% v* A3 g6 k% E* Z
- adc_vol = ((double)adc_value/4096)*3.3; //转换为电压忿' Y9 E; [- e1 t$ \ g
- }
1 w: ?- K& u( B, r" [1 T - }
6 D7 s- j0 t i, t - return adc_vol;
, Q, F, g. ^: I. u! U) I - } ) J$ w* V% o6 J |6 j8 C
-
: H4 h. _3 x& k- F - /* USER CODE END 1 */
复制代码
' j( Q6 K- _0 r) \2 E(2)在adc.h中添加外部调用所需的函数声明。
$ \; x1 w6 b8 s7 {0 M7 L- m- /* USER CODE BEGIN Private defines */
' `! x! M8 }, i5 ~( Y - float z_ADC_sample(void);& E+ i8 A3 J: c
- /* USER CODE END Private defines */
复制代码 . Y8 u! q1 Q9 \) O" }3 X; D
4、添加使用串口发送函数打印log的代码6 _2 U) ^6 p% W
(1)STM32 Cube函数库的串口发送函数分别为:
8 E% |7 E" z1 A) h$ Y. a, ^7 e
% n' q' x- k/ O3 xHAL_UART_Transmit、HAL_UART_Transmit_IT、HAL_UART_Transmit_DMA。本例程为串口发送函数HAL_UART_Transmit的展示。
) _5 j. v7 T: m w0 ?0 j% y- HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size, uint32_t Timeout)
8 M8 L4 W' T% J& `0 R -
+ r1 n: i0 L( q3 \6 F. w - HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)7 K( c ^; q( k4 _+ U/ o
-
# h* E5 N% H5 o/ o! b - HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)
复制代码 3 L! }5 O) q6 v0 M
(2)添加串口函数发送数据的log。
. v, h6 U. T3 ]7 o& X- @1 y0 b; ^3 k( x9 ^! U$ i$ T [
$ |9 c8 ?- C2 V5 K3 r) @% {- }
6 f6 d/ x9 K F4 w( `* h" W- while (1)
( y) \7 l4 }& _. y& N1 P - {, m' e2 S# u: u7 h' Q8 A/ @! P/ j( z
- /* USER CODE END WHILE */
5 L2 o- [& T$ k2 Z; I - " X+ o4 Y5 C1 J
- /* USER CODE BEGIN 3 */
j% A2 f% i* F - HAL_Delay(500);
/ | u1 _* `( Z5 V. E9 B - HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0); //控制LED1反转: {. B6 r6 d1 V% E- v3 |: y8 Z5 E
- HAL_UART_Transmit(&huart1, (uint8_t*)"hello world,this is Transmit function!\r\n", 100, 5);
5 a& y; _" {0 t4 V6 B" P/ ~# U - }% p4 }- v- r. I" j! Q# u' V# x
- /* USER CODE END 3 */
复制代码 ( m7 n8 Q3 Q) p8 N
(3)在main.c中添加调用和打印语句。 B" N7 ~; Z. c
* i( | u- [# P6 C
- /* Infinite loop */
! @, V$ t# g1 N# V/ e - /* USER CODE BEGIN WHILE */$ b4 b& j" M1 w1 x: G* g7 q* H
- while (1)
7 @$ N9 b* W! O# |' R8 Q) F - {
, H& p6 A4 C/ t7 s& }) I- x - /* USER CODE END WHILE */
9 H( f1 ~6 B& ?# N - * u$ B T9 F( v0 k3 [
- /* USER CODE BEGIN 3 */( J2 `: C8 V, e/ C4 T0 \0 S
- HAL_Delay(500);# u4 v' l6 V' z+ o, s; [9 C- a' z
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0); //设置LED1反转
# N$ U1 Z, C( L0 o) N0 H+ n% G* W - adc_vol=z_ADC_sample(); //获取ADC的vol倿 1 I* Q- L# _0 Q5 B8 o9 F
- sprintf((char*)str_adc_vol,"hello world,this is adc test,adc==%.2f\r\n",adc_vol); 8 t- F: s% H7 P. J- {) X
- HAL_UART_Transmit(&huart1, (uint8_t*)str_adc_vol,100,5);
$ J. F4 Z; Y8 Q9 E$ x `$ K - }
4 U1 o8 ~( R6 }! t; D6 ^ - /* USER CODE END 3 */
复制代码- /* Private includes ----------------------------------------------------------*/
0 e( j% V1 s9 P3 q8 U - /* USER CODE BEGIN Includes */4 ^' R1 m. n9 s; P- P, ]
- #include "stdio.h"
" e/ ?( k) \; R: c - /* USER CODE END Includes */
复制代码 / W" ^3 K/ ^, ?
5、设置编程仿真下载模式
0 ^" H: h( S4 `(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
+ m& B. y7 s2 f! M
3 Y0 A0 h, V1 v) J( b5 {
$ ^- m: e1 D& F. B! Z3 Q9 v1 y" D
4 {9 L7 r4 d! ^9 \, T1 n(2)点击Download(或者快捷键F8),即可下载程序。7 p+ ?/ M* y/ I/ E' P, f7 D
$ `( @) g+ p( x6 ^) q! Z, R
; `' I" t2 v& z7 U0 S* i2 h8 o! N$ E* ^# Y. K0 R
(3) 如果下载程序后,没有看到LED1灯闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
. w$ M! X+ {: l$ B' `, n3 ~( u3 _: W' }: ]5 W5 Y
6 @4 r, Y; o2 g/ d- c8 o2 s5 k: D* r , w" s/ L% w( P+ e
6、查看串口发送函数打印log效果7 O; G |5 l" Q$ ^6 i
(1)设置串口助手参数为:115200、NONE、8、 1(和代码中串口初始化参数一致)。
, B1 ^' p0 ^' H: w(2)设置成功后,就可以看到串口打印的效果。每隔500ms闪烁LED1指示灯一次,且串口输出一个log。
- m( x& r% S0 B3 J. _# y备注:PA4接GND的时候,输出值为0V,PA4接3.3V的时候,输出值为3.25V。8 L% E3 T, ]9 q% o5 r5 Z6 h( }) F: p! Q
! l* f4 J; {9 I
# W% W3 Q+ m4 s2 ?7 w
3 u, ^ ~, E7 r: W/ l————————————————1 M- c# f" w5 s4 T+ w' Q
版权声明:智能小屋ZYXC4 Y' \' i5 |) C6 o$ U( J2 X
% m( q0 [8 z# ?" i" { |