STM32G0-BSP
2 G- S$ n1 e0 S/ w
- v5 N! N3 D- Y' {/ d' ` m# N
# ?, a5 y! c; @! N0 h5 p
: Q% m, c" V! X: I( W0 M( Q hSTM32G0-BSP是基于STM32G070CBT6微控制器的板级支持包,它提供了一系列常见硬件模块、外设的使用例程,提供了一种轻量易用的时间片轮询结构,方便用户快速驱动模块、调用板载功能。
$ D, ~8 L% k8 x/ D" V: j
, ^+ j; z$ E8 c" t8 w& Z o+ u
6 R( s8 g6 m$ l/ L% w依赖) R8 x7 z7 `% ?. `0 j) Z
STM32CubeMX) |* t8 J* W! T. ?: j
MDK-ARM Keil5% g. J" {5 F4 P: q
示例
G' f/ S2 r2 t. w. ~, d \; z+ b0 e提供以下板级支持包和对应的使用例程5 s' L! ?; b% f/ t
. Z6 B& H5 H. |" @: p
( C2 b5 f5 g+ v+ i
- {2 `; f3 d2 J5 {8 B* E/ y
文件结构
1 `7 ]" ?: E; A" a板级支持包的工程文件分为两大部分,一部分是由STM32CubeMX自动生成的,一部分是自己添加的,以mpu6050模块为例,其工程文件结构如下
, \- K+ Y+ G9 \1 D- N R
% N" j7 [7 W) ^3 L, M- mpu6050
' `. y$ v% Y2 P% A: ? - ├─BSP, m% L$ s1 H1 |
- ├─LIB
0 e6 B$ O( J, J+ i& M - │ └─mpu6050
4 q5 ]8 Y! A$ H' q - ├─MDK-ARM
7 E! U( ^2 \6 g - ├─Drivers
( y' y1 H( ^0 c- K+ K - ├─Core
7 @9 Q# X; J2 g8 j2 Y$ ] - ...
复制代码 1 N/ P/ |; D9 R, i6 p# b
/BSP目录下是自己编写的板级支持包文件,对外提供各类板载功能接口;
7 ^5 [, @% k. w9 z5 L1 z
/ A9 e5 y, @: r8 y1 b5 f/LIB目录下是调用的外部库文件;
# y8 U9 S; k p" @/ ]+ }. P" _5 \! ^1 u9 k2 `# s2 M8 x1 e. X6 G& \
其余文件均为STM32CubeMX自动生成' W1 ]5 o0 Z m/ V! e1 m9 P* [
( V j# P& b, g* F& m2 S G; A: a& @
命名约定
% l! T( q7 ]9 S0 l& G3 ?$ r良好的编程命名规则有利于快速索引和匹配所需的对象,提高编程效率。该板级支持包编程命名规则与STM32HAL库类似,具体规则如下:
' h" }; ?+ E! ~ A9 ^" g$ `1 b- L
8 h, q! {4 J8 g0 k+ q6 @1、函数命名
: g# r O. ]6 w7 o( D6 G: F* r5 C3 m! v/ Z1 F1 q
函数命名包括三部分,板级支持包+模块名称+函数具体动作,两两之间下划线分隔,函数具体动作采用大驼峰式命名法. `( [7 N; P% X
4 Q; c4 I6 Y7 q& F$ x8 ]- BSP_LED_Init(); // led初始化
/ ~* L* W) u6 M9 i- \ - BSP_MPU6050_GetData(); // 获取mpu6050的数据
复制代码
z- s5 R. w! n9 h1 v/ e& Y3 c0 C2、类型命名; ~* f. x* c( `5 J7 e9 N2 f9 S
. W# u- ] O T6 V( i: C2 Q类型命名包括两部分,模块名称+类型名,两者之间下划线分隔,类型名采用大驼峰式命名法
6 E! s O: {* _# U, S- N' E# ]$ S3 [* @% Y
- // esp8266消息结构体, H- _5 _& f q( f2 B! z
- typedef struct {
3 |, f& m* P6 ]0 G) |0 ]8 K7 s - int len;% G; k/ n; c7 M% n
- uint8_t *buf;
7 t# r0 f$ q, T& }- F - } ESP8266_Msg;7 |" [# `& ]5 }& z2 `
- ( x8 @( [& s1 z
- // led类型枚举
5 F* l3 Q! f- l - typedef enum {
8 i3 \7 p& x- L0 f8 F0 \( C$ o - RED = 0,! `' [; a$ ~; F$ e2 V. z* ~
- GREEN,
! H K M# P# R- | - BLUE
4 \% G+ |; i' z4 J# ~& y+ I% @ - } LED_Type;
复制代码 8 E0 P) u E% d1 l7 j
3、变量命名/ r# H" H; _ ]* P# v5 H
* h9 C* A7 n9 C8 g% F变量命名采用全小写,下划线分隔
! Q$ `' r' m: K" \ `$ Z3 R" X" {
- float bat_voltage = 0; // 电池电压
复制代码
7 x1 H' q0 A: [0 y$ C- Y0 x4、宏和常量8 ~0 O# U4 `& ?
) c2 Z) Y' A3 Z0 y" }- M9 B( p: L宏和常量采用全大写,下划线分隔, x8 a% @4 V4 `8 i
5 J5 ~1 O; g- T/ T/ {3 Q& }- #define LED_NUM (2) // led的数量8 A. D+ d; F8 r
- const int LED_NUM = 2; // led的数量
复制代码 1 P% Z! N( X5 D6 J$ p+ A2 ?
轻量级时间片* ~; g/ H2 R+ s* W/ V8 z
该板级支持包提供了一个轻量、易用的时间片轮询功能,位于bsp_time模块中,使用方法如下
f1 t8 b, n+ p0 E, ] @6 M% E( C0 {
, T( P5 S6 q" h8 h0 b1、提供一个1ms的时基 k0 p A/ @& ^: l' s" C6 G
; O0 ?. h: S7 b- // stm32 systick 1ms 中断
/ F9 K! u# {" |( y- i+ S6 \9 n - void SysTick_Handler(void)( M$ L. q. z- x ]0 I: e
- {
( _+ z* x( o& L8 y$ J+ R, t - BSP_Time_IncTick(); // 时间片轮询时基
: V# ^* j4 q6 B+ F% N0 X* o - }
复制代码
_" R9 I2 |, F% }; J% Q8 X2、创建轮询任务
* u+ A) ?4 J" {$ I
' t/ b7 h$ T: d+ L6 M- int main(void)
/ r7 q' V8 A- L - {' X% m6 {3 _0 _/ ]( {/ c
- BSP_Time_Init(); // 时间片轮询初始化
4 D3 T& m: f1 q5 s6 J - while(1)6 K% x( J7 l1 J# ^, l% b
- {$ y* @! Y0 t. V5 P. @" U, m
- if(BSP_Time_CheckTick() ==1 ); M) H. }' X; c+ B$ J, R. ]
- {* y M" m- w# h
- // 500ms轮询任务,绿色led闪烁" S( O- T" }3 o. k) m' s" H" }
- if(BSP_Time_CheckSlice(500) == 1)
) D6 Y, o% y7 E0 k, k - {$ y3 v/ c; A# ?) c1 F( M
- BSP_LED_Toggle(GREEN);/ D3 f7 v% U4 ?7 y9 F$ H0 h
- }1 L7 b0 X: I( ?, [/ J4 j1 A' j
- // 100ms轮询任务,更新hc-sr04超声测距模块的测量距离+ Y( u; I3 I/ o' T
- if(BSP_Time_CheckSlice(100) == 1)9 h, B. M- i' d* t$ O+ t, I
- {: r0 p B/ ?* k" B
- BSP_HCSR04_UpdateDist();* U3 C a% S4 Q8 b/ e" }, q
- }
+ g b" V) h9 b0 p6 I( [ - // 1000ms轮询任务,获取并打印hc-sr04超声测距模块的测量距离
! d; L! \7 }# H# e - if(BSP_Time_CheckSlice(1000) == 1)
3 U9 |0 \8 D+ h6 |! u - {! o+ N5 Q v: d4 _/ q" V' }$ o
- float dist = BSP_HCSR04_GetDist();
4 l& l. {7 U" A" T - printf("dist is %.2f cm\r\n",dist). X) B3 C/ h. h3 ?
- }
9 a/ \/ r# ?- q6 y7 n5 I$ ]7 T - }
+ G$ z0 n* a3 Z9 z - }4 v; h: c: K$ F3 A) k
- }
复制代码
2 v# v5 x3 [( x* ~6 a* P* |8 |! P移植( C! u* f% n* @( g
利用STM32CubeMX生成工程,添加/BSP目录和对应的驱动文件,修改端口并添加少许驱动代码就能实现不同STM32微控制器的快速移植。
) K; {+ Y1 i& r" ` _# Z( @————————————————
. ? s1 F Q) z; x' x版权声明:周云川* p8 c3 v8 M8 ]( o
- G! M& f; o: o, m/ o0 v! c
5 a. I4 K2 G+ G$ { |