请选择 进入手机版 | 继续访问电脑版

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

STM32G0-Platformio+libopencm3-LED灯

[复制链接]
STMCU小助手 发布时间:2023-2-23 21:00
使用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
微信图片_20230222212856.png , 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. 1/**, b% D7 {7 u3 k6 e2 R
  2. 2 * @file main.c2 j, R  H( Z' n! n0 n+ j9 j
  3. 3 * @author MakerInChina (makerinchina.cn)8 [- C. Z' v  E  n& V  K
  4. 4 * @brief   r5 k& N& n2 X7 R
  5. 5 * @version 0.01
      |6 A  F' V! v, a( t8 B) P) G! F
  6. 6 * @date 2022-09-04
    8 u" ~4 Q+ G! j1 F0 F" ]
  7. 7 * 6 c, m/ G$ `' {# A, H) Y6 W
  8. 8 * @copyright Copyright (c) 20226 O% X6 q  p" L3 u) }
  9. 9 *
    - _) h' V( r. H1 @( Y
  10. 10 */# j% `7 t9 Q* C* |5 H  K. p
  11. 11& K+ j( E1 |# H  Q$ y
  12. 12#include <libopencm3/stm32/rcc.h>7 X+ F0 n( S# y: d
  13. 13#include <libopencm3/stm32/gpio.h>
    8 e3 |: `6 c# q! Y
  14. 14, f" e* H! k; L3 y" t; n
  15. 15#define     LED_GPIO_CLK     RCC_GPIOC
    % T9 J. x  j8 ?- ?' U) E
  16. 16#define     LED_GPIO_PORT    GPIOC- j' L4 Z5 @. i. B+ J  Z
  17. 17#define     LED_GPIO_PIN     GPIO12
    5 I1 E" L5 b$ E; C. K6 q* P
  18. 18! m1 t- y: K: G( ?, t/ E/ f
  19. 19int main(void)
    $ U. C+ N3 \- Z" `
  20. 20{7 }$ g3 K9 A3 Y' C% v2 o
  21. 21
    * ?  l0 }8 @2 Q$ ?; q: F
  22. 22    //system clock
    $ W6 G5 R. T* }7 P
  23. 23    rcc_clock_setup(&rcc_clock_config[RCC_CLOCK_CONFIG_HSI_PLL_64MHZ]);
    " z0 U& Q& q2 ?" {5 Z
  24. 244 y* |) [9 P# U$ V! M
  25. 25    //gpio setting
    5 g( y2 z$ k9 ?
  26. 26    rcc_periph_clock_enable(LED_GPIO_CLK);/ X# B3 N. K5 y) F$ m( S
  27. 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. 28
    / @9 U- l+ G' G9 `: k0 N" l( N
  29. 29    while (1)
    ! \+ ?# a# X1 O% u
  30. 30    {( p8 j1 V: `. ?5 y! W
  31. 31        //toggle gpio5 @" r  \+ ?/ J& |+ l, l4 x
  32. 32        gpio_toggle(LED_GPIO_PORT,LED_GPIO_PIN);
    . u7 S$ g) j% }& g. ^1 F1 a4 v
  33. 33* G( g* m4 S8 C( T" L
  34. 34        //delay with 'nop' instruction' i* e2 C/ T- D. X! W7 _7 o+ D4 s
  35. 35        for(int i=0; i<4000000; i++){
    " @1 p- J7 I: K' S
  36. 36            __asm__("nop;");
    1 [3 O! U1 E1 F  R" b: v
  37. 37        }
    9 M% `% F+ [- X
  38. 38    }, t2 \4 D: E% B2 P8 X& `' {$ y
  39. 39
    . Q  Y& R1 p; E& o+ s; E* I* b
  40. 40    return 0;
    8 @& n4 o" R8 o  \! V4 P- l" Y* g
  41. 41}
复制代码

: a4 J7 e- Z( l  E8 b& b( C4 t
  • libopencm3头文件引用:
    ) @( Y2 Z2 ]) S8 p3 a+ q
  1. 1#include <libopencm3/stm32/rcc.h>
    / t) }, a8 K  A, H
  2. 2#include <libopencm3/stm32/gpio.h>
复制代码

. g1 _4 {+ |; R
  • 定义LED引脚
    ' W8 r$ e7 {* Y( `2 ]) J3 ~
  1. 1#define     LED_GPIO_CLK     RCC_GPIOC
    ( p7 U, I' k. c. e, I, A, q
  2. 2#define     LED_GPIO_PORT    GPIOC
    3 b9 _1 [# q0 k: d7 R$ i
  3. 3#define     LED_GPIO_PIN     GPIO12
复制代码
* y: G! P2 v8 L
  • 设置系统时钟

    7 @0 J- d5 K, ?/ ~
  1. 1rcc_clock_setup(&rcc_clock_config[RCC_CLOCK_CONFIG_HSI_PLL_64MHZ]);
复制代码

& M6 X5 c& O+ M3 w
这个是设置为内部PLL到64MHz,还可以根据自己的实际情况选择如下配置:
  1. 1RCC_CLOCK_CONFIG_LSI_32KHZ,; |9 l) S/ y& }& X9 a) d
  2. 2RCC_CLOCK_CONFIG_HSI_4MHZ,
    % E) W+ j+ @( \4 U) ]! K
  3. 3RCC_CLOCK_CONFIG_HSI_16MHZ,
    4 K4 b; y, t8 b% x: l+ n
  4. 4RCC_CLOCK_CONFIG_HSI_PLL_32MHZ,
    % {$ W/ m* i9 }6 |
  5. 5RCC_CLOCK_CONFIG_HSI_PLL_64MHZ,7 V0 T1 h! e5 j, o& b
  6. 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
微信图片_20230222213115.png

1 m& [, ^( w. R' J3 L) t
  • 打开GPIO外设时钟
    " L0 K2 W' S/ i' e+ t* L
  1. 1rcc_periph_clock_enable(LED_GPIO_CLK);
复制代码

' z" d! [4 x* d, q$ ^
  • 设置GPIO输入输出和上下拉:
    2 J6 I, ]4 S* }, }% }; u4 }# d
  1. 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
  1. 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 ^
  1. 1gpio_toggle(LED_GPIO_PORT,LED_GPIO_PIN);
复制代码
( E: A3 Q, [; f; L0 m
其功能为翻转GPIO,还有其他输出操作函数:
  1. 1void gpio_set(uint32_t gpioport, uint16_t gpios);
    ' ], k1 j( q3 U( p3 d/ j1 O0 C
  2. 2void gpio_clear(uint32_t gpioport, uint16_t gpios);! d4 I& d+ }4 N0 g4 S
  3. 3void gpio_port_write(uint32_t gpioport, uint16_t data);
复制代码
& o+ X0 K+ m2 b, T- _  x5 P
  • 软件延时
    & O% P; J( X3 ?: N$ @# Y
  1. 1for(int i=0; i<2000000; i++){0 e4 p4 s0 o$ {, L% t4 {1 ?
  2. 2    __asm__("nop;");2 w9 K( H  \8 W/ a
  3. 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. 1[env:MonkeyPi_STM32_G070RB]/ e5 M0 |' w  h* q7 n, l+ x
  2. 2platform = ststm325 [+ o9 }6 N' i9 ?! T* f
  3. 3board = MonkeyPi_STM32_G070RB
    ' w1 m. Z- W6 z4 R" Z" @
  4. 4framework = libopencm3# t9 f: J% D  M6 s- ]6 v  p
  5. 52 I4 I6 ?+ s. |6 l8 X
  6. 6upload_protocol=cmsis-dap
    2 }* z1 a% ^$ a- C: q& n1 I
  7. 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
收藏 评论0 发布时间:2023-2-23 21:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版