你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G0-Platformio+libopencm3-LED灯

[复制链接]
STMCU小助手 发布时间:2023-2-23 21:00
使用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) |( ^ 微信图片_20230222212856.png 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. 1/*** C+ U) ]/ R! Q( i) L# M2 v
  2. 2 * @file main.c6 l/ N/ W; C; N, p4 o9 u: j! ~
  3. 3 * @author MakerInChina (makerinchina.cn)
      y" \0 g0 E- @* E. T. B  V
  4. 4 * @brief ' F# V. B0 X  Z5 }( U2 o& i
  5. 5 * @version 0.01
    ! E/ P* x' l; \9 J" [2 e
  6. 6 * @date 2022-09-04* q$ r0 t5 W$ i5 G. [" o
  7. 7 *
    6 l% y0 \% g6 b5 C/ H0 E4 {3 a
  8. 8 * @copyright Copyright (c) 20224 Y; k- a9 p: q' j( e; Q" \
  9. 9 * ! r1 G4 H* q8 P/ L/ Y' n  m7 G
  10. 10 *// ~8 N' d# T, C% a
  11. 11
    1 q$ c" A! Y4 h" I9 v
  12. 12#include <libopencm3/stm32/rcc.h>
    ) a& V& G, g" r: x* V/ v; B
  13. 13#include <libopencm3/stm32/gpio.h>8 O5 Q7 _9 W$ j: I7 F% o
  14. 14& T) N$ z, h' h0 z9 C$ T; Y  j1 ^
  15. 15#define     LED_GPIO_CLK     RCC_GPIOC
    ' S( g  K& R% W2 M6 {2 B
  16. 16#define     LED_GPIO_PORT    GPIOC& h' \8 w& D& R
  17. 17#define     LED_GPIO_PIN     GPIO12
    ) d& C7 i7 L+ P- L
  18. 18$ G5 O+ H% l6 [3 Y2 |
  19. 19int main(void)
    4 G) B+ h& P8 U9 r1 g
  20. 20{1 p& f: P7 {, q. Z( L" r3 Q
  21. 218 z2 A. u# z' Y9 X2 ^" j, i, L
  22. 22    //system clock% g8 D2 C$ n" t, o
  23. 23    rcc_clock_setup(&rcc_clock_config[RCC_CLOCK_CONFIG_HSI_PLL_64MHZ]);
    - ?! q& x. X: u; R# v* v
  24. 242 ]- O2 d# ^( A. O- C
  25. 25    //gpio setting
    & I3 g+ r) b/ S: a( P- {& n& {1 w) p
  26. 26    rcc_periph_clock_enable(LED_GPIO_CLK);
    ( d' U1 I1 s) w6 K+ U
  27. 27    gpio_mode_setup(LED_GPIO_PORT,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,LED_GPIO_PIN);4 q  C0 b# _- @+ L
  28. 28
    & A8 S. Y& G- H5 I4 _2 Z/ S8 b5 ]( _0 @
  29. 29    while (1)
    % L, ?, b% J3 {4 u) V
  30. 30    {
    1 b6 u. H( t( R/ O8 i! t6 ^
  31. 31        //toggle gpio
    / t7 O) l) h7 h6 H# [8 G' C
  32. 32        gpio_toggle(LED_GPIO_PORT,LED_GPIO_PIN);
    ; g6 o. w; ~+ n9 x: ?
  33. 33
      y2 Z4 l& @: ~9 S& F" g. t; B6 x
  34. 34        //delay with 'nop' instruction, O. V& [3 U$ s- L- N; ]
  35. 35        for(int i=0; i<4000000; i++){3 h& I( ], R! h' f3 ?( Y5 ]6 [% z: V0 x
  36. 36            __asm__("nop;");
    1 g" S2 t- X2 A8 ~
  37. 37        }
    0 I3 U6 |5 [' y% H1 T
  38. 38    }
    . t6 ?- _8 H4 d: Q. v8 V# f9 ^& Z
  39. 39  b6 n6 `) D( S/ ?+ m7 M
  40. 40    return 0;: B  `0 G3 O  W+ q
  41. 41}
复制代码

6 B) I8 M( z6 h9 v2 @5 H+ }/ j4 \
  • libopencm3头文件引用:

    & K5 V0 d: ~' P9 p; L
  1. 1#include <libopencm3/stm32/rcc.h>
    3 O) u2 d. W( j9 R
  2. 2#include <libopencm3/stm32/gpio.h>
复制代码

4 @5 L! f; G1 j
  • 定义LED引脚
    2 F7 @0 j8 z8 u* Z
  1. 1#define     LED_GPIO_CLK     RCC_GPIOC
    : T, j% ~4 ~& f# F+ w2 O
  2. 2#define     LED_GPIO_PORT    GPIOC
    " d# q& n3 H' `' n% h6 N+ j5 v9 _
  3. 3#define     LED_GPIO_PIN     GPIO12
复制代码
& i4 Q* O4 g/ g% V! T0 ]$ I( e* _6 N- g
  • 设置系统时钟
    8 l0 u0 ]3 M5 `
  1. 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,还可以根据自己的实际情况选择如下配置:
  1. 1RCC_CLOCK_CONFIG_LSI_32KHZ,3 u( b' ~( r, j9 T) J# f
  2. 2RCC_CLOCK_CONFIG_HSI_4MHZ,6 x# m$ {- J5 W6 _
  3. 3RCC_CLOCK_CONFIG_HSI_16MHZ,
    ! i3 t. k5 G3 y# _1 p
  4. 4RCC_CLOCK_CONFIG_HSI_PLL_32MHZ,9 ?5 V2 a: }- U7 k. p
  5. 5RCC_CLOCK_CONFIG_HSI_PLL_64MHZ,3 I( S" @2 l" ?
  6. 6RCC_CLOCK_CONFIG_HSE_12MHZ_PLL_64MHZ,
复制代码
* X. _* R6 }9 `1 \3 i. W; Y. _$ u
这个在rcc头文件有相关定义:

: Q+ G$ `$ Y* \% c
微信图片_20230222213115.png
9 _; {& t) C) B; Q/ S9 T
  • 打开GPIO外设时钟
    # ^5 x7 M. O) M3 @
  1. 1rcc_periph_clock_enable(LED_GPIO_CLK);
复制代码
# R: g7 ~: D5 V. Y0 K  |
  • 设置GPIO输入输出和上下拉:

    ! Q4 v4 ~4 [# Y
  1. 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
  1. 1gpio_set_output_options(LED_GPIO_PORT,GPIO_OTYPE_OD,GPIO_OSPEED_MED,LED_GPIO_PIN);
复制代码

" `$ e$ ?+ k# F( X6 W
  • GPIO输出操作:

    / a, Y. P. f4 `+ I
  1. 1gpio_toggle(LED_GPIO_PORT,LED_GPIO_PIN);
复制代码
3 I) G- Q1 X2 c9 u9 ?3 y
其功能为翻转GPIO,还有其他输出操作函数:
  1. 1void gpio_set(uint32_t gpioport, uint16_t gpios);
    4 N7 m3 W" r) r; W
  2. 2void gpio_clear(uint32_t gpioport, uint16_t gpios);; d3 y/ t. M" [( N1 x
  3. 3void gpio_port_write(uint32_t gpioport, uint16_t data);
复制代码

5 M1 I+ ~+ e  W
  • 软件延时
    % {' \$ d; ^' O2 Z" Q. A
  1. 1for(int i=0; i<2000000; i++){
      k% N0 o2 I( r  L
  2. 2    __asm__("nop;");
    / Z- b" g9 m/ C! _9 S
  3. 3}
复制代码
. w8 v/ L" C; {$ d
使用指令 'nop' 进行延时操作

& M1 D, _4 F3 Y+ B& s
3 烧写验证
这里使用DAPLink SWD方式下载,因此更改项目配置文件 platformio.ini 文件如下:
  1. 1[env:MonkeyPi_STM32_G070RB]
    ' `# ^- `  m) B' ^
  2. 2platform = ststm327 l. [# p/ Z  O. K+ P0 j0 d0 h: x4 ?
  3. 3board = MonkeyPi_STM32_G070RB2 P( e6 q- X# _% c$ M! S! K2 W) F
  4. 4framework = libopencm3
    8 C8 W/ N. s$ w1 Y, \+ X( {4 k- t
  5. 52 b8 v: a, t6 b2 d, j- `! v
  6. 6upload_protocol=cmsis-dap
    2 _3 ^+ u2 k7 u9 M2 b+ x# a) y8 N
  7. 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
收藏 评论0 发布时间:2023-2-23 21:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版