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

Seeed STM32MP1开发板教程(2)GPIO的简单操作

[复制链接]
STMCU小助手 发布时间:2022-10-24 23:23
1. 用GPIO sysfs读写IO(Seeed的设备树不支持这种操作,仅作为介绍)6 S) X% U% a! j: @+ ?& g0 y# M
在Linux中,最常见的读写GPIO方式就是用GPIO sysfs interface,是通过操作/sys/class/gpio目录下的export、unexport、gpio{N}/direction, gpio{N}/value(用实际引脚号替代{N})等文件实现的,经常出现shell脚本里面。比如在shell中控制树莓派3B的GPIO12:3 s& O8 j+ ]  d$ w2 {- o- N* j- g* d+ i

, l/ \* X4 I, e  H, `- S' Q' v
  1. sudo su) s: ~  t) P* C5 O
  2. cd /sys/class/gpio5 [! a+ |7 ~7 I, H$ L9 |
  3. echo 12 > export; G$ ~9 ~1 v7 B1 J' ~
  4. echo out > gpio12/direction       # io used for output7 j3 }! I& c" X
  5. echo 1 > gpio12/value             # output logic 1 level
    0 |# [' R5 j: G+ M& |
  6. echo 0 > gpio12/value             # output logic 0 level
    9 K, S$ Z6 U# {, |3 ^$ b0 F
  7. echo 12 > unexport
复制代码
8 s1 L1 e$ |% i
基于GPIO sysfs interface封装的库很多,这里推荐vsergeev写的python-periphery、c-periphery和lua-periphery,python、lua和c任君挑选,通用性挺好的。0 z- r- r* x; [
& L- Y  p: @% e. S' ]/ Y* J
GPIO sysfs interface目前用的较广泛,但存在一些问题,比如不能并发获取sysfs属性、基本是为shell设计接口。所以从linux 4.8开始gpiod取代了它。/ Q& \( k) M: }- p
. S$ Q( c  G" K
Since linux 4.8 the GPIO sysfs interface is deprecated. User space should use the character device instead. This library encapsulates the ioctl calls and data structures behind a straightforward API.# i* ^, n+ \' J/ r/ _/ e+ \
! i) n/ D! U8 `3 W
2. 用libgpiod读写IO(Seeed支持这种操作)
% n: n" F( {9 Y, O: P
新的设计gpiod,GPIO访问控制是通过操作字符设备文件(比如/dev/gpiodchip0)实现的,并通过libgpiod提供一些命令工具、c库以及python封装。
+ g8 k) U5 N8 J; f) E5 y# i: d$ w
The new character device interface guarantees all allocated resources are freed after closing the device file descriptor and adds several new features that are not present in the obsolete sysfs interface (like event polling, setting/reading multiple values at once or open-source and open-drain GPIOs).
* ^2 }" O# i3 P; K4 V. v, m* Q/ A  w
, J& g0 S2 {/ @" d9 w: q' bUnfortunately interacting with the linux device file can no longer be done using only standard command-line tools. This is the reason for creating a library encapsulating the cumbersome, ioctl-based kernel-userspace interaction in a set of convenient functions and opaque data structures.% R1 q6 `9 g2 ~3 e( J6 z$ i
2 D/ z/ K: d, a7 j3 C! F% h
Additionally this project contains a set of command-line tools that should allow an easy conversion of user scripts to using the character device.8 x4 J8 M5 D. {( T1 m: c" r

3 X" @7 W0 t* h( t" ?4 X# j通过libgpiod提供的gpioset、gpioget、gpiomon可以快速的读写GPIO和检测输入事件。
6 T# H$ W+ [; R) y9 w1 B# |4 X; c/ ~" K1 Q5 `$ p  z* K& ?. w& x
  1. sudo apt install -y gpiod
    $ u' d# ~' a* G
  2. sudo gpioset 0 12=0
    , R8 z! T/ i# A* i7 X  F
  3. sudo gpiomon 0 12   # detect event on gpio12
复制代码

4 I+ Y$ T8 z" ~7 s& ygpiod由于比较新,用的人还非常少,虽说libgpiod里面有python封装,但还没有打包到debian stretch的仓库里面,所以用python ctypes封装了一份,在voice-engine/gpio-next,控制一个LED的python代码是这样:' B9 D; H  q3 x! u
! t) l2 m$ w: m8 u# q2 t
  1. import time
    7 Q7 H! s" U. @7 j5 f$ X7 }
  2. from gpio_next import GPIO
    3 B' [. p- O( s2 o
  3. # m  D% E0 j: Y0 H1 b
  4. LED = GPIO(12, direction=1)
    + F. H: {8 U: s  l1 X4 V
  5. for i in range(10):
    + @6 ]4 g: Q7 [1 }9 {- f
  6.     LED.write(i & 1)3 n5 y, C- K: D7 H
  7.     time.sleep(1)
复制代码
7 b2 ^3 n( z: u: v4 Y4 @* M+ N/ U
当然也可以通过C语言调用系统操作的方式控制GPIO,具体的方法参照我的这篇博客:
, {3 a8 A, Y& V0 E/ k- I$ \
" p3 z: d7 G8 P- j/ g用sysfs,或gpiod,都是用linux对GPIO封装的接口,封装之后的通用性好了,但性能会变弱。在Linux中同样也可以直接操作GPIO寄存器这里网上资源比较多且较为深入。笔者能力有限,所以在此不再叙述。2 m1 }, `- G  M
————————————————
+ d% O7 x! o" o& n( r0 I7 W版权声明:Argon_Ghost
* C5 x; t: o3 r& w  v3 P7 a$ I
1 ^1 |! H- x, v8 {" c+ A2 `
收藏 评论0 发布时间:2022-10-24 23:23

举报

0个回答

所属标签

相似分享

官网相关资源

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