实验操作 1、打开cubemax ,芯片选取。 选取STM32F103RCt6 (根据实际情况选择),LQFP64封装的。然后鼠标双击中间那个圈住的地方就可以进入配置界面。9 ~& D' y2 w1 H8 s; J P 9 L' S/ ]8 i+ i" Z; B- ? 图2、配置界面 ) i, G% b- j! `+ @& J 如上图:/ m& F( B2 i9 W6 E G1 m4 T $ L, L) r! ?, `+ q- D! w$ b (1)、标号1 为系统核心的配置,其中由晶振的配置。7 D: d- ~# Z; X$ | (2)、标号2为模拟量相关的外设配置,如adc,dac,等。$ H, h$ o/ F! Z" ]9 a, f2 D! N: { (3)、标号3为定时器配置。+ B$ a9 _9 K9 K! B5 ~ , s7 {) D P; Z3 C) b (4)、标号4为通信相关的外设。比如串口,CAN等。6 t: e: D* Z1 L3 f; l! K 8 m3 a* |& G" z2 Q 其他图中有标注。 2、晶振配置2 q/ Z7 I8 ~! Q6 p# r 晶振是单片机的时钟来源,相当于心脏,先添加晶振,点击上图编号1,然后出现下图,在点击RCC,进入晶振 6 Y `# K C# b: y5 X3 k9 _3 Z 如上图:HSE 和LSE 都选择Crystal..选项。然后注意芯片示意图上有四个引脚变为绿色。" k" Z9 L7 j* K# K" m/ k( p! ` ) G% C; D$ D" }5 ^( B5 C; d/ G 3、时钟树配置6 o' B5 J$ L; n+ g; G# i % D1 w4 n& _3 P2 @+ F, p T2 E 点击 2 p) f& m- e- z: F% m8 c' p' ]* l : o7 L6 J8 F3 p" _ v9 M 配置时钟树如上图,改好后按回车键生效。 8 F0 W8 ?! [: g% n& ?( u 4、中断管理配置: 1 Y+ F! y1 W- C" ?0 ~ Y2 g 点击NVIC 后,进入如下界面: 到这里我们STM32的系统基础配置就完成了!+ L! ~7 J8 I4 _: w- R( c+ H 5、外设配置- q, }/ M; m4 g) P/ ^; n \ 下面就是结合具体需求来进行配置,例如我们这里讲的是串口1以及串口1的接收中断配置,那么下面开始配置串口1 及其中断。7 n% V, m0 Q7 ^. ` E) b& r: y. ]3 i6 U: L % R+ B' R( K. C( t o- \* }) J* w 3 B8 f+ F4 p+ I" q1 L% M 这里只要选好模式就行,可以注意到,芯片示意图上已经出现了串口1引脚 。但要记住这里的波特率设置为115200了。这里串口就可以正常使用了。但是,我们还需要使用中断,所以还需要配置串口中断。 4 v9 p% E# ]% @9 m0 x 中断最后还需要设置好优先级:- N4 b& {% ^$ n. q ( s* n# J: |7 z) f& h3 {# s 到这里,串口1的中断就算是配置好了。接下来可以生成代码了,但是需要几个小的配置,点击工程管理7 n% Q# r9 \! F# [* i) r7 b4 z0 @ 6 p1 T( A9 {+ j: ~4 `2 x 进入管理工程界面, 到这里软件的工程的软件配置部分就结束了,然后生成工程代码, ! \. }' S- z4 `; c0 m' t 6、工程代码上的配置以及修改2 m5 R( `- o/ w% C6 P - J, e* u% d1 Y2 q 使用keil5 打开刚刚生成的工程代码。) {6 S) e3 R# p l9 S+ r/ [, m& w 找到main.c, 会发现如上图的主函数结构,其中9 n( [+ {1 F2 o! R3 G1 z $ u4 V& y* p/ _% D MX_USART1_UART_Init(); 就是软件生成的串口1初始化配置。, L6 F2 Z1 D9 p6 G 如下图,光标放在相应的函数上,鼠标右击,选择GO TO Definetion.. 选项即可进行跳转。+ x# w; b8 X3 Y. r4 s 1 ^& v% Y& f8 }! j" G ! X8 \& n; g- v8 R; A0 P 跳转进入usart.c 文件,会看到,MX_USART1_UART_Init();的函数体。
在这个usart.c文件中添加如下代码:,如下图所示% u0 H" Y/ k+ ]) l 3 x- r1 F- H7 X' B9 A7 w, s 这段代码可以在STM32中正常使用printf()函数。具体添加位置可以如下图,注意所在的文件和位置。同时不要忘了在usart.h 文件中添加#include “stdio.h”( e- k' b, F$ a+ d$ \4 A( g" L1 \ 3 N0 ^/ x2 h8 I% v' H6 Q F& M* V% C8 r $ O4 c+ B7 T' F! B# S7 a 添加 #include “stdio.h”" F+ W- F# U! x' E: N2 o ; T0 ~# G6 ^4 t$ o3 ], f$ | % B4 R3 p$ w0 b1 l2 t 经过上述两步就可以正常使用printf() 函数了。 最后配置中断相关的函数, (1)、找到中断服务函数 8 A4 _9 z6 q/ ?, ~: N0 r7 e' x 位于stm32f1xx_it.c 文件中" V# s3 w$ C. f+ ~9 O* P0 h+ m b [ (2)、找到中断回调函数: `% n4 _% F0 M 2 E+ {& c) u, b 1)、HAL_UART_IRQHandler(&huart1); 2)、UART_Receive_IT(huart); S8 B5 D: d% m8 S& i, r! ]5 p 3)、HAL_UART_RxCpltCallback(huart);* d# v E, r4 r& Y * k9 c7 B9 u5 j! [: S8 k) I void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) 3 P2 A* B- J$ u5 l& L1 i 从1)可以跳转到3), - \- d& Y% ^) j( j% X1 Q: P D void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); 就是串口中断回调函数 。6 u( g1 }5 | _/ v1 t, q* T 并且将void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)复制到usart.c文件中,如下图。在这个函数中就可以写中断逻辑. Y; G! G1 l. S4 a % A, b) @ j& m; i( y) |- m$ r ( y+ k: h4 @0 T' s' { (3)、开启接收中断% b6 n' F. ?) q7 o HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) ) v- h( y+ Q! O- H9 F+ b% l 在这个函数中会使能接收中断,需要三个参数,分别为 # W& {1 ~2 V% c 1)、串口句柄, 2 M+ o& K& ?3 l! A. n. Z( O 2)、保存接收数据的数组, * M2 \' l6 V2 B$ w 3)、每次接受的数据字节数, 所以我们需要首先定义一个保存接收数据的数组。 4 Y& i/ _- y- C/ U 然后开启中断,需要写在两个地方,分别是串口初始化的时候和回调函数的最后,如下图所示, 0 d, G9 K+ w8 V9 w- B 最后 在回调函数里加入如下代码进行测试: ' K( L3 l1 i$ S' h/ R# T4 f 最后下载程序测试, 6 G/ l$ p! {: v/ n 点击发送,单片机收到数据,就会打印出123.(因为我们使用的是串口1的接收中断,所以通过串口助手给串口一发数据,串口1接收到数据,就会触发接收中断,执行中断服务函数,最终执行到回调函数也就是我们的中断逻辑。这里的回调函数只是为了说明问题,实际使用时还需要判断是哪个串口触发的中断。7 J: v( i9 d% o $ H6 ^/ d7 t/ @- S % r1 q4 v7 j( a* V" z1 p |
基于STM32生成外部Flash Loader的方法经验分享
【经验分享】STM32驱动RC522读卡完整资料分享,包含原理图、PCB、驱动工程文件
【经验分享】HRTIMER 产生多相相移信号
基于STM32 DFSDM应用技术经验分享
基于STM32 快速入门 BlueNRG SDK 固件开发
基于STM32的BlueNRG 系列协处理器简介经验分享
获取编译时间作为版本号
【经验分享】STM32CubeIDE使用说明 —— 实时调试
宽禁带技术如何带来颠覆性变革
基于STM32的数据意外变化导致条件判断流程异常