开始正式测评前,需要准备一个基础的模板工程,后续的测评内容都在该工程的基础上修改
* ?* [9 a3 T" t3 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 ) M0 G0 h% p G+ C0 a6 N5 Q
一. 模板工程创建 打开CUBEMX,选择从开发板开始创建工程 通过左侧的筛选条件,找到U0开发板 弹出的人际接口默认是把LED、按键、虚拟串口都选上了,这些都保持默认即可(如果后续不要可以在CUBE中关掉) 可以看到LED、按键、串口都被配置好了,都不需要用户再来手动配置 来到Project Manager中设置工程名字和选择IDE,生成工程 生成完毕后,会弹出如图提示框,我们选择直接打开工程,就会直接自动打开keil 全编译,没有错误没有警告 下载选项中把烧录后自动运行勾上 下载也没问题,那么模板工程就创建好了(但是还不能直接使用,主要是串口还不能马上使用,还需要稍微修改一下,详见下面的BSP使用)
r- I! _" v8 |" l- u/ r( }8 s' T二. BSP的使用 BSP的各个函数在stm32u0xx_nucleo.c中,需要调用什么函数可以去这里看
& ?( S& g% l% `2.1 LED 在文件中LED相关函数后初始化、去初始化、亮灯、灭灯、翻转、获取灯的状态 其中初始化已经由CUBE自动配置调用了,我们直接使用即可,自动生成的LED初始化函数调用如下 这边以LED的闪烁为例,这里用了on、off函数和Toggle函数两种方式实现了LED的闪烁 - #if 02 o3 }* D8 @, C" W
- 2 X# F* H* N$ e3 d* I6 ]7 c
- /* LED BSP测试--on、off函数 */( B+ o+ W0 q/ {/ H
2 v) z- c' }" v7 Q$ @0 {- BSP_LED_On(LED_GREEN);
8 u6 X3 d! v5 o5 e - M, o4 h4 u( |* {
- HAL_Delay(1000);0 f! s: X. D0 a0 v! g4 V5 L- }
2 {, Z- i/ g" \, A- BSP_LED_Off(LED_GREEN);' o3 k6 x/ h D0 [+ I
- 9 m' ?3 y% b/ Y) D6 M
- HAL_Delay(1000);
9 _, [: v% b9 n( S - 9 D5 X) G1 n1 ~3 @* d
- #endif
+ d2 R/ N6 y& W - S( G5 n) n1 c/ _! M/ p
- 2 Z- g0 K7 U$ K7 Q% t! M- ?% Y, Q' k9 q
( O3 C0 D" O* a- #if 1
' F$ u1 ]( W' P* m) P6 W7 E2 K( L
; R% K! Y: {% e1 v$ h! I% b7 L- /* LED BSP测试--Toggle函数 */
. K1 J5 T- S1 h2 Z& t& A+ {* G
7 T L0 k7 M" f# X9 \0 k) t" ^* v- BSP_LED_Toggle(LED_GREEN);
6 C; ?; m1 a' A6 q
" Z- w4 I; e7 X- HAL_Delay(2000);
: T* ]3 U$ ~0 i' ?* b2 ?* u - 6 e8 W7 C; T+ x0 n% D7 W
- #endif<span style="font-family: 宋体; font-size: 10.5pt; background-color: rgb(255, 255, 255);"> </span>
复制代码 7 o3 t" q$ S. I& s
2.2 虚拟串口 自动生成的串口的初始化函数调用如图
& k% g1 N' U/ `( H, U' Z3 p; U/ h: o虚拟串口主要是要做打印输出,一般使用printf,但是当前工程不能直接使用printf,需要做一下printf重定向 6 H& A4 ?' h2 D' V
- int fputc(int ch, FILE *f)
+ R' R0 D$ Q( ?$ h, T" b1 J - * U% }" G5 I7 j$ k+ M
- {# {) Y; B9 l; g" J- R
- + V, ^, L! V5 O! q
- HAL_UART_Transmit(&hcom_uart[COM1], (uint8_t *)&ch, 1, 0xffff);* F- A# s# q- d
8 H/ v' x5 y$ R y& X( e9 X- return ch;
/ ]8 b' Q$ @9 c! ?
/ b4 w- J2 \/ C! c- }
复制代码
0 [2 w5 W9 I3 e5 K3 E& i4 QKeil中开启一下Micro LIB 增加一下printf函数,测试一下他能否正常工作 - printf("STM32U0 printf test\r\n");
复制代码 编译烧录,打开串口软件,复位芯片,有打印输出 # o4 h' S! {# T0 g# X( s8 {, \
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)
( v& ~- a- M1 z6 p
- Y' }) t- W: ?6 c' o) u- {# |6 `: l9 z1 v: S% l: _# V2 b
- & }( g2 d7 o3 Y* D6 c
- if (Button == BUTTON_USER)
1 [8 y0 X# `. [* s, r [
8 X3 B- ?/ ]9 \/ J4 }3 B$ B0 a- {: W$ `9 u2 {/ A A
2 [6 ?, r& p6 w, Q- UserButtonState = BUTTON_PRESSED;
& l( Q7 G5 S5 X4 u; Y2 Y) v
$ C1 r: S* b& [; G) D; _- }
3 I5 P% q$ V4 P. c - 6 b Z# A/ n5 [
- }
复制代码 _9 {; x' _, S
- #if 1: }0 C) h; K8 }1 O
( F) m5 o6 B' J5 ^+ d5 E- /* BUTTON BSP测试 */; Q* P8 U' t* B1 T
- % T# P% B3 `) x3 U \. f
- if (UserButtonState == BUTTON_PRESSED)
( r+ d! R& h7 F! g/ k$ Y
$ j0 L6 B9 |1 X$ H# ^) g- {
0 c" O' }5 G. t b - + T5 h5 O4 h+ R8 z$ Y) ?" T
- UserButtonState = BUTTON_RELEASED;
% A9 ~. h) m) n. [/ e% K! X
5 T1 s# x& B ^6 c- g" X- BSP_LED_Toggle(LED_GREEN);
3 C2 A. m( k0 T2 V - 0 }2 Q& z4 k# _2 _/ p6 U* c
- }4 U6 A/ [3 V. t* ~
0 N$ s0 G4 ? v- ?, {- #endif
复制代码 1 a' P9 Z$ _3 U6 @, s" A5 O
4 d. s; z) H5 T+ |; M1 UUSER按键按下后LED就会进行翻转 ! Y# j C5 A1 S! q7 o
模板工程(额外增加了define,替换了上文中#if后面的1): |