开始正式测评前,需要准备一个基础的模板工程,后续的测评内容都在该工程的基础上修改
- R0 n6 j4 E4 O: {8 P首先同步一下我的开发环境及软件 电脑:Windows 10 64位 STM32CubeMX版本:6.11.1 STM32CubeMX中U0 Pack包版本: 1.0.0 Keil版本:5.37.0.0 Keil中U0 Pack包版本:1.0.0
. Y% C6 o9 [* m" k; @& I$ v# N一. 模板工程创建 打开CUBEMX,选择从开发板开始创建工程 通过左侧的筛选条件,找到U0开发板 弹出的人际接口默认是把LED、按键、虚拟串口都选上了,这些都保持默认即可(如果后续不要可以在CUBE中关掉) 可以看到LED、按键、串口都被配置好了,都不需要用户再来手动配置 来到Project Manager中设置工程名字和选择IDE,生成工程 生成完毕后,会弹出如图提示框,我们选择直接打开工程,就会直接自动打开keil 全编译,没有错误没有警告 下载选项中把烧录后自动运行勾上 下载也没问题,那么模板工程就创建好了(但是还不能直接使用,主要是串口还不能马上使用,还需要稍微修改一下,详见下面的BSP使用) 3 d& W( P4 ]- |- q. f; k
二. BSP的使用 BSP的各个函数在stm32u0xx_nucleo.c中,需要调用什么函数可以去这里看
; [) I9 w6 Y% l" z1 r, S: L, h2.1 LED 在文件中LED相关函数后初始化、去初始化、亮灯、灭灯、翻转、获取灯的状态 其中初始化已经由CUBE自动配置调用了,我们直接使用即可,自动生成的LED初始化函数调用如下 这边以LED的闪烁为例,这里用了on、off函数和Toggle函数两种方式实现了LED的闪烁 - #if 0
: A: k5 ]) A9 n - 2 |5 t8 j! i% Y( G& p0 `
- /* LED BSP测试--on、off函数 */
, [; ~: z X6 X" M# s
0 M0 Q$ \2 ?5 Z. }) }: I- BSP_LED_On(LED_GREEN);3 G! ]( b8 T8 z6 K
* t" R. k! W+ h& Z4 O& w0 d- HAL_Delay(1000);1 O8 L0 D9 ^3 M3 x' \5 `
+ p7 E' D- ~9 j/ Q0 s" T- BSP_LED_Off(LED_GREEN);
; C. E9 y ~: R% u) U z - & L8 r% H0 X7 ]& _" g# I u
- HAL_Delay(1000);9 ^8 n: g$ q+ { a b$ ?
- " l, R; t* t4 u3 `; z
- #endif
% h" |- f% z4 q2 a8 r- n - / t' B4 B1 ]3 ]& c& E& p, Y% F+ ^
-
" H4 `' ^ ^" d0 U+ I4 D - 0 N8 _1 ]" y1 f; X y
- #if 1
m0 t, ~, f, T4 F: A5 H1 j: ]4 _" H
' o: e1 c* V* l$ k: Z- /* LED BSP测试--Toggle函数 */5 s, ~% h! r, Y$ b% m
9 R# R3 X' j/ K- BSP_LED_Toggle(LED_GREEN);
) r# a5 s. ?/ ]/ Y/ o5 Z9 G' F - 8 l5 v9 ?2 H1 U) a
- HAL_Delay(2000);* [* y* R. A3 i8 r' a
- $ w/ C. s0 |* M# z7 K9 G
- #endif<span style="font-family: 宋体; font-size: 10.5pt; background-color: rgb(255, 255, 255);"> </span>
复制代码 . c% D% P( j7 M- l
2.2 虚拟串口 自动生成的串口的初始化函数调用如图 2 S- d6 }$ `0 z$ p
虚拟串口主要是要做打印输出,一般使用printf,但是当前工程不能直接使用printf,需要做一下printf重定向
7 a6 A7 \# \* c3 ]5 t- int fputc(int ch, FILE *f) `* J9 |7 {. m% s2 ?
- $ ]" s8 v& G9 M. y1 r
- {
3 Z/ h/ K# M$ I8 q" c
, @+ N) C$ Q3 B- HAL_UART_Transmit(&hcom_uart[COM1], (uint8_t *)&ch, 1, 0xffff);& t( }3 d! P4 x" |. Z
) d* \: e& g7 l- return ch;- V4 z+ x) G( z4 q5 a5 v) E: g
, s7 y! U. P: o' N+ j0 F9 v- }
复制代码 ; X" S$ q4 s+ f, d* p: l
Keil中开启一下Micro LIB 增加一下printf函数,测试一下他能否正常工作 - printf("STM32U0 printf test\r\n");
复制代码 编译烧录,打开串口软件,复位芯片,有打印输出 - q& N8 c/ {) P! X
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)
% d; J# V; m$ k6 u# X- ] - % f! ^. X8 }6 S% n! u3 k
- { n, L* L2 G6 |- j, j5 D. M" `
# z9 v2 o+ L3 t# X# x# C; l6 b0 U# w- if (Button == BUTTON_USER)
; n6 S/ B# C, m6 t3 P - 6 L& \/ c5 s1 M8 C8 y9 K6 _1 j+ F
- {
1 P% n# `2 y7 {6 N
z% v. n1 U2 K- UserButtonState = BUTTON_PRESSED;
' F+ q9 N& [1 e2 k& P - / U7 U& G; G& {1 Z1 W
- }
1 O% w5 @0 v. ]4 _/ q4 d$ N: K - ' |1 K3 Q4 k: k) ]
- }
复制代码
8 M% m p* o( d- #if 1" A$ ~1 d" R! s) O6 Y( D' I) C
6 }9 y( i; g$ S$ G) U0 G0 S; I0 Y- /* BUTTON BSP测试 */
# V! Q* q z4 |6 }3 R - : c: q1 m& |# ~: f
- if (UserButtonState == BUTTON_PRESSED)7 x' X# T- ]* F, ~1 R7 `# P
- : `# m+ _ I1 ~0 f
- {# N2 A5 p$ n9 x: W* v. |0 j! e! M
' u2 h$ j) W( G; t( R Q- UserButtonState = BUTTON_RELEASED;/ o% I# G* X6 p+ F) A
- : R B( J' N0 T$ k- [. p
- BSP_LED_Toggle(LED_GREEN);
7 k* Y# v9 P* N - 6 D- }. i" k- ~" U) n" d
- }, a; Z- H7 g/ D$ H
4 N+ h$ b. N) q- f3 f- #endif
复制代码 % X$ z% z* O& d2 {' N5 a$ Q
% j, b3 ]+ l/ A4 u5 ^( b8 qUSER按键按下后LED就会进行翻转
+ J0 i7 g9 w- T! Z9 ` x
模板工程(额外增加了define,替换了上文中#if后面的1): |