使用Platformio平台的libopencm3开发框架来开发STM32G0,下面为LED灯示例。 # G4 f# G& Q3 F$ c) H! U
1 新建项目在PIO的Home页面新建项目,项目名称led,选择开发板为上一次建立的自定义开发板型号 MonkeyPi_STM32_G070RB,开发框架选择libopencm3: ' J& c4 i$ j% P- Q- S
: L1 ]5 v+ n* K6 j$ r# X
, P' \6 u: m( m- G) D5 V2 H3 n2 J
9 N2 D! S% S' |6 r% v* Z
6 m# a3 z. `) ?& H. Z2 LED灯程序在项目文件夹的src目录下新建文件main.c,内容如下: - 1/**, b% D7 {7 u3 k6 e2 R
- 2 * @file main.c2 j, R H( Z' n! n0 n+ j9 j
- 3 * @author MakerInChina (makerinchina.cn)8 [- C. Z' v E n& V K
- 4 * @brief r5 k& N& n2 X7 R
- 5 * @version 0.01
|6 A F' V! v, a( t8 B) P) G! F - 6 * @date 2022-09-04
8 u" ~4 Q+ G! j1 F0 F" ] - 7 * 6 c, m/ G$ `' {# A, H) Y6 W
- 8 * @copyright Copyright (c) 20226 O% X6 q p" L3 u) }
- 9 *
- _) h' V( r. H1 @( Y - 10 */# j% `7 t9 Q* C* |5 H K. p
- 11& K+ j( E1 |# H Q$ y
- 12#include <libopencm3/stm32/rcc.h>7 X+ F0 n( S# y: d
- 13#include <libopencm3/stm32/gpio.h>
8 e3 |: `6 c# q! Y - 14, f" e* H! k; L3 y" t; n
- 15#define LED_GPIO_CLK RCC_GPIOC
% T9 J. x j8 ?- ?' U) E - 16#define LED_GPIO_PORT GPIOC- j' L4 Z5 @. i. B+ J Z
- 17#define LED_GPIO_PIN GPIO12
5 I1 E" L5 b$ E; C. K6 q* P - 18! m1 t- y: K: G( ?, t/ E/ f
- 19int main(void)
$ U. C+ N3 \- Z" ` - 20{7 }$ g3 K9 A3 Y' C% v2 o
- 21
* ? l0 }8 @2 Q$ ?; q: F - 22 //system clock
$ W6 G5 R. T* }7 P - 23 rcc_clock_setup(&rcc_clock_config[RCC_CLOCK_CONFIG_HSI_PLL_64MHZ]);
" z0 U& Q& q2 ?" {5 Z - 244 y* |) [9 P# U$ V! M
- 25 //gpio setting
5 g( y2 z$ k9 ? - 26 rcc_periph_clock_enable(LED_GPIO_CLK);/ X# B3 N. K5 y) F$ m( S
- 27 gpio_mode_setup(LED_GPIO_PORT,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,LED_GPIO_PIN);6 |8 R# O! x- W3 P; a+ V
- 28
/ @9 U- l+ G' G9 `: k0 N" l( N - 29 while (1)
! \+ ?# a# X1 O% u - 30 {( p8 j1 V: `. ?5 y! W
- 31 //toggle gpio5 @" r \+ ?/ J& |+ l, l4 x
- 32 gpio_toggle(LED_GPIO_PORT,LED_GPIO_PIN);
. u7 S$ g) j% }& g. ^1 F1 a4 v - 33* G( g* m4 S8 C( T" L
- 34 //delay with 'nop' instruction' i* e2 C/ T- D. X! W7 _7 o+ D4 s
- 35 for(int i=0; i<4000000; i++){
" @1 p- J7 I: K' S - 36 __asm__("nop;");
1 [3 O! U1 E1 F R" b: v - 37 }
9 M% `% F+ [- X - 38 }, t2 \4 D: E% B2 P8 X& `' {$ y
- 39
. Q Y& R1 p; E& o+ s; E* I* b - 40 return 0;
8 @& n4 o" R8 o \! V4 P- l" Y* g - 41}
复制代码
: a4 J7 e- Z( l E8 b& b( C4 tlibopencm3头文件引用: ) @( Y2 Z2 ]) S8 p3 a+ q
- 1#include <libopencm3/stm32/rcc.h>
/ t) }, a8 K A, H - 2#include <libopencm3/stm32/gpio.h>
复制代码
. g1 _4 {+ |; R定义LED引脚 ' W8 r$ e7 {* Y( `2 ]) J3 ~
- 1#define LED_GPIO_CLK RCC_GPIOC
( p7 U, I' k. c. e, I, A, q - 2#define LED_GPIO_PORT GPIOC
3 b9 _1 [# q0 k: d7 R$ i - 3#define LED_GPIO_PIN GPIO12
复制代码 * y: G! P2 v8 L
设置系统时钟
7 @0 J- d5 K, ?/ ~
- 1rcc_clock_setup(&rcc_clock_config[RCC_CLOCK_CONFIG_HSI_PLL_64MHZ]);
复制代码
& M6 X5 c& O+ M3 w这个是设置为内部PLL到64MHz,还可以根据自己的实际情况选择如下配置: - 1RCC_CLOCK_CONFIG_LSI_32KHZ,; |9 l) S/ y& }& X9 a) d
- 2RCC_CLOCK_CONFIG_HSI_4MHZ,
% E) W+ j+ @( \4 U) ]! K - 3RCC_CLOCK_CONFIG_HSI_16MHZ,
4 K4 b; y, t8 b% x: l+ n - 4RCC_CLOCK_CONFIG_HSI_PLL_32MHZ,
% {$ W/ m* i9 }6 | - 5RCC_CLOCK_CONFIG_HSI_PLL_64MHZ,7 V0 T1 h! e5 j, o& b
- 6RCC_CLOCK_CONFIG_HSE_12MHZ_PLL_64MHZ,
复制代码 ) `4 Z3 i3 H% I# d" [4 \5 }5 s
这个在rcc头文件有相关定义: 2 E/ x+ ]3 T6 ^, O$ L
1 m& [, ^( w. R' J3 L) t
打开GPIO外设时钟 " L0 K2 W' S/ i' e+ t* L
- 1rcc_periph_clock_enable(LED_GPIO_CLK);
复制代码
' z" d! [4 x* d, q$ ^设置GPIO输入输出和上下拉: 2 J6 I, ]4 S* }, }% }; u4 }# d
- 1gpio_mode_setup(LED_GPIO_PORT,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,LED_GPIO_PIN);
复制代码
$ q: d) g3 j. H5 f5 z. k) w设置GPIO输出选项:
0 s3 n( G7 F1 @1 o9 A
- 1gpio_set_output_options(LED_GPIO_PORT,GPIO_OTYPE_OD,GPIO_OSPEED_MED,LED_GPIO_PIN);
复制代码
F# l, W7 ~" r3 P G1 D V- z @GPIO输出操作: 9 Y" ?: f/ h% }. S1 ^
- 1gpio_toggle(LED_GPIO_PORT,LED_GPIO_PIN);
复制代码 ( E: A3 Q, [; f; L0 m
其功能为翻转GPIO,还有其他输出操作函数: - 1void gpio_set(uint32_t gpioport, uint16_t gpios);
' ], k1 j( q3 U( p3 d/ j1 O0 C - 2void gpio_clear(uint32_t gpioport, uint16_t gpios);! d4 I& d+ }4 N0 g4 S
- 3void gpio_port_write(uint32_t gpioport, uint16_t data);
复制代码 & o+ X0 K+ m2 b, T- _ x5 P
软件延时 & O% P; J( X3 ?: N$ @# Y
- 1for(int i=0; i<2000000; i++){0 e4 p4 s0 o$ {, L% t4 {1 ?
- 2 __asm__("nop;");2 w9 K( H \8 W/ a
- 3}
复制代码
/ m8 r j5 n9 a! y! P! t" q0 M' U# `& G使用指令 'nop' 进行延时操作
" ?+ g# b# V9 B3 D- }; r1 y2 k 3 烧写验证这里使用DAPLink SWD方式下载,因此更改项目配置文件 platformio.ini 文件如下: - 1[env:MonkeyPi_STM32_G070RB]/ e5 M0 |' w h* q7 n, l+ x
- 2platform = ststm325 [+ o9 }6 N' i9 ?! T* f
- 3board = MonkeyPi_STM32_G070RB
' w1 m. Z- W6 z4 R" Z" @ - 4framework = libopencm3# t9 f: J% D M6 s- ]6 v p
- 52 I4 I6 ?+ s. |6 l8 X
- 6upload_protocol=cmsis-dap
2 }* z1 a% ^$ a- C: q& n1 I - 7debug_tool=cmsis-dap
复制代码 / L$ q- S$ B& D4 B
更改后,点击 platformio:Upload 按钮上传到开发板即可验证,按 ‘F5’ 可以进行调试。 $ ^( `; k% \$ e1 w# t
转载自:MakerInChina.cn
, e9 o9 l& T0 w2 `' u |