|
开始正式测评前,需要准备一个基础的模板工程,后续的测评内容都在该工程的基础上修改 " J7 i; Y5 ~0 R7 T$ ]9 a$ 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 ' g9 y% w$ r. u! }0 @( [7 V3 o4 J
一. 模板工程创建 打开CUBEMX,选择从开发板开始创建工程 通过左侧的筛选条件,找到U0开发板 弹出的人际接口默认是把LED、按键、虚拟串口都选上了,这些都保持默认即可(如果后续不要可以在CUBE中关掉) 可以看到LED、按键、串口都被配置好了,都不需要用户再来手动配置 来到Project Manager中设置工程名字和选择IDE,生成工程 生成完毕后,会弹出如图提示框,我们选择直接打开工程,就会直接自动打开keil 全编译,没有错误没有警告 下载选项中把烧录后自动运行勾上 下载也没问题,那么模板工程就创建好了(但是还不能直接使用,主要是串口还不能马上使用,还需要稍微修改一下,详见下面的BSP使用) 7 I+ r Y5 B; e
二. BSP的使用 BSP的各个函数在stm32u0xx_nucleo.c中,需要调用什么函数可以去这里看 + I2 e# ?7 L" U0 G
2.1 LED 在文件中LED相关函数后初始化、去初始化、亮灯、灭灯、翻转、获取灯的状态 其中初始化已经由CUBE自动配置调用了,我们直接使用即可,自动生成的LED初始化函数调用如下 这边以LED的闪烁为例,这里用了on、off函数和Toggle函数两种方式实现了LED的闪烁 - #if 0
( \6 A- L! e8 }) w; M3 u3 L
6 f% I( ~9 K' K4 A+ K3 X- /* LED BSP测试--on、off函数 */- Y) m. ^0 W: |5 S$ B, s/ r4 I/ l
- 3 u8 F% n5 [) U$ l' g& \
- BSP_LED_On(LED_GREEN);
% {7 K1 T% U( O2 y0 V' T" f - " x$ V* B& h3 t4 x; R* d
- HAL_Delay(1000);& [4 j* f! G$ o2 C& f# |/ U. {
' R( V8 N: k n! @% @6 V- BSP_LED_Off(LED_GREEN);
2 y2 D. x+ d5 T% `
3 H6 T9 G- Y6 [+ {4 k l- HAL_Delay(1000);
6 O% t0 a$ ?. q9 s
0 X: }* Q) T: r1 g$ J' H/ y8 S- #endif. w$ G' `, h; j0 N" _/ N& i* o
- ' A% d: ?* ~ h: R4 U# E
- 4 \: [, p5 @# N; l ^
1 H G4 d( H: j/ @+ U- #if 1
8 V* W0 t% I% F3 a3 b n
% f$ k, H D0 c6 f2 s. N- /* LED BSP测试--Toggle函数 */9 c8 Z" B# g7 Y: g& i* f- l7 B
- , F3 O% S8 b1 b3 z
- BSP_LED_Toggle(LED_GREEN);- v4 e3 m S1 F; q" M' u/ h, S: z
* y& \: A8 J8 S& s; i8 S- HAL_Delay(2000);
4 J$ w& v9 v7 z3 V- u+ t: p0 y
' c; U& ]- \1 A$ Z/ T- #endif<span style="font-family: 宋体; font-size: 10.5pt; background-color: rgb(255, 255, 255);"> </span>
复制代码
5 o, d. X9 }0 n2.2 虚拟串口 自动生成的串口的初始化函数调用如图
+ m+ Q. r, a- M* }! C+ B% \虚拟串口主要是要做打印输出,一般使用printf,但是当前工程不能直接使用printf,需要做一下printf重定向 ' }. F& t O/ n( {8 {, K
- int fputc(int ch, FILE *f)
; f& h- X& d8 U9 C
, k1 g; [: p7 m2 f8 U9 R; q/ R& F- {
. l" z; E3 R. z1 H8 e2 p- ~3 o - 6 z0 \+ u [1 x/ w+ t6 J; D
- HAL_UART_Transmit(&hcom_uart[COM1], (uint8_t *)&ch, 1, 0xffff);
/ A$ N7 P% W: n; O, h. V - 1 O! K# P' L: q# S3 s/ M' h7 Z2 t
- return ch;
$ E4 I% V0 B9 I6 ?9 }4 w3 {
) d& N9 T% I7 a% |$ T- }
复制代码 1 K/ V8 B' [; J4 f7 v" |# \) W) Z
Keil中开启一下Micro LIB 增加一下printf函数,测试一下他能否正常工作 - printf("STM32U0 printf test\r\n");
复制代码 编译烧录,打开串口软件,复位芯片,有打印输出 / x7 A( D2 u4 [" u8 J
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 ?, Z" g7 L8 |- r9 f1 |6 _
$ z4 X1 `) E" I# W: z; j- {1 r1 L, W/ D: V, |) F/ o& s9 \
- ' Q' s) K5 ?8 H3 }
- if (Button == BUTTON_USER)( R* |5 U* q, L/ \( Y) ?* Y; {
- M# v: E* T0 \, h, s- {" k: f: l# V% x' A+ z$ N2 Z! X% b
. u9 ?/ H6 L7 i/ z6 M+ l4 M- UserButtonState = BUTTON_PRESSED;/ M, u8 [4 `/ M7 \9 `5 y
- $ F z6 R, f6 i: y7 z+ d
- }( b, U" f3 J7 ~0 W# G
- 0 e8 q! w# b+ _, T9 b
- }
复制代码 6 N, T5 D+ E% }# |- a1 t1 |
- #if 19 P1 k s# v+ A F' u
1 V; I$ r; j, o" |6 v- /* BUTTON BSP测试 */
! G- j" \1 r1 l0 b4 Y" _! U. {
5 j5 \( i/ C, M- if (UserButtonState == BUTTON_PRESSED)
' y' s, E& c: Z - : f+ ^+ p6 w# }# z. \
- {& A' w. g- K7 H9 ^9 j
- 3 y' h, U8 ^* L$ W k5 h
- UserButtonState = BUTTON_RELEASED;
! o, E1 o' t+ U0 M
! @6 z+ S% ?* `- BSP_LED_Toggle(LED_GREEN);. f- W: s) M# N* v6 n5 u0 ^
- 9 P5 P2 b7 k/ O$ ~( k3 [: {! M
- }
# @# k+ F5 T0 B+ s
1 \1 q- p' J3 D9 S% i o- #endif
复制代码
4 [8 {: q8 i) o# ?( T
% O/ ~* U5 u4 JUSER按键按下后LED就会进行翻转 # U6 j9 P1 C% n! d9 h: N7 F8 n# \9 q
模板工程(额外增加了define,替换了上文中#if后面的1): |