
实验操作, J5 y* ^, T; e3 F7 O, O# M8 C 1、打开cubemax ,芯片选取。 选取STM32F103RCt6 (根据实际情况选择),LQFP64封装的。然后鼠标双击中间那个圈住的地方就可以进入配置界面。 ; B) U# ~1 L5 ]! a7 ?6 c! S8 \5 a ![]() ![]() 图2、配置界面 如上图:/ `, N& T" _& M/ z: M/ v+ z7 ^ % B* l5 ] s0 u& e (1)、标号1 为系统核心的配置,其中由晶振的配置。" W- m; m. M+ T/ \9 _- u& | (2)、标号2为模拟量相关的外设配置,如adc,dac,等。# P- Q& e) i) t2 j3 V `$ y! F5 j. | 3 m6 y, h9 c+ ~! u. s r (3)、标号3为定时器配置。 3 j1 n G. C3 O! I/ Q. x (4)、标号4为通信相关的外设。比如串口,CAN等。 其他图中有标注。* Q3 F4 d Y2 \# t6 ^! v$ H% Y 2 R8 n0 x3 ? ~: `- U 2、晶振配置* [: s4 J8 w- f- f: K 晶振是单片机的时钟来源,相当于心脏,先添加晶振,点击上图编号1,然后出现下图,在点击RCC,进入晶振3 \- Q+ ]2 [- } |% |9 g" m' i+ m ![]() ( B' Y2 M! I' `# x; @& z ![]() 如上图:HSE 和LSE 都选择Crystal..选项。然后注意芯片示意图上有四个引脚变为绿色。) k% @3 \7 p6 R9 s4 w; { 3、时钟树配置 点击 ![]() 9 K% ^6 q# Q* C. H( Z ![]() 4 a% ?# z) b& x) k5 f 9 w/ Y6 ~9 |# f. g8 w 配置时钟树如上图,改好后按回车键生效。: @1 n% ~* \, ]+ ~1 y 4 {# Q* z# d N: v6 ~ 4、中断管理配置: " q8 q+ S6 w% a5 n' h ![]() $ e8 L3 d3 b/ J1 q0 v 点击NVIC 后,进入如下界面:5 @, h5 |7 g8 c$ f1 T ![]() 到这里我们STM32的系统基础配置就完成了!1 q2 }" T4 T$ q) p" j& @7 U 5、外设配置 下面就是结合具体需求来进行配置,例如我们这里讲的是串口1以及串口1的接收中断配置,那么下面开始配置串口1 及其中断。! r; T9 ?6 I# z% a+ c1 G- j- j ![]() ![]() 这里只要选好模式就行,可以注意到,芯片示意图上已经出现了串口1引脚 。但要记住这里的波特率设置为115200了。这里串口就可以正常使用了。但是,我们还需要使用中断,所以还需要配置串口中断。 2 a$ L+ d6 F) m1 _( B1 [" s ![]() 中断最后还需要设置好优先级: D! ?! ~. _9 b0 o2 }" Q " `( `' z: e9 V. N, b1 S ![]() % p% K7 D" h& k 到这里,串口1的中断就算是配置好了。接下来可以生成代码了,但是需要几个小的配置,点击工程管理 ![]() 进入管理工程界面,; y, p% B, a1 B! z0 T% Q + B, m% l9 J8 ?9 Z ![]() ' B& m3 _) r2 `* u) O# r ![]() % q& X) M3 _: g$ U5 b7 h- S' U 到这里软件的工程的软件配置部分就结束了,然后生成工程代码,; o. x7 y9 a( e5 y/ I" u2 j ) e! t' e5 H6 E% R- M1 K ![]() 6、工程代码上的配置以及修改 - l% X3 G# f/ [# v7 V6 B 使用keil5 打开刚刚生成的工程代码。3 p3 b8 _4 _' t- n% |2 G 9 ^$ b0 n! n. u. U1 E; J) b ![]() ![]() 找到main.c, 会发现如上图的主函数结构,其中! S$ s: F. |" W6 F {; A MX_USART1_UART_Init(); 就是软件生成的串口1初始化配置。 如下图,光标放在相应的函数上,鼠标右击,选择GO TO Definetion.. 选项即可进行跳转。 ! m) h) n( M; M# Y$ p' `& ? ![]() 跳转进入usart.c 文件,会看到,MX_USART1_UART_Init();的函数体。! C1 T# _' O" D% U1 R' N) Z6 u / a( C5 o& W3 {( z9 y0 t
在这个usart.c文件中添加如下代码:,如下图所示 5 g4 I2 W7 m# T, r1 y8 V! O 这段代码可以在STM32中正常使用printf()函数。具体添加位置可以如下图,注意所在的文件和位置。同时不要忘了在usart.h 文件中添加#include “stdio.h” 6 k6 f# Q. J. y# D. q# h ![]() 7 \ ]+ \; Q! t( O! G& z! t 4 n$ _8 o& N8 r8 y7 Z 添加 #include “stdio.h”+ B7 ?" ]0 X" U W ![]() , e! ]3 M! G: ?+ m0 b) c. m0 ? 7 a0 q& h6 k }/ C8 v/ B% z+ | 经过上述两步就可以正常使用printf() 函数了。 最后配置中断相关的函数,' H6 ]+ M4 D6 M- Y9 [2 y ) a I0 W D! \ (1)、找到中断服务函数- i8 u. q* m! D+ u: A' a7 B4 Y 位于stm32f1xx_it.c 文件中 ![]() (2)、找到中断回调函数 1)、HAL_UART_IRQHandler(&huart1); ' |3 w9 d; Q+ q 9 p ~0 p N8 k' g 2)、UART_Receive_IT(huart); 3)、HAL_UART_RxCpltCallback(huart); 1 o2 x; n! T! B) _ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) 9 D- P$ L& b. Y! e3 Q5 K 从1)可以跳转到3), % k: Q' I2 m; _! Z; V3 t; [ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); 就是串口中断回调函数 。3 c r8 j; L: j' p$ x6 L( W 并且将void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)复制到usart.c文件中,如下图。在这个函数中就可以写中断逻辑 ( J' c6 y4 q8 `# R. l( l ![]() (3)、开启接收中断& i% j1 Q. p4 N( }" t/ { HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)) n4 z1 x# V$ L1 } 4 J1 w+ e. O3 A- \. n$ i, n. c* j 在这个函数中会使能接收中断,需要三个参数,分别为 + F/ B- ^: ]& c2 b* u 1)、串口句柄,9 s( k4 G5 s9 G4 G9 o9 f9 t6 R 2)、保存接收数据的数组, % K7 z h! b& @& i% g/ K4 n/ X; b 3)、每次接受的数据字节数,6 N6 ]' ?4 d" p: U $ t1 G3 r2 @7 s) L3 c2 S 所以我们需要首先定义一个保存接收数据的数组。, J- \: h4 ^- n# g3 I2 a; x9 J; f % e# d4 G: s! K/ f/ O ![]() 然后开启中断,需要写在两个地方,分别是串口初始化的时候和回调函数的最后,如下图所示,. u# w+ M6 q% M1 y5 r8 h$ d; ` ![]() 0 K4 v) H8 S8 p 最后 在回调函数里加入如下代码进行测试:8 t6 E4 W _2 s2 I: w ![]() 最后下载程序测试,5 s! n$ S) C, K# o" i, V. M+ b8 \. }' O 点击发送,单片机收到数据,就会打印出123.(因为我们使用的是串口1的接收中断,所以通过串口助手给串口一发数据,串口1接收到数据,就会触发接收中断,执行中断服务函数,最终执行到回调函数也就是我们的中断逻辑。这里的回调函数只是为了说明问题,实际使用时还需要判断是哪个串口触发的中断。! Z# G( F" u# F( _ 5 Z: f7 n- ] [2 X8 Z' `/ x |
STM32 ISP IQTune:真正零门槛的免费ISP调整软件
【经验分享】STM32 新建基于STM32F40x 固件库的MDK5 工程
意法半导体MCU双供应链策略,打消中国客户后顾之忧
【经验分享】基于STM32使用HAL库实现USB组合设备CDC+MSC
2024意法半导体工业峰会:赋能智能电源和智能工业,构筑可持续未来
ST推出灵活、面向未来的智能电表通信解决方案,助力能源转型
意法半导体 x Qu-Bit Electronix:推动新一轮的数字声音合成革命
从STM32 MPU产品看嵌入式系统中微处理器的新变化
【Hot!】STM32全系列开发板都支持Arduino开发,你知道吗?
【经验分享】STM32 HAL库移植FreeModbus详细步骤