|
开始正式测评前,需要准备一个基础的模板工程,后续的测评内容都在该工程的基础上修改 9 k/ H! e7 X4 f6 B! D, g. M
首先同步一下我的开发环境及软件 电脑:Windows 10 64位 STM32CubeMX版本:6.11.1 STM32CubeMX中U0 Pack包版本: 1.0.0 Keil版本:5.37.0.0 Keil中U0 Pack包版本:1.0.0
8 V, z3 u, n7 q- I& s9 h一. 模板工程创建 打开CUBEMX,选择从开发板开始创建工程 通过左侧的筛选条件,找到U0开发板 弹出的人际接口默认是把LED、按键、虚拟串口都选上了,这些都保持默认即可(如果后续不要可以在CUBE中关掉) 可以看到LED、按键、串口都被配置好了,都不需要用户再来手动配置 来到Project Manager中设置工程名字和选择IDE,生成工程 生成完毕后,会弹出如图提示框,我们选择直接打开工程,就会直接自动打开keil 全编译,没有错误没有警告 下载选项中把烧录后自动运行勾上 下载也没问题,那么模板工程就创建好了(但是还不能直接使用,主要是串口还不能马上使用,还需要稍微修改一下,详见下面的BSP使用)
+ |2 |1 r% I) [ R8 T% Q. }二. BSP的使用 BSP的各个函数在stm32u0xx_nucleo.c中,需要调用什么函数可以去这里看
/ Q1 ?' y; H Z) a1 n. h7 T) D) T2.1 LED 在文件中LED相关函数后初始化、去初始化、亮灯、灭灯、翻转、获取灯的状态 其中初始化已经由CUBE自动配置调用了,我们直接使用即可,自动生成的LED初始化函数调用如下 这边以LED的闪烁为例,这里用了on、off函数和Toggle函数两种方式实现了LED的闪烁 - #if 0
. ]& D+ G, ?9 |# G0 B
$ j5 s+ K( {. H/ l* s0 ]- e A# N- /* LED BSP测试--on、off函数 */
7 b1 U, g a2 Y) w- k5 u
- i% z/ d9 d! T' ?% g3 d- BSP_LED_On(LED_GREEN);2 ]+ B3 y) H0 ?7 F2 I3 G7 E
- " K; F- x6 @# n# q* y3 q
- HAL_Delay(1000);7 _- |& Z( G6 d& `, I7 N
9 I/ n8 u6 B( f6 _1 g3 i6 [9 l, y- BSP_LED_Off(LED_GREEN);, J" f( m- B6 x8 Y3 k' [
- : H+ b0 y( O) y4 w
- HAL_Delay(1000);
; }' w" Q. E8 D8 `* P
- |4 S3 F6 e: N9 f" U- #endif
& E5 `0 m3 D5 M7 S* F
3 l0 c+ T. G% |- g' T8 b6 B/ U-
) s4 h0 f3 g! L8 F2 r) ~2 B: ?7 y: [ - / a4 |; o( B0 b/ z0 [; w9 G
- #if 1
9 j* y" M* c3 A& T& d$ T! s
3 A2 N! O5 b! g/ L& R3 w0 I1 o- /* LED BSP测试--Toggle函数 */
$ B$ O$ f" |& D% t/ q
9 { g3 ^+ R5 \) v1 k, ?- r' V. i u- BSP_LED_Toggle(LED_GREEN);
( E' q/ ~ z7 C! p - 6 r0 l- Y1 o2 j) y
- HAL_Delay(2000);5 h/ o, _ J+ s P3 e
- 2 e7 r/ o. c: E) D
- #endif<span style="font-family: 宋体; font-size: 10.5pt; background-color: rgb(255, 255, 255);"> </span>
复制代码
6 ^! a e3 u$ y2.2 虚拟串口 自动生成的串口的初始化函数调用如图 ; N1 Y% t( `$ ?3 c
虚拟串口主要是要做打印输出,一般使用printf,但是当前工程不能直接使用printf,需要做一下printf重定向
. {3 C2 W9 s7 Z2 p1 R- int fputc(int ch, FILE *f)! R9 p4 C6 t! M: `1 m: z
9 Z7 ^ p2 A( q/ i0 V- {
" U& d6 z0 c8 x9 J8 s" ]2 G/ [ - + v) ]; E$ J) a- ~
- HAL_UART_Transmit(&hcom_uart[COM1], (uint8_t *)&ch, 1, 0xffff);
$ m4 @3 [- A% S9 Q# Y2 H- o
9 q0 {/ A& K# C" p) L, c2 J- return ch;5 j& V6 |* v `$ Q! [1 S4 {% }
4 s- Z2 C* A4 _ e# V. }$ d. Q- }
复制代码 3 L" j: e% i0 M8 d2 b6 @
Keil中开启一下Micro LIB 增加一下printf函数,测试一下他能否正常工作 - printf("STM32U0 printf test\r\n");
复制代码 编译烧录,打开串口软件,复位芯片,有打印输出
# A k. w, n. T( b3 ?1 ~2.3按键 BSP默认是把按键做成了中断触发,stm32u0xx_nucleo.c中有一个叫BSP_PB_Callback的虚函数,当按键按下后就会调用这个函数,用户就只需要关注实现BSP_PB_Callback,在这里面处理按键按下后的业务 - __IO uint32_t UserButtonState = BUTTON_RELEASED;
复制代码- void BSP_PB_Callback(Button_TypeDef Button)+ m" S- R9 t5 U6 ?; n+ }# B
0 d7 k7 m+ g" ^5 t- {' B" J& n3 l5 F1 [) T* _5 P" i$ V% Y
! I' M& C! S4 N+ ~- if (Button == BUTTON_USER)
' U0 Y9 ~5 ?5 T
; S1 Q. ]* N/ F8 W1 ~" d0 ?# [- {. ~1 f8 d4 T/ C9 P% g* q6 G
- 4 X5 \6 b2 _7 y# @
- UserButtonState = BUTTON_PRESSED;) [% d1 M$ X" V) f
- ! a* }. g Y4 M7 Z3 o
- }
; b% k1 S0 z, m
) y W, B9 w3 V& M- }
复制代码
; O1 L v$ P4 w, }9 s$ E0 f+ {" t8 F- #if 1
5 @% g' k' o7 \
8 ?: I0 O& w/ w* W- /* BUTTON BSP测试 */, C& V+ K+ o" J) g6 Z9 P/ y( z
- 9 y9 l/ j% T8 i+ w" B9 ^4 f
- if (UserButtonState == BUTTON_PRESSED)6 o! i P* _8 W4 C* j7 p7 k
" Z. O. C* b& _# E \- {
. g+ f+ o: c9 }5 l6 K9 v - / j& C% `0 J/ e
- UserButtonState = BUTTON_RELEASED;
( w8 j. h1 ]) D, B# t - 9 \8 h& Y( i. c4 t" [
- BSP_LED_Toggle(LED_GREEN);
; D, Y% ]& \- J% {; V - % i. u! c* B( m. {& |* @' M
- }
7 @ Y7 l. R2 s2 p - . o, }$ m. Y5 a g
- #endif
复制代码 / Q# y) I6 ]5 P# n6 O' ~
! j" c" ~( u- [% o" B8 k+ Q' U0 E
USER按键按下后LED就会进行翻转 * ]0 N ^$ R* x% q
模板工程(额外增加了define,替换了上文中#if后面的1): |