|
开始正式测评前,需要准备一个基础的模板工程,后续的测评内容都在该工程的基础上修改
" J% }$ X+ J% k9 j首先同步一下我的开发环境及软件 电脑:Windows 10 64位 STM32CubeMX版本:6.11.1 STM32CubeMX中U0 Pack包版本: 1.0.0 Keil版本:5.37.0.0 Keil中U0 Pack包版本:1.0.0 ! z6 l7 R& @/ C5 k2 t
一. 模板工程创建 打开CUBEMX,选择从开发板开始创建工程 通过左侧的筛选条件,找到U0开发板 弹出的人际接口默认是把LED、按键、虚拟串口都选上了,这些都保持默认即可(如果后续不要可以在CUBE中关掉) 可以看到LED、按键、串口都被配置好了,都不需要用户再来手动配置 来到Project Manager中设置工程名字和选择IDE,生成工程 生成完毕后,会弹出如图提示框,我们选择直接打开工程,就会直接自动打开keil 全编译,没有错误没有警告 下载选项中把烧录后自动运行勾上 下载也没问题,那么模板工程就创建好了(但是还不能直接使用,主要是串口还不能马上使用,还需要稍微修改一下,详见下面的BSP使用) & O& F7 M/ Y1 [. t3 ~9 h+ O
二. BSP的使用 BSP的各个函数在stm32u0xx_nucleo.c中,需要调用什么函数可以去这里看
5 i) C6 O+ |- _4 F. d3 y2.1 LED 在文件中LED相关函数后初始化、去初始化、亮灯、灭灯、翻转、获取灯的状态 其中初始化已经由CUBE自动配置调用了,我们直接使用即可,自动生成的LED初始化函数调用如下 这边以LED的闪烁为例,这里用了on、off函数和Toggle函数两种方式实现了LED的闪烁 - #if 0
) k$ ?+ T; Y4 u% m. J& O% a
6 U3 j- B8 E: g" ?- /* LED BSP测试--on、off函数 */% g6 d1 K D9 M3 ?7 u; o8 G6 O! K
- F- z! i# `5 c" W
- BSP_LED_On(LED_GREEN);' V# U* \: G" U- P# M: v
1 G8 o0 @, s3 _1 l: A" M6 M- HAL_Delay(1000);" [/ A9 M! W6 b
/ [, A ?$ x g! w: y- BSP_LED_Off(LED_GREEN);8 {; g* Y, a: \4 J) L: {& Y
4 ]4 {& B* ? C5 s, E- HAL_Delay(1000);% W: u5 R" f6 c
- $ Q) H7 O9 T9 `( y+ W: k4 T n& o
- #endif
" Y7 x8 ^" |& W3 R! C
, y i1 [7 Y5 I-
: _* \/ D: ^$ w1 f
' K: } ~7 q |+ t6 a- #if 1
! i9 f* w1 S; Z+ K( Z1 N - . S! t0 J y' A x1 v
- /* LED BSP测试--Toggle函数 */! i, l; r3 H0 c' _/ Z3 m
+ m ?' z' n! Z' l9 M9 B: s- BSP_LED_Toggle(LED_GREEN);5 h U. m. ]/ f" s) ?6 {; o
2 V; h W5 \# P$ }' X- HAL_Delay(2000);7 g. }5 M$ b4 D2 k5 S# L8 `. \
- + d/ y* q% ~# z
- #endif<span style="font-family: 宋体; font-size: 10.5pt; background-color: rgb(255, 255, 255);"> </span>
复制代码 . h7 T4 d* @+ W0 ~# R
2.2 虚拟串口 自动生成的串口的初始化函数调用如图 ! g: ~) v& y1 j4 r
虚拟串口主要是要做打印输出,一般使用printf,但是当前工程不能直接使用printf,需要做一下printf重定向
& r0 u+ `$ `# T2 I4 y& K7 Z# T- int fputc(int ch, FILE *f)
. X2 y( u) s2 O
) M! Y8 L2 W+ z9 H' \" W( m- {
+ j4 e2 `' N z4 C! |3 ` - ! M$ I5 M R5 Z, O# g! S
- HAL_UART_Transmit(&hcom_uart[COM1], (uint8_t *)&ch, 1, 0xffff);1 g$ P, t9 O. ^+ Q& m: o5 G4 \$ ~
- % g* [+ x/ _$ g0 V
- return ch;
/ O! _. M. c/ R) R6 T+ a" a
; g, R! t* h# k; O6 X* w* t9 L- }
复制代码
/ s1 u) y' G" X: f! Q8 OKeil中开启一下Micro LIB 增加一下printf函数,测试一下他能否正常工作 - printf("STM32U0 printf test\r\n");
复制代码 编译烧录,打开串口软件,复位芯片,有打印输出
4 n9 h9 R' h5 G) z: x2.3按键 BSP默认是把按键做成了中断触发,stm32u0xx_nucleo.c中有一个叫BSP_PB_Callback的虚函数,当按键按下后就会调用这个函数,用户就只需要关注实现BSP_PB_Callback,在这里面处理按键按下后的业务 - __IO uint32_t UserButtonState = BUTTON_RELEASED;
复制代码- void BSP_PB_Callback(Button_TypeDef Button)
" a) w! \/ _. u- ~& b
- m% Z8 V; }5 V, k, k! E- {6 p" v* d2 {; S. b( x
- 6 M0 \2 g# j1 S+ y
- if (Button == BUTTON_USER)( t7 Q3 C9 ^4 @7 m4 z& E, ~
8 t/ B; l! ^- w2 @- {
3 U4 N. i! X5 s6 x2 r# F# v# c& Z3 N - 6 F+ A& O, k4 z8 G" U8 ]
- UserButtonState = BUTTON_PRESSED;6 I, s0 z9 m* D1 ?( |9 ~% X
- 7 X; U r/ n! Q, |; g
- }) k& b* W3 W9 {( \7 K3 q' O
- + j+ d+ T& \1 ^1 L& q6 _
- }
复制代码 # u3 j2 {" o) c' ]. \& c9 p
- #if 1
. e/ X f' N0 j9 l$ z% v - # i$ i7 j0 p. ^* ~1 s3 o
- /* BUTTON BSP测试 */- F/ I# D7 d. t$ G2 ]
$ U9 M" U: _0 j7 P( }) a. Y- g- if (UserButtonState == BUTTON_PRESSED)
3 Y) i- t7 X6 G% p - 7 O2 ]% J1 q9 y" [, W+ ]' T* k/ I3 L% G
- {
% [/ \# e- ~* ~. O) e
. ]! ^+ [' Z4 V! [; Q; E, A- UserButtonState = BUTTON_RELEASED;
/ e& J% }: ]6 h l' l) m' v - $ y [& K. ^$ ^! r9 @
- BSP_LED_Toggle(LED_GREEN);7 J4 M6 V8 P# P
" u- o8 y& Q# P- }
3 n3 X/ {0 j2 ~, p' g+ u% T/ P. j - , Z1 s" d1 k, k7 B& m- k
- #endif
复制代码
: z) R. {% o, g4 V% p. ], @: R9 Z9 n8 X. k$ h
USER按键按下后LED就会进行翻转
/ E2 G$ w( e# [" C( @
模板工程(额外增加了define,替换了上文中#if后面的1): |