|
开始正式测评前,需要准备一个基础的模板工程,后续的测评内容都在该工程的基础上修改
! q$ `) D1 r" @' m. D' w* c首先同步一下我的开发环境及软件 电脑: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 N' ~5 b! n: e( z r, }
一. 模板工程创建 打开CUBEMX,选择从开发板开始创建工程 通过左侧的筛选条件,找到U0开发板 弹出的人际接口默认是把LED、按键、虚拟串口都选上了,这些都保持默认即可(如果后续不要可以在CUBE中关掉) 可以看到LED、按键、串口都被配置好了,都不需要用户再来手动配置 来到Project Manager中设置工程名字和选择IDE,生成工程 生成完毕后,会弹出如图提示框,我们选择直接打开工程,就会直接自动打开keil 全编译,没有错误没有警告 下载选项中把烧录后自动运行勾上 下载也没问题,那么模板工程就创建好了(但是还不能直接使用,主要是串口还不能马上使用,还需要稍微修改一下,详见下面的BSP使用)
6 q5 [4 E, T. d6 ^4 F _) l; _二. BSP的使用 BSP的各个函数在stm32u0xx_nucleo.c中,需要调用什么函数可以去这里看 3 G/ C+ a7 ]; a8 n, X
2.1 LED 在文件中LED相关函数后初始化、去初始化、亮灯、灭灯、翻转、获取灯的状态 其中初始化已经由CUBE自动配置调用了,我们直接使用即可,自动生成的LED初始化函数调用如下 这边以LED的闪烁为例,这里用了on、off函数和Toggle函数两种方式实现了LED的闪烁 - #if 06 B0 V s6 q6 b3 X
' K' W# W ^+ \5 q! A* _- /* LED BSP测试--on、off函数 */
: F5 v1 Y4 |3 ]! [6 T
4 \: u* K7 j/ i- B- BSP_LED_On(LED_GREEN);
' U: I' c1 K {" ? m8 q8 U
- \% U0 F6 y8 ^/ V1 p. N8 b0 N- HAL_Delay(1000);
. y2 l" c+ u& V( \% \$ _ - ' E/ x( S. R% `# u
- BSP_LED_Off(LED_GREEN);2 I* b0 p* I$ J, G6 f! W
7 v( [9 S; \* i! P$ G+ {: r- HAL_Delay(1000);
% v7 S% x# e' { - 3 k# i5 M- e8 F- I- S* |
- #endif8 M2 H: v1 O5 K0 v1 Z+ f4 ^
8 X3 S- w& I! K: f+ U$ h- - z3 Q( ^3 q H( w; r4 T
' V2 a) |. W0 z# M Y0 ]( U- #if 1
( G7 g8 i5 I- Z& U$ S - : P- a1 a9 H, H. E7 N. D
- /* LED BSP测试--Toggle函数 *// v# a( m" B5 g9 j8 }0 h9 p
6 D% @1 V7 @6 u8 F2 o- BSP_LED_Toggle(LED_GREEN);1 [% [: w" g @0 Y& @3 y
. ^/ c3 O0 p+ y, {2 r! {- HAL_Delay(2000);( n# ?3 `: w% r* C/ `' p
- + e9 G7 s F2 w- H4 ?) U) @
- #endif<span style="font-family: 宋体; font-size: 10.5pt; background-color: rgb(255, 255, 255);"> </span>
复制代码 % E" D6 e7 |8 @" o9 i% Q9 |
2.2 虚拟串口 自动生成的串口的初始化函数调用如图 * b5 }4 Y- T: m6 Q% @. S$ N
虚拟串口主要是要做打印输出,一般使用printf,但是当前工程不能直接使用printf,需要做一下printf重定向 & t! T5 _- W( X- a) d Z$ ~$ Y
- int fputc(int ch, FILE *f)
( h0 }$ C s8 y6 S - M; q% B* c9 f, w: V
- {
' ^8 Q% q% w- C7 y; H: i
6 f$ j( [, {. P1 t. X E- HAL_UART_Transmit(&hcom_uart[COM1], (uint8_t *)&ch, 1, 0xffff);
9 ]! T) n2 V1 Y0 `! O; X
, Q. A1 b* r+ P7 j- return ch;& |+ }* c7 t. ]4 {
% W. k/ \8 e. }+ O' P7 X- }
复制代码 - s$ E1 {- h* l
Keil中开启一下Micro LIB 增加一下printf函数,测试一下他能否正常工作 - printf("STM32U0 printf test\r\n");
复制代码 编译烧录,打开串口软件,复位芯片,有打印输出 8 Z! i1 i& Q9 e
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 v& ~( ~; c! n) K
# y$ u9 K9 x4 f- {
. o( X0 M" R& T2 c6 J7 \: p* W
5 W' w8 `4 }: ~3 {0 |/ i" u" V- if (Button == BUTTON_USER)# s' q4 u6 h/ O, V4 ]
- ; J+ y% e% N4 P3 D0 E+ n
- {6 U% x" b. D, z2 E
$ k7 A. V9 c* G) g( x- UserButtonState = BUTTON_PRESSED;
0 H P3 M4 X1 k$ {- \ - 1 J% \ g( b# d' h4 X
- }" [! J( K- i: g
- ; k' k: j- r: Y4 m8 d6 e! j
- }
复制代码 ) j8 t9 q# z0 R* G' M
- #if 14 D0 f) R& N& t) ^( \
- ' P2 Q. J) @% d, O2 C8 q; K+ S
- /* BUTTON BSP测试 */6 j5 F. e/ e) L- e
- : H& \2 e+ B$ p1 I. m3 Y
- if (UserButtonState == BUTTON_PRESSED)
3 M3 N; H+ P! V) Y) A9 ^ - + s, K/ X& Z" W
- {1 x" V" k# D. F& W2 T0 _% a- p6 D9 X
- 8 i0 ?2 a) Y% B, s! H
- UserButtonState = BUTTON_RELEASED;
) W* ^0 q) m+ ~4 J& O - ! C6 h1 V) G/ ^2 ?
- BSP_LED_Toggle(LED_GREEN);' j: \! c8 {7 K F
- - j- S, g) F4 T9 h+ r- \
- }
& T1 E& h3 P6 q9 U8 j
4 A( W6 c1 C$ z* R$ Z2 v) S- #endif
复制代码 2 p4 f) ~$ N0 W
! Q" \7 k2 v3 ?6 `( D& pUSER按键按下后LED就会进行翻转
- i0 G3 w$ P5 J; I5 u
模板工程(额外增加了define,替换了上文中#if后面的1): |