|
开始正式测评前,需要准备一个基础的模板工程,后续的测评内容都在该工程的基础上修改
- r; N6 n, ^, P6 E8 Q$ ?首先同步一下我的开发环境及软件 电脑:Windows 10 64位 STM32CubeMX版本:6.11.1 STM32CubeMX中U0 Pack包版本: 1.0.0 Keil版本:5.37.0.0 Keil中U0 Pack包版本:1.0.0 9 K% R" w; |8 v+ F, i
一. 模板工程创建 打开CUBEMX,选择从开发板开始创建工程 通过左侧的筛选条件,找到U0开发板 弹出的人际接口默认是把LED、按键、虚拟串口都选上了,这些都保持默认即可(如果后续不要可以在CUBE中关掉) 可以看到LED、按键、串口都被配置好了,都不需要用户再来手动配置 来到Project Manager中设置工程名字和选择IDE,生成工程 生成完毕后,会弹出如图提示框,我们选择直接打开工程,就会直接自动打开keil 全编译,没有错误没有警告 下载选项中把烧录后自动运行勾上 下载也没问题,那么模板工程就创建好了(但是还不能直接使用,主要是串口还不能马上使用,还需要稍微修改一下,详见下面的BSP使用)
4 h2 b' p* x; ]+ Y二. BSP的使用 BSP的各个函数在stm32u0xx_nucleo.c中,需要调用什么函数可以去这里看
6 A- B; E' ?5 R; T: N5 W2.1 LED 在文件中LED相关函数后初始化、去初始化、亮灯、灭灯、翻转、获取灯的状态 其中初始化已经由CUBE自动配置调用了,我们直接使用即可,自动生成的LED初始化函数调用如下 这边以LED的闪烁为例,这里用了on、off函数和Toggle函数两种方式实现了LED的闪烁 - #if 02 B9 `* J R4 s2 i; i6 \1 a
9 h3 f. D: H9 R8 W8 j7 k- /* LED BSP测试--on、off函数 */5 h4 I* {) E* q& C5 N9 ~; |: J. H
- : V( w7 X# _# b$ q' U+ A
- BSP_LED_On(LED_GREEN);" ]- X$ w/ U- L. G& E; L
. m: ?# f/ U: b, Q h, A/ Y% E- HAL_Delay(1000);
. E$ S6 }, Q' a7 U& W - % C& `9 Y; O! C" Q, }! t! L
- BSP_LED_Off(LED_GREEN);
" ?3 s9 w( S4 K" A% W8 a
: k7 J: D$ D/ \! {7 f0 h9 a- HAL_Delay(1000);
7 ?2 c* \8 a& |- S - + [6 A, S1 V+ d
- #endif+ _, X( }2 u/ X/ v* Q
* G. k) C6 n* G0 \& f+ `8 J- 8 a* `& z$ c5 }/ _, d- v
- # E; H8 g, H; z0 \
- #if 1
' C q( n+ q" O1 V: K9 Q% D
e2 n' \0 u' x( \- /* LED BSP测试--Toggle函数 */5 b( e2 {+ q$ [ s, j
- * e! V0 A0 y; p- e
- BSP_LED_Toggle(LED_GREEN);- h9 l5 e! f Z/ v) Y+ U& ~
' d' I) c0 r, R, T+ ^) Z7 a) m- HAL_Delay(2000);9 O: E2 w6 a8 [* ^1 w; F
3 d' L! x# D1 ~. J o9 e& p0 l- #endif<span style="font-family: 宋体; font-size: 10.5pt; background-color: rgb(255, 255, 255);"> </span>
复制代码
3 D6 P9 J3 c% m! ^2.2 虚拟串口 自动生成的串口的初始化函数调用如图
1 E7 g; _7 ?$ e1 g& M% ]& G& k6 k虚拟串口主要是要做打印输出,一般使用printf,但是当前工程不能直接使用printf,需要做一下printf重定向
# t# d' }; [* m) z! _) p. m7 G; J- int fputc(int ch, FILE *f)
& O# u$ X0 A& y5 s, N0 w; o/ g+ M2 ]
Q# V! j# G8 a: x5 E ^/ h- {
3 J' N7 p1 m$ D8 a) g
, r* }1 |0 y' \7 J4 }' t1 H1 N) \- HAL_UART_Transmit(&hcom_uart[COM1], (uint8_t *)&ch, 1, 0xffff);5 s* i, _5 g; P* C
- # n% k5 ^8 W$ v2 p! A* ~
- return ch;0 {2 V8 R% Z! @7 t5 M J1 d
! B. y4 \; B1 o, x% C0 W, t( C- }
复制代码
" c% `" F# [9 Y& g. D: w2 k+ B( OKeil中开启一下Micro LIB 增加一下printf函数,测试一下他能否正常工作 - printf("STM32U0 printf test\r\n");
复制代码 编译烧录,打开串口软件,复位芯片,有打印输出
- B# R4 B( |+ I' o0 `; ]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)0 e2 |: o0 N, v$ O; I/ X
- 3 b& V! N! K$ m6 }/ n, ^
- {- x, |& z$ Q% y) e" F. ^
1 [4 M0 W0 Y' z/ X. t- if (Button == BUTTON_USER)
0 m$ Q A- e: F* P9 z0 \ - 2 h9 v: H: d6 \& |* Q# u
- { Q/ L/ B5 z9 y# ?" `& x
- - h6 d$ d. \# N* p1 n5 m
- UserButtonState = BUTTON_PRESSED;
5 B; D1 h) a g/ {2 W
o4 c8 U) c& p4 j. g5 l; c/ [- }* S0 ?7 j$ t* ^- z5 G: v, x h
2 V4 ]" A3 U8 J l6 m6 g0 O, M- }
复制代码
# W/ m4 n, N; K* F- #if 1+ N3 C; y& g/ n3 I
" E6 D3 q& z' E$ _) s- G- /* BUTTON BSP测试 */
7 O! f7 c6 w- o- P5 t) M% P/ `
, O3 r c; c% H6 S# K$ Q9 p# V- if (UserButtonState == BUTTON_PRESSED)
. _9 h. ?- y- e( q# D3 Z
/ J. |9 c q6 ]# m6 n- {
4 l# U, S$ s1 G. m: V
5 |. Z7 D2 \3 G9 G1 F& u( n1 _; I- UserButtonState = BUTTON_RELEASED;
7 A* C# b' `" P O0 z( n1 n( e
% c/ B7 v9 W/ j' V& I6 ?! {2 @- BSP_LED_Toggle(LED_GREEN);" l1 Z- A( p6 X7 M
. @( `2 x) I ]+ h7 G$ x- }' s+ ?8 |3 [2 Q# Z. ^
% T2 i& a( I* w' \+ h- #endif
复制代码 ) T: L5 I0 T& n' [. U* k' q; q9 l
5 @ r. m: s6 Q, P# W* ^& g$ s; }
USER按键按下后LED就会进行翻转
; z: u2 m/ z( C: E1 L
模板工程(额外增加了define,替换了上文中#if后面的1): |