STMCU小助手
发布时间:2022-5-15 16:41
|
实验操作% m# s% p+ y8 D1 [/ z/ c 1、打开cubemax ,芯片选取。, ~: S6 z# {8 e7 k 选取STM32F103RCt6 (根据实际情况选择),LQFP64封装的。然后鼠标双击中间那个圈住的地方就可以进入配置界面。( d) N& H' o2 f7 }
! M% v. w2 a0 E6 l1 _+ L( Y' E1 l
# F4 d, X# j# p2 u0 C+ ^ 图2、配置界面) B/ M5 o. ?# A- x4 r" N: y 如上图:! W: X: ^ k9 l! n5 @ % w3 F+ x8 \- v8 Q (1)、标号1 为系统核心的配置,其中由晶振的配置。+ w D! N3 E) ^$ t) G" h 4 w- i; e5 ]& V2 n (2)、标号2为模拟量相关的外设配置,如adc,dac,等。 (3)、标号3为定时器配置。 ) E* A, Z$ Q! }! R7 h5 g (4)、标号4为通信相关的外设。比如串口,CAN等。& ^2 `3 n: g3 l" j# L , b& w* q+ j; w/ w5 C 其他图中有标注。 9 u2 r' ?8 g4 ` E, r9 |# I 2、晶振配置 晶振是单片机的时钟来源,相当于心脏,先添加晶振,点击上图编号1,然后出现下图,在点击RCC,进入晶振% K4 w3 |" b' d% @! g6 l ; S, d; ~3 i& U1 m
6 R/ E( x* j/ ~# ?, @ 如上图:HSE 和LSE 都选择Crystal..选项。然后注意芯片示意图上有四个引脚变为绿色。 * q+ E2 |0 W: Y 3、时钟树配置! _/ k8 r+ z) k3 R& i( m' N 点击
; c* C4 Q, V. s 配置时钟树如上图,改好后按回车键生效。0 Q( {5 g! K' I9 o, j$ S: x" e 0 a: q$ K9 [3 v. V! G) K" T" J 4、中断管理配置: ' k2 X: h; h- g4 W
+ ?+ x' Q1 {+ {- Z0 S* { 点击NVIC 后,进入如下界面:
9 U6 d3 ?' a4 v$ O/ z 到这里我们STM32的系统基础配置就完成了! 5、外设配置 8 [) U+ Q& v; X2 Z 下面就是结合具体需求来进行配置,例如我们这里讲的是串口1以及串口1的接收中断配置,那么下面开始配置串口1 及其中断。; D# m3 q$ @4 w. ~6 I9 f
# M6 a0 i/ c" y4 f3 _+ y
这里只要选好模式就行,可以注意到,芯片示意图上已经出现了串口1引脚 。但要记住这里的波特率设置为115200了。这里串口就可以正常使用了。但是,我们还需要使用中断,所以还需要配置串口中断。 + ]$ L; j" B4 ^5 E) e
中断最后还需要设置好优先级:3 `; O0 R; K3 p2 h7 R. P' `8 Q Z; E" V( U! ~% e
到这里,串口1的中断就算是配置好了。接下来可以生成代码了,但是需要几个小的配置,点击工程管理* h. C) ?9 t3 i# O0 s 8 i+ e5 i& c7 t
进入管理工程界面,
到这里软件的工程的软件配置部分就结束了,然后生成工程代码,
Q* t& j* j. ?; Y/ g 6、工程代码上的配置以及修改) y# K6 g+ C( O7 \. u2 F9 |9 N7 r - c/ f6 ?8 I5 t1 g8 R 使用keil5 打开刚刚生成的工程代码。; x2 Y6 j$ v+ [' `- l; l 9 Z( Y) x1 U1 {$ d
找到main.c, 会发现如上图的主函数结构,其中, ?) t- A9 @0 \: t0 [1 q $ k9 y, l" k2 D! x MX_USART1_UART_Init(); 就是软件生成的串口1初始化配置。 3 _9 G4 v) l$ e$ G2 V 如下图,光标放在相应的函数上,鼠标右击,选择GO TO Definetion.. 选项即可进行跳转。" C T9 g5 V9 @+ k) ]- O+ F + n- V: {/ `- A4 ~, }6 f5 f
跳转进入usart.c 文件,会看到,MX_USART1_UART_Init();的函数体。 3 ?( Y) V. a$ `8 H2 J
4 y# k4 B% i# a* T0 a, A 在这个usart.c文件中添加如下代码:,如下图所示- B) i- t, W6 Q7 t# a2 i 这段代码可以在STM32中正常使用printf()函数。具体添加位置可以如下图,注意所在的文件和位置。同时不要忘了在usart.h 文件中添加#include “stdio.h” : \- G4 ?. u/ Q7 T \4 I7 x * ^4 v! a" }& @
# X/ C6 ]2 `2 L, U' S, ^ 添加 #include “stdio.h”) B9 y1 C0 A( q, M4 S* f 7 H/ o1 d/ s( u( f9 j5 q
经过上述两步就可以正常使用printf() 函数了。/ a& j, X5 ]$ _1 H+ M 最后配置中断相关的函数, 7 t2 }8 ^& |1 i( n) R8 D (1)、找到中断服务函数 - }3 c, L6 D* z: H N- K 位于stm32f1xx_it.c 文件中+ ]) E k: e% P: Y5 L- h* I
1 g% Z2 k4 w0 Y: q (2)、找到中断回调函数! v% _- Y1 l; D( x% L! F5 Q- W- S+ G : k8 B7 T6 p& J+ j" P 1)、HAL_UART_IRQHandler(&huart1); $ {3 R5 C; C" U5 X$ P4 i " ^* \8 U# f3 Q* M0 ? 2)、UART_Receive_IT(huart); 3)、HAL_UART_RxCpltCallback(huart);0 W2 u8 g. k- t4 a6 }& X' T% Z4 Q * j {% K& ~% T/ ]0 \ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart), S H( z1 B N" W9 Q7 | % m( ?' H' s- V* G5 l" c$ h2 [/ f; G 从1)可以跳转到3), void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); 就是串口中断回调函数 。 并且将void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)复制到usart.c文件中,如下图。在这个函数中就可以写中断逻辑, f. {$ ?0 l# s: ]
(3)、开启接收中断 HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) 在这个函数中会使能接收中断,需要三个参数,分别为 1)、串口句柄, ! b0 j' [% n# _ S5 D 2)、保存接收数据的数组,6 |% U* u3 h0 C 3)、每次接受的数据字节数, 所以我们需要首先定义一个保存接收数据的数组。
) P$ D) T; }9 ]& @ 然后开启中断,需要写在两个地方,分别是串口初始化的时候和回调函数的最后,如下图所示, * |$ v8 l% g; L- A
# n# M0 j P L( {- \* H 最后 在回调函数里加入如下代码进行测试:7 R: l6 o5 }. g
( o. _3 _4 n- g7 r2 ] 最后下载程序测试, 8 W& `4 Z' `6 f. x/ ^- g- y 点击发送,单片机收到数据,就会打印出123.(因为我们使用的是串口1的接收中断,所以通过串口助手给串口一发数据,串口1接收到数据,就会触发接收中断,执行中断服务函数,最终执行到回调函数也就是我们的中断逻辑。这里的回调函数只是为了说明问题,实际使用时还需要判断是哪个串口触发的中断。# g2 s2 a8 ?7 t$ E7 F% b 2 q9 R0 g( s7 E% k3 X0 A8 ^$ [ |
【经验分享】STM32语音识别的智能蓝牙音箱(源程序+原理图+PCB+设计说明书+PPT)
想找个ST芯片
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
技术手册stm32f1xx中的一个小问题
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
微信公众号
手机版