实验操作0 Z$ y: N. t2 X* H* ^ 1、打开cubemax ,芯片选取。 选取STM32F103RCt6 (根据实际情况选择),LQFP64封装的。然后鼠标双击中间那个圈住的地方就可以进入配置界面。 5 _: X& g1 g6 M P# f& e 4 C& [1 S3 i. b/ w # ?& `' L& U# u; Q [, s 图2、配置界面: o, A! ]; S" V2 T 如上图: 5 J' s' K% L* i* |( X. E7 L/ G3 R (1)、标号1 为系统核心的配置,其中由晶振的配置。3 e' b3 {; K1 @ (2)、标号2为模拟量相关的外设配置,如adc,dac,等。 (3)、标号3为定时器配置。4 j/ o; G3 {2 A5 l4 B+ J" }) E & L5 q5 ^7 y. C3 t1 L2 | (4)、标号4为通信相关的外设。比如串口,CAN等。 其他图中有标注。8 c/ z6 _6 K* F" x 2、晶振配置 晶振是单片机的时钟来源,相当于心脏,先添加晶振,点击上图编号1,然后出现下图,在点击RCC,进入晶振' h. I8 i! \% [ / U+ }* n' c2 `2 M+ Y/ U - m5 e7 ~, D4 {- g 如上图:HSE 和LSE 都选择Crystal..选项。然后注意芯片示意图上有四个引脚变为绿色。 ! i7 I; {( c6 t: r% k- ~ 3、时钟树配置 点击 ' ]5 u4 g- |3 ] , r- q! D4 J* F& H8 t( h' e 配置时钟树如上图,改好后按回车键生效。7 M+ c) W/ U& ?+ Y ~! z% @. J- g1 f/ Y 4、中断管理配置: / t' Y# x7 c* [$ ~ 点击NVIC 后,进入如下界面:; u9 ]6 H( l$ o: c 到这里我们STM32的系统基础配置就完成了! 5、外设配置 / ?6 u. S9 _( [0 J2 q1 e 下面就是结合具体需求来进行配置,例如我们这里讲的是串口1以及串口1的接收中断配置,那么下面开始配置串口1 及其中断。 ( }" x( s; X2 a & K2 O; v# X4 |+ w# u5 B, s k3 ] ! ]3 g% q' Q' b, g; g' e$ F 这里只要选好模式就行,可以注意到,芯片示意图上已经出现了串口1引脚 。但要记住这里的波特率设置为115200了。这里串口就可以正常使用了。但是,我们还需要使用中断,所以还需要配置串口中断。 / H6 {; K a0 w9 d! k 中断最后还需要设置好优先级:6 i, p Y8 A+ C# n- T% V4 | J9 |, G; x) q) D 到这里,串口1的中断就算是配置好了。接下来可以生成代码了,但是需要几个小的配置,点击工程管理/ t. e8 G; f3 a! k* G , j& G0 w; }* K; s: K , F" t, A+ `& R 进入管理工程界面,# C$ K9 g( y* [$ |. A 8 O6 ]# w8 E( `; P( h* B; b4 F 到这里软件的工程的软件配置部分就结束了,然后生成工程代码,1 `( H9 U, x/ j' W$ H2 { $ u) p U b0 n k3 c 6、工程代码上的配置以及修改 使用keil5 打开刚刚生成的工程代码。( c2 V3 ^" k; F( H' N" Q - E& K5 F6 }: `6 [/ ~4 C7 u ~ 5 K" s0 U0 V. [( C- P. q 找到main.c, 会发现如上图的主函数结构,其中 _/ j& v7 ~' H$ f' Y. R9 \ u 2 ~# _% Q) C/ i! [0 T B MX_USART1_UART_Init(); 就是软件生成的串口1初始化配置。, v' ?. O2 c" h " j" R- E7 u; g 如下图,光标放在相应的函数上,鼠标右击,选择GO TO Definetion.. 选项即可进行跳转。 2 x5 L. m* m% A' z: q, t6 f " \0 d5 u( W) f1 T4 O R 跳转进入usart.c 文件,会看到,MX_USART1_UART_Init();的函数体。 ]- w; d' z$ r/ @/ z; V, S# ^/ R
! W* h* R& v5 B. I! u2 B 在这个usart.c文件中添加如下代码:,如下图所示 2 f% J& z, J Z2 J$ ~ 这段代码可以在STM32中正常使用printf()函数。具体添加位置可以如下图,注意所在的文件和位置。同时不要忘了在usart.h 文件中添加#include “stdio.h” + }, T# o: e( _- A( H$ Y & V" f; J4 i2 c: v / R* P1 [, O# H u$ O* D2 j. }5 z# C 添加 #include “stdio.h” c- S1 i8 A. f( z# p. C; J& W . n6 g& [2 i" Y- v" y m2 K- F) h6 ~9 ]4 W7 a- Q4 e 经过上述两步就可以正常使用printf() 函数了。( C6 l& V' P# l 1 O7 d9 r, k1 h* l& }* T 最后配置中断相关的函数, (1)、找到中断服务函数 位于stm32f1xx_it.c 文件中3 A4 H" K6 P8 ^4 _; z4 f + i( A5 E, w$ M9 X5 e) T; N4 D (2)、找到中断回调函数 1)、HAL_UART_IRQHandler(&huart1); 2)、UART_Receive_IT(huart); 3)、HAL_UART_RxCpltCallback(huart); void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) 从1)可以跳转到3), `5 n9 C' |0 b( g2 l4 C , r$ J2 u3 S$ p/ d: `) \. |# a) ^" Z void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); 就是串口中断回调函数 。 4 ]9 k2 f) \1 e& F2 Y7 j 并且将void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)复制到usart.c文件中,如下图。在这个函数中就可以写中断逻辑 + d) K# m9 h4 w & l: d6 f5 d% j* z* D: J5 a (3)、开启接收中断 HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) 在这个函数中会使能接收中断,需要三个参数,分别为/ M5 q) m, l3 \& [8 C 1)、串口句柄," s6 H1 p6 V3 c 4 n7 b- a! V& a( L5 U' Q8 T; ` 2)、保存接收数据的数组, 3)、每次接受的数据字节数," Z* a! q! y' n1 }. h F 所以我们需要首先定义一个保存接收数据的数组。4 H+ o+ R8 I( c$ K/ ~2 s( c9 p 然后开启中断,需要写在两个地方,分别是串口初始化的时候和回调函数的最后,如下图所示, ' X2 e) ], t( C$ s" n- S [ 最后 在回调函数里加入如下代码进行测试:$ M* s, L1 T$ k0 |$ H4 @9 v" [ ) T" z1 u% {9 y9 _% |$ W( [ g7 ^! H " i, Q2 a7 t5 Q 最后下载程序测试,, p( E, R6 V' p6 S8 A3 K 9 a: _1 \' U R4 C; c5 }- J; I8 N 点击发送,单片机收到数据,就会打印出123.(因为我们使用的是串口1的接收中断,所以通过串口助手给串口一发数据,串口1接收到数据,就会触发接收中断,执行中断服务函数,最终执行到回调函数也就是我们的中断逻辑。这里的回调函数只是为了说明问题,实际使用时还需要判断是哪个串口触发的中断。 |
【经验分享】STM32 GPIO模拟I2C程序示例
基于STM32生成外部Flash Loader的方法经验分享
【经验分享】STM32驱动RC522读卡完整资料分享,包含原理图、PCB、驱动工程文件
【经验分享】HRTIMER 产生多相相移信号
基于STM32 DFSDM应用技术经验分享
基于STM32 快速入门 BlueNRG SDK 固件开发
基于STM32的BlueNRG 系列协处理器简介经验分享
获取编译时间作为版本号
【经验分享】STM32CubeIDE使用说明 —— 实时调试
宽禁带技术如何带来颠覆性变革