使用Platformio平台的libopencm3开发框架来开发STM32G0,下面为LED灯示例。 . A5 |9 W- U/ `/ F
1 新建项目在PIO的Home页面新建项目,项目名称led,选择开发板为上一次建立的自定义开发板型号 MonkeyPi_STM32_G070RB,开发框架选择libopencm3:
. B$ Z, X( u9 e! g. z! j: s' M2 w
- O: K' F) |( ^
4 r( ~7 u# G/ X' y" t
" L8 R; N9 Y) { }5 U! [. e4 j6 c
9 `8 d" d' j! d* j5 V4 V8 Z2 LED灯程序在项目文件夹的src目录下新建文件main.c,内容如下: - 1/*** C+ U) ]/ R! Q( i) L# M2 v
- 2 * @file main.c6 l/ N/ W; C; N, p4 o9 u: j! ~
- 3 * @author MakerInChina (makerinchina.cn)
y" \0 g0 E- @* E. T. B V - 4 * @brief ' F# V. B0 X Z5 }( U2 o& i
- 5 * @version 0.01
! E/ P* x' l; \9 J" [2 e - 6 * @date 2022-09-04* q$ r0 t5 W$ i5 G. [" o
- 7 *
6 l% y0 \% g6 b5 C/ H0 E4 {3 a - 8 * @copyright Copyright (c) 20224 Y; k- a9 p: q' j( e; Q" \
- 9 * ! r1 G4 H* q8 P/ L/ Y' n m7 G
- 10 *// ~8 N' d# T, C% a
- 11
1 q$ c" A! Y4 h" I9 v - 12#include <libopencm3/stm32/rcc.h>
) a& V& G, g" r: x* V/ v; B - 13#include <libopencm3/stm32/gpio.h>8 O5 Q7 _9 W$ j: I7 F% o
- 14& T) N$ z, h' h0 z9 C$ T; Y j1 ^
- 15#define LED_GPIO_CLK RCC_GPIOC
' S( g K& R% W2 M6 {2 B - 16#define LED_GPIO_PORT GPIOC& h' \8 w& D& R
- 17#define LED_GPIO_PIN GPIO12
) d& C7 i7 L+ P- L - 18$ G5 O+ H% l6 [3 Y2 |
- 19int main(void)
4 G) B+ h& P8 U9 r1 g - 20{1 p& f: P7 {, q. Z( L" r3 Q
- 218 z2 A. u# z' Y9 X2 ^" j, i, L
- 22 //system clock% g8 D2 C$ n" t, o
- 23 rcc_clock_setup(&rcc_clock_config[RCC_CLOCK_CONFIG_HSI_PLL_64MHZ]);
- ?! q& x. X: u; R# v* v - 242 ]- O2 d# ^( A. O- C
- 25 //gpio setting
& I3 g+ r) b/ S: a( P- {& n& {1 w) p - 26 rcc_periph_clock_enable(LED_GPIO_CLK);
( d' U1 I1 s) w6 K+ U - 27 gpio_mode_setup(LED_GPIO_PORT,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,LED_GPIO_PIN);4 q C0 b# _- @+ L
- 28
& A8 S. Y& G- H5 I4 _2 Z/ S8 b5 ]( _0 @ - 29 while (1)
% L, ?, b% J3 {4 u) V - 30 {
1 b6 u. H( t( R/ O8 i! t6 ^ - 31 //toggle gpio
/ t7 O) l) h7 h6 H# [8 G' C - 32 gpio_toggle(LED_GPIO_PORT,LED_GPIO_PIN);
; g6 o. w; ~+ n9 x: ? - 33
y2 Z4 l& @: ~9 S& F" g. t; B6 x - 34 //delay with 'nop' instruction, O. V& [3 U$ s- L- N; ]
- 35 for(int i=0; i<4000000; i++){3 h& I( ], R! h' f3 ?( Y5 ]6 [% z: V0 x
- 36 __asm__("nop;");
1 g" S2 t- X2 A8 ~ - 37 }
0 I3 U6 |5 [' y% H1 T - 38 }
. t6 ?- _8 H4 d: Q. v8 V# f9 ^& Z - 39 b6 n6 `) D( S/ ?+ m7 M
- 40 return 0;: B `0 G3 O W+ q
- 41}
复制代码
6 B) I8 M( z6 h9 v2 @5 H+ }/ j4 \libopencm3头文件引用:
& K5 V0 d: ~' P9 p; L
- 1#include <libopencm3/stm32/rcc.h>
3 O) u2 d. W( j9 R - 2#include <libopencm3/stm32/gpio.h>
复制代码
4 @5 L! f; G1 j定义LED引脚 2 F7 @0 j8 z8 u* Z
- 1#define LED_GPIO_CLK RCC_GPIOC
: T, j% ~4 ~& f# F+ w2 O - 2#define LED_GPIO_PORT GPIOC
" d# q& n3 H' `' n% h6 N+ j5 v9 _ - 3#define LED_GPIO_PIN GPIO12
复制代码 & i4 Q* O4 g/ g% V! T0 ]$ I( e* _6 N- g
- 1rcc_clock_setup(&rcc_clock_config[RCC_CLOCK_CONFIG_HSI_PLL_64MHZ]);
复制代码 5 I6 e) H' k B; d! e- Q1 v* ~9 v
这个是设置为内部PLL到64MHz,还可以根据自己的实际情况选择如下配置: - 1RCC_CLOCK_CONFIG_LSI_32KHZ,3 u( b' ~( r, j9 T) J# f
- 2RCC_CLOCK_CONFIG_HSI_4MHZ,6 x# m$ {- J5 W6 _
- 3RCC_CLOCK_CONFIG_HSI_16MHZ,
! i3 t. k5 G3 y# _1 p - 4RCC_CLOCK_CONFIG_HSI_PLL_32MHZ,9 ?5 V2 a: }- U7 k. p
- 5RCC_CLOCK_CONFIG_HSI_PLL_64MHZ,3 I( S" @2 l" ?
- 6RCC_CLOCK_CONFIG_HSE_12MHZ_PLL_64MHZ,
复制代码 * X. _* R6 }9 `1 \3 i. W; Y. _$ u
这个在rcc头文件有相关定义:
: Q+ G$ `$ Y* \% c
9 _; {& t) C) B; Q/ S9 T
打开GPIO外设时钟 # ^5 x7 M. O) M3 @
- 1rcc_periph_clock_enable(LED_GPIO_CLK);
复制代码 # R: g7 ~: D5 V. Y0 K |
设置GPIO输入输出和上下拉:
! Q4 v4 ~4 [# Y
- 1gpio_mode_setup(LED_GPIO_PORT,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,LED_GPIO_PIN);
复制代码
4 ~/ s: z+ T3 \; Y: g设置GPIO输出选项:
+ o/ ~$ _/ e% @$ x2 S5 L. R9 x. k
- 1gpio_set_output_options(LED_GPIO_PORT,GPIO_OTYPE_OD,GPIO_OSPEED_MED,LED_GPIO_PIN);
复制代码
" `$ e$ ?+ k# F( X6 WGPIO输出操作:
/ a, Y. P. f4 `+ I
- 1gpio_toggle(LED_GPIO_PORT,LED_GPIO_PIN);
复制代码 3 I) G- Q1 X2 c9 u9 ?3 y
其功能为翻转GPIO,还有其他输出操作函数: - 1void gpio_set(uint32_t gpioport, uint16_t gpios);
4 N7 m3 W" r) r; W - 2void gpio_clear(uint32_t gpioport, uint16_t gpios);; d3 y/ t. M" [( N1 x
- 3void gpio_port_write(uint32_t gpioport, uint16_t data);
复制代码
5 M1 I+ ~+ e W软件延时 % {' \$ d; ^' O2 Z" Q. A
- 1for(int i=0; i<2000000; i++){
k% N0 o2 I( r L - 2 __asm__("nop;");
/ Z- b" g9 m/ C! _9 S - 3}
复制代码 . w8 v/ L" C; {$ d
使用指令 'nop' 进行延时操作
& M1 D, _4 F3 Y+ B& s 3 烧写验证这里使用DAPLink SWD方式下载,因此更改项目配置文件 platformio.ini 文件如下: - 1[env:MonkeyPi_STM32_G070RB]
' `# ^- ` m) B' ^ - 2platform = ststm327 l. [# p/ Z O. K+ P0 j0 d0 h: x4 ?
- 3board = MonkeyPi_STM32_G070RB2 P( e6 q- X# _% c$ M! S! K2 W) F
- 4framework = libopencm3
8 C8 W/ N. s$ w1 Y, \+ X( {4 k- t - 52 b8 v: a, t6 b2 d, j- `! v
- 6upload_protocol=cmsis-dap
2 _3 ^+ u2 k7 u9 M2 b+ x# a) y8 N - 7debug_tool=cmsis-dap
复制代码 % y7 Y; f# C4 i. o6 M; v4 V7 C% P: a
更改后,点击 platformio:Upload 按钮上传到开发板即可验证,按 ‘F5’ 可以进行调试。 . s5 u, \6 d& c/ o
转载自:MakerInChina.cn$ l5 B5 I: N1 J4 P7 J
|