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

STM32WL开发之LORA评估板上通过GPIO控制LED

[复制链接]
STMCU小助手 发布时间:2022-10-20 14:26
STM32WLE5的GPIO介绍; p! [. s; e! R) B% h# r
# ]; z4 T- }& j  C5 X1 x6 E8 H
STM32WLE5引脚说明
* Z. U* Q" p3 N' g6 o' X' L3 h
# L. u  d2 p: C# |
GPIO是通用输入/输出端口的简称,用于感知外界信号(输入模式),控制外部设备(输出模式),是STM32WL的一种外设,与芯片的大部分引脚直接挂钩。这里的重点就是,GPIO一定是程序可控制的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。$ T3 C" Q! l4 h- J

+ v5 n6 v# I& g# ]STM32WLE5CB芯片为48脚芯片,如下图所示:" G* C& u  K! L) r# f6 t

& Y6 |$ c5 K; P 1a8513aaa59b4a989404ceed78c470ab.png ) a! z* s* y+ x5 F6 n

/ \( j5 I" y3 Z1 O由上图可知,并不是所有的引脚都是GPIO引脚,STM32WL的 引脚可以分为下面几类:  f3 ?* u" L$ \* }
1.电源引脚:引脚图中的 VDD、VDDA、VBAT、VDDPA、VDDRF 等都属于电源引脚。
1 ^+ _1 y$ t5 s9 t( t2.晶振引脚:引脚图中的 PC14、PC15 和 OSC_IN、OSC_OUT 都属于晶振引脚,包括主晶振IO和RTC晶振IO,不过它们还可以作为普通引脚使用。1 f1 z3 c1 q8 K
3.复位引脚:引脚图中的 NRST 属于复位引脚,不做其他功能使用。
  F6 U8 c. ~2 {4.下载引脚:引脚图中的 PA13、PA14、PA15、PB3 和 PB4 属于 JTAG 或SW 下载引脚。不过它们还可以作为普通引脚或者特殊功能使用,具体的功能可以查看芯片数据手册,里面都会有附加功能说明。当然,STM32WL 的串口功能引脚也是可以作为下载引脚使用。
2 T, b! g' q# i1 d5.BOOT 引脚:引脚图中的 PH3-BOOT0属于 BOOT 引脚。
9 j! M; J. v9 r
以上五部分IO组成的系统我们可以称为是最小系统。
" i% o& \8 ^! H& ]
9 G8 t2 `' O+ j( w- P+ wGPIO 引脚:引脚图中的 PA、PB、PC等均属于 GPIO 引脚。从引脚图可以看出,GPIO 占用了 STM32WL 芯片大部分的引脚。并且每一个端口最多16个引脚,比如 PA 端口,它有 PA0-PA15。9 l* d+ _2 W; e- b3 L
8 X0 m; M) ]( {1 ~! Q
STM32WL的大部分引脚除了当GPIO使用之外,还可以复用为外设功能引脚。一般来说其用途可以做如下划分:
, S0 e( d2 ?* W, D" ~; l/ O# w1.专用器件接到专用的总线上,比如I2C, SPI, SDIO, FSMC, DCMI等这些总线的器件需要接到专用的IO上。: X9 u+ S- t+ f: J5 H' g
2.普通的元器件接到GPIO上,比如蜂鸣器,LED,按键等元器件用普通的GPIO即可。
, I) T/ n' |/ }- l! E; s6 H3.如果还有剩余,可以根据项目需要引出或不引出均可。

+ @; w5 H( t; Y, F7 V! U/ D  u; E: e1 J' |1 p. u" ~
那么,具体每个引脚的功能信息,可以看下图。
, o- O/ S; |5 U1 T! {3 k/ ^5 S3 r" ~) W/ i2 f( h5 j! q  J& W
628a5c37bc0044e2a218572c46968d37.png 3 B2 w  A; t& Q' V: |( q( Y
) F* t9 j7 s) s6 W/ O) i/ ~
e30c35607ad94c5a9b44dac94b7d89fa.png 4 c: ~1 }. O9 P+ P- C2 v3 X% u
( s9 C6 E7 \; {4 ~* L
8c4ca43c104d480e84c237db985b4230.png . F) D& J3 S: v2 X& @* J" S
$ g! a, g6 U/ Q- q
e38547df944f4df69f204865d5af37d4.png
2 Y% a/ K7 ~0 x- O$ v
& m* k0 A/ c$ X+ a) W1 s d697405a48aa46db81781719df0cdb42.png , b1 }. [/ o* @) z: g; e
2 o; F9 }; A& F* O4 w8 @* t# E
8433d0a17f224f95a7dd2500b8067510.png ' n; a  ~3 ?" n% Q7 f& a

0 n( l3 P+ g& G  X如上所示,从数据手册中我们可以获取引脚的名字、引脚类型、引脚容忍的电压值和引脚复用功能等信息。" M( x( ^1 C5 z+ k
2 F0 U8 g8 \7 ^% f2 L
GPIO功能框图$ P& j9 ?4 @& Z1 v& k( d3 `2 A
7 V2 E8 `( M+ R% r
每个GPIO内部都有这样的一个电路结构,这个结构的功能原理网上介绍的很多,这里就不再赘述。7 Y* i/ i6 F( L7 H
. S: Z6 j& t- k. p9 c6 s" W3 j
5173be1017564d54972e6dd80064327d.png
9 B5 W+ f9 d* g* N' ?& @: }( {3 V: ]; l. s- I$ _7 F2 C

$ K* L) E$ X* L* H# g# hGPIO相关配置寄存器1 V9 K4 x7 N4 L
$ i  i' L% W) r7 ~3 y! k
每组GPIO端口含下面10个寄存器,它们可以控制一组GPIO的各个IO口。
* I! J. |# w3 q3 O; a; m1.一个端口模式寄存器(GPIOx_MODER)1 r" `# Z7 v" Y9 L
2.一个端口输出类型寄存器(GPIOx_OTYPER)6 G' s6 T7 h  q4 i+ }' N
3.一个端口输出速度寄存器(GPIOx_OSPEEDR), V1 y% h9 ?8 c/ H
4.一个端口上拉下拉寄存器(GPIOx_PUPDR)$ S- P5 o% w* T+ B+ C. d! j5 M
5.一个端口输入数据寄存器(GPIOx_IDR)& `1 |; ?$ [) X; z, R
6.一个端口输出数据寄存器(GPIOx_ODR)
- B: A  h/ @' W- u7.一个端口置位/复位寄存器(GPIOx_BSRR)
' D) a0 @5 t8 s, D6 j$ E: j# W8.一个端口配置锁存寄存器(GPIOx_LCKR)
( A5 ^& q' v% Z9.两个复用功能寄存器(低位GPIOx_AFRL & GPIOx_AFRH)
4 f" G1 R" \' u3 u
4 _0 D( r* C( b3 U下面介绍一下本文需要用到的两个寄存器:

$ Z$ G! T' M+ e6 A( u% W$ S9 a- K& n! Y7 X4 R! ]* h) a% Y5 u
1、GPIO端口模式寄存器
7 R$ r8 S8 X& ~2 m) N, i* F9 a# O! z; y
查看参考手册上的GPIO端口模式寄存器,如下:$ N. D/ F% S: q" S5 V
3 {. y5 [- ]4 ^2 X1 w) `
1689ffe2b8c947af8bb0efddff23b5bd.png + w/ Y- ^8 l, @  R, V6 W
* T1 G# `8 p" F: Z6 m
       由此可知STM32WLE5支持四种工作模式:0 Z$ z- t  M7 B9 W: k* s% S3 N
/ h% `: Z/ _: g1 |- ]3 _% e  K
       00:输入
  M+ [; B0 d" R9 Y* p
' L3 C$ t6 N+ B- {- s1 D1 D       01:通用输出模式
- d2 ~8 s! l: h% v' T- A/ _7 v! o: {4 C! s, t
       10:复用功能模式
* Z' a+ M1 j3 Y! g
3 D3 R0 j  |0 }) L       11:模拟模式(复位状态)
3 e# ?, [. {% l# ]6 x" k, N$ C, {. M0 l
2、端口输出类型寄存器
6 `1 K0 T8 E7 D. f3 O
$ r" ~/ \2 w1 \, B, H+ {4 H# O2 g查看参考手册上的GPIO端口输出类型寄存器,如下:
1 v- d: A7 ]5 c, ?+ S$ z+ E5 f( o$ U
8971b568070e46c6aa2995bbd390ef98.png
8 B! i! B- U* m. X% C1 K( X9 x- k/ V+ O8 c; K
由此可知,输出类型分为:+ s, H9 f! v3 Y# X' @1 X: R' }. U

2 ?: y1 l& Y! N1 C  W0:推挽输出(复位状态)
+ E8 Q1 g' E# k2 Y& v. J) E, {3 Q4 @
1:开漏输出, q6 u' t- }0 b. E) j% r  Y

+ P' \- [3 t: ~% t
. p; ?' X- v% ?5 X4 @2 B6 U2 k
基于GPIO控制的点灯程序设计
) Q9 M6 X$ M% L8 ]& K7 x" t
$ C! r1 S+ p/ g上面已介绍了GPIO的相关知识,本部分将基于LM401评估的设计及SubGHz_Phy_PingPong例程,介绍一下点亮LED灯的实现过程。% o2 L7 [1 Z" x; ?. @
( x3 X# }- [! b/ S
系统时钟配置
0 o  J6 n; g# P6 z9 z& F/ F
' u, R- |& |# M% K. k  W/ H2 n' L作为低功耗处理器,STM32WL一般用MSI时钟作为系统主时钟,默认使用最高的48MHz频率。配置如下:) i" L% X7 n% [- q* b5 k
% V- p1 q, Q6 o5 X5 k
681122528b574d6489eb2ca1612357f8.png ! l# h5 K& x5 E1 L

" w  O: D1 C9 o" M0 {* w6 NPS:这里配置LSE时钟,主要是为RTC使用,本例程中的HAL_Delay()函数也有使用。; |9 t) W$ ~2 @$ @$ x
# v# F( Z. ]# I+ u9 s# O
6 Q: y4 c3 n" Z$ h: h9 ?# }+ }
GPIO端口配置2 Z5 _2 i2 z- ^  k
# q. Q, K0 i3 Q+ [1 }
由开发板的原理图可知,LED灯的设计连接如下:* _2 v1 X7 j* `* N1 ?
% H  k: D0 w5 B7 z% Z
2748d9121e254232b70ad046ae68b8c3.png / h" k( Q5 U8 E" K
' [/ M/ _0 |4 C9 Z0 v2 L
看上图,开发板上带了三个LED灯,分别连接到GPIO的PB3,PB4, PB5端口。" c  `! @$ s7 T4 @
" Z, l6 F) Y' p/ J1 g  F; M
本文以点亮LED1为例,初始化PB5端口。SDK中的LED灯初始化函数是BSP_LED_Init(), 具体实现如下:5 D/ f4 j5 E6 H3 _+ r0 i
- D8 L4 N' u# F( P" f( H1 Q- a1 E
22f49d38660d45089cb1e76b74918e5d.png
* |5 o, a( ~3 a& w0 ^2 J  }3 K+ W; R' h$ D7 |
LED闪灯程序% h4 M7 g3 A1 S6 ]/ \6 q8 D

6 k, j: t( V( f7 `7 A' d本文中设计一个LED灯每隔500ms闪烁的程序,那么SubGHz_Phy_PingPong例程中的具体函数调用及实现代码如下:
! I" Z6 l) Q$ P( b  D% G! ]4 W
7 \- A6 H- R+ K8 H/ a( n bec9f0cf005d47c4bc9bf1cec38202df.png
7 |) {" `$ x2 e2 l/ Z$ O  F- \+ p8 ~- G& f/ l
以上就是基于开发板SDK实现的普通GPIO控制LED闪灯的程序。
% n$ g, Y  g, o8 V# y8 r* I  d: W3 P9 z! l0 ]# l
闪灯的实现方式有两种,一种就是上图中直接调用LED状态翻转函数实现,具体实现细节如下:
& S7 o3 [  k# n+ [4 v6 ]: L
1 G* z2 U' c* h+ b 75557f5b76394a7b8cda5d8a9067ecfd.png ; n( ]' i. o/ h: g! A
0 a0 o& d6 @# v! Y5 f
另一种是直接调用GPIO的Write函数,分别写入1或0,以实现LED灯的亮或灭。比如:
' r. J( b( g% O$ ^# P- P" A/ x& O
写入1的调用是:6 V$ X# N1 X! ]) k+ c8 ]$ [" f) r

" f4 \/ m& X2 l+ jHAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);' b5 C9 o0 ]$ Q* g" @1 Q0 `/ W

$ l: J/ O, c- d* O* f9 g写入0的调用是:
$ @) A5 Y) f2 I) b7 o
  t# q3 k2 q, ?- a( BHAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
7 J! [+ v& t# {9 i2 ?9 @. ~: B, d" I1 S

4 Q8 R  Q( w3 G) t固件编译与烧写测试2 r. _+ g% C6 a# p/ \  l
程序编写完成,按下图所示,点击“编译”和“下载”图标即可完成相应的固件编译和烧写工作。烧写完成即可看到蓝灯闪烁的效果。/ h0 @8 b8 i/ a. o

( Y7 `: M: ^) W, X9 D; g7 v a8ee4a9ccc4c461593d028e22c2dd3c6.png 4 f9 Z) ^- @% \8 f
& b8 I9 I2 M. e* d1 r# I
如果烧写失败,请检查如下设置是否一致:
9 H2 M: ^" |/ Q. ^9 V8 G! n. b, m/ e3 Q& i
e281aa2ad4b347ee8ff1789c9c660bd1.png
1 F4 y: u, |$ _1 @7 Q' q$ }
8 r$ M" G% p3 j- U e74798fad021485a937e8745d17d1d1e.png ) d, v/ t7 }' Y+ r8 z1 i
' E1 o+ N+ I4 @& W- ^
————————————————
$ Q: F4 I# @6 O. v7 N: G版权声明:enchen" [$ z9 F! Q4 G3 o" M

6 G) v7 |  [3 Q$ ^* _1 J+ b' v& K# U% Q2 ?) _$ c% M+ W( k
赞 收藏 评论0 发布时间:2022-10-20 14:26

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版