如何在Linux系统中直接 *** 作GPIO

如何在Linux系统中直接 *** 作GPIO,第1张

方法/步骤

1

安装SD Linux系统

如图所示,先后将Arduino Software 1.5.3 (Arduino IDE)和SD-Card Linux Image下载到本机,Arduino IDE在后面查找GPIO与Arduino IO 之间的映射关系时需要用到。

如图所示,将SDCard1.0.4.tar.bz2解压后出现一个“image-full-galileo”的文件夹。

在MicroSD使用前需先将其以Fat32进行格式化,然后将“image-full-galileo”文件夹下地所有文件直接拷贝到microSD卡的根目录下。

进入Galileo

将MicroSD插到Galileo中,在路由器页面的已连接设备列表中会看到设备名称为“clanton”有线连接设备,找到其IP地址,然后中

Terminal(Unix和Linux,Windows可用Putty)中通过ssh进入Galileo,“ssh

[email protected]”。

有意思的是,这个在MicroSD中运行的Linux系统开启了ssh服务,并且root账号没有设置密码,可以直接进入。如上图所示,d出一对话框后输入 “yes”回车即可进入Galileo,出现下图中的 “root@clanton”说明这一步成功完成了

到这里,可能会有疑问了,Galileo板载也是有一个 *** 作系统的,microSD卡中也有一个Linux,如何保证现在进入的就是microSD卡中的系

统呢?在Terminal中输入“cat/proc/version”即可查看Linux系统版本,显示为“3.8.7-yocto-standard”,这就是前面下载的为Galileo定制的Linux *** 作系统,Yocto。

找到那个属于你的GPIO

下面就要开始这篇文章中的核心部分,也是最难的一部。找Linux GPIO 与 Arduino IO之间的映射关系!

如右图所示,在“/sys/class/gpio/”中有多大60多个GPIO,如何找出右侧GPIO与左侧Arduino IDE中对应的IO呢。

首先将0-13IO口全部设为“INPUT”输入模式

voidsetup(){//putyoursetupcodehere,torunonce:

pinMode(0,INPUT)pinMode(1,INPUT)pinMode(2,INPUT)pinMode(3,INPUT)

pinMode(4,INPUT)pinMode(5,INPUT)pinMode(6,INPUT)pinMode(7,INPUT)

pinMode(8,INPUT)pinMode(9,INPUT)pinMode(10,INPUT)

pinMode(11,INPUT)pinMode(12,INPUT)pinMode(13,INPUT)} voidloop(){

//putyourmaincodehere,torunrepeatedly: }

如图所示,左侧"pinMode(13,OUTPUT)"将13引脚变为输出模式,右侧gpio7变成out模式,因此gpio7对应的就是Arduino IO 13(pin13)

按照这种方法依次找出Arduino IO与GPIO之间如下的对应关系

GPIODigitalI/Ogpio11pin0

gpio12pin1 gpio13pin2 gpio14pin3 gpio6pin4 gpio0pin5 gpio1pin6

gpio38pin7 gpio40pin8 gpio4pin9 gpio10pin10 gpio5pin11 gpio15pin12

gpio7pin13

下面就需要来对上面找到的gpio对应关系进行验证了。“echo "out"

>/sys/class/gpio/gpio*/direction”为将gpio变为输出模式,“echo "1"

>/sys/class/gpio/gpio*/value”为将gpio输出高电平。然后就有了下面这段python程序,这段程序依次将

pin13,pin12,pin11,pin10四个引脚的LED点亮然后关闭,但由于python程序的执行效率问题,应该所有LED同时点亮有了延时

成为流水灯,如下图所示效果。这段程序在Linux系统的任意文件夹内均可。

importos,timewhileTrue:os.system('echo"out">/sys/class/gpio/gpio7/direction')

os.system('echo"1">/sys/class/gpio/gpio7/value')

os.system('echo"out">/sys/class/gpio/gpio15/direction')

os.system('echo"1">/sys/class/gpio/gpio15/value')

os.system('echo"out">/sys/class/gpio/gpio5/direction')

os.system('echo"1">/sys/class/gpio/gpio5/value')

os.system('echo"out">/sys/class/gpio/gpio10/direction')

os.system('echo"1">/sys/class/gpio/gpio10/value') time.sleep(0.2)

os.system('echo"0">/sys/class/gpio/gpio5/value')

os.system('echo"0">/sys/class/gpio/gpio15/value')

os.system('echo"0">/sys/class/gpio/gpio7/value')

os.system('echo"0">/sys/class/gpio/gpio10/value') time.sleep(0.2)

要想在linux下访问硬件,最好的办法就是在内核态下编程,将程序编译成ko形式,通过insmod导入系统即可。

你想在应用层编程,也成,好像是直接可以访问底层IO的。但说实话,还没第一种方法方便。

内核态编程,加点头文件,代码里加点标准的声明和初始化,再写个非常简单的Makefile,齐活。

实验目的:本程序主要实现一个简单的流水灯程序

即轮流点亮C口的8个灯(先点亮RC0,再熄灭RCO点亮RC1。。。。)

硬件要求:拨码开关S2全部置ON。

#include<p16f877A.inc> 调用头文件

__CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC

芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡

**********************用户寄存器定义********************

count equ 20h 移位次数寄存器

del_va1 equ 0ffh 外层延时参数

del_va2 equ 0ffh 内层延时参数

org 00h 程序人口地址

addlw0ffh

**********************主程序开始***********************

main

nop ICD所需要的一条空指令

clrf PORTC 先清楚C口所有显示

banksel TRISC 选择I/O口方向寄存器所在的体

clrf TRISC 设置C口全为输出

clrf STATUS 返回体0

movlw.8

movwfcount 装载循环次数8(C口共8位)

bsf STATUS,C置进位标志位为1,因循环移位是带进位循环的

loop

rlf PORTC,1 C口左移1位

call delay

call delay

CALL delay 调用三次延时程序(保证亮度,以及流水灯闪烁速度)

bcf STATUS,C清0进位标志位(永远只有一只LED亮)

DECFSZ count,1 判断是否一轮循环结束

goto loop否,继续循环移位

GOTO main是,程序重头开始

***********************延时程序*************************

delay

movlwdel_va1 延时程序外层参数

movwf30h

movlwdel_va2 延时程序内层参数

movwf31h

decfsz 31h,1

goto $-1

decfsz 30h,1

goto $-4

return

********************程序结束****************************

end


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8313945.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存