Orange PI GPIO控制详细教程

合集下载

GPIO用法及应用流程

GPIO用法及应用流程

GPIO用法及应用流程(也含其他设备的用法和配置)(GPIO用于STM32的IO处电平、信号的输入输出)1)定义一个GPIO结构体GPIO_InitTypeDef GPIO_InitStructure; (为了向GPIO外设内写数据)2)开启GPIOx口的时钟外设:(可以一次设置多个用(。

|。

)形式)RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOx,ENABLE);——GPIO配置时都是用APB2,也就说这个语句在GPIO中就是这个样子。

3)选择引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;4)设置GPIO输出模式GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;(1)浮空输入:In_Floating(2)带上拉输入:IPU(In Push_Up)(3)带下拉输入:IPD(In Push_Down)(4)模拟输入:AIN(Anolog In)(5)开漏输出:OUT_PD(OD 代表开漏,既Open Drain,OC代表开集,Open Collect)(6)推挽输出:OUT_PP(PP代表推挽式,Push_Pull)效果例:三个灯轮流亮每刻有且只有一个灯亮(7)复用功能推挽输出:AF_PP(AF代表复用功能,Alternate-Fuction)(8)复用功能开漏输出:AF_OD5)设置引脚速率GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;6)调用库函数初始化GPIO(注:每次只能初始化一个引脚)GPIO_Init(GPIOB, &GPIO_InitStructure); (如果要控制其他引脚,重复上面的3和6有时也会用到4步,总的来说配置一个GPIO至少要有1—6步)另外:GPIO_SetBits(GPIOx, GPIO_Pin_i|GPIO_Pin_j); ——对所有端口进行置1操作(高电平)GPIO_ResetBits(GPIOx,GPIO_Pin_i); ——对所有端口进行置0操作(低电平)GPIO_WriteBits(GPIOx, GPIO_Pin_i,1); ——对一个端口进行写1(也可以写0,把括号内的1改为0即可)操作GPIO_Write(GPIOA, 0x1101);——向指定GPIO数据端口写入数据GPIO库函数:函数名描述GPIO_DeInit 将外设GPIOx寄存器重设为缺省值GPIO_AFIODeInit 将复用功能(重映射事件控制和EXTI设置)重设为缺省值GPIO_Init 根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器GPIO_StructInit 把GPIO_InitStruct中的每一个参数按缺省值填入GPIO_ReadInputDataBit 读取指定端口管脚的输入GPIO_ReadInputData(GPIOx,GPIO_Pin_i) 读取指定的GPIO端口输入GPIO_ReadOutputDataBit(GPIOx,GPIO_Pin_i) 读取指定端口管脚的输出位(0|1)GPIO_ReadOutputData(GPIOx,GPIO_Pin_i) 读取指定的GPIO端口输出GPIO_SetBits 设置指定的数据端口位GPIO_ResetBits 清除指定的数据端口位GPIO_WriteBit 设置或者清除指定的数据端口位GPIO_Write 向指定GPIO数据端口写入数据GPIO_PinLockConfig 锁定GPIO管脚设置寄存器GPIO_EventOutputConfig 选择GPIO管脚用作事件输出GPIO_EventOutputCmd 使能或者失能事件输出GPIO_PinRemapConfig 改变指定管脚的映射GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); 选择GPIO管脚用作外部中断线路(例子是让PA0引脚作为中断线路),中断触发时该线将中断输出。

OrangePi用户手册中文版

OrangePi用户手册中文版

Orange Pi 用户手册目录一.Orange Pi简介 (3)1.我们可以用Orange Pi做什么 (3)2.Orange Pi 是为谁设计的 (3)3.硬件特性的介绍 (3)4.外观规格的介绍 (4)5.开发板使用方法 (6)6.SD卡的制卡介绍 (8)7.通用软件的配置 (18)8. GPIO规格介绍 (25)9.CSI摄像头接口规格 (26)二. Linux内核源码编译 (28)1.源码的获得方法 (28)2.项目源码的编译 (29)3.内核镜像和库的安装 (31)三. Android源码编译介绍 (34)1.JDK 的安装 (35)2.安装平台支持软件 (35)3.源码包的获得方法 (36)4.编译工具链的安装 (36)5.lichee 源码的编译 (37)6.android源码的编译 (37)四.工程化配置介绍 (41)1.工程配置化文件的个性化配置 (41)2. Uboot 和boot 更新方法 (42)3.例子介绍 (42)五.OrangePi驱动程序开发 (46)1.设备驱动和应用程序的编写 (47)2.设备驱动的编译方法 (49)3.应用程序的编译方法 (52)4.驱动和程序的运行方式 (53)六.串口调试工具介绍 (55)Windows平台 (56)1.Windows下USB 驱动安装 (56)2.Windows下Putty 安装 (56)3.调试的连接方式 (57)4.设备信息的获取 (57)5. Putty 的配置 (59)6.开始调试串口 (59)Linux 平台 (60)1.kermit的安装 (60)2.调试的连接方式 (61)3.设备信息的获取 (62)4.开始调试串口 (68)七.常见问题 (70)一. Orange Pi简介什么是 Orange Pi香橙派是一款开源的单板电脑,新一代的 arm 开发板,它可以运行Android4.4、Ubuntu、Debian 等操作系统,兼容树莓派。

树莓派教程1_点亮第一个led灯

树莓派教程1_点亮第一个led灯

树莓派教程1_点亮第一个led灯学习模数电路,从点灯开始;学习51单片机,从点灯开始;学习stm32,从点灯开始;学习DSP,从电灯开始;学习FPGA,从点灯开始;渐渐的,我们已经习惯了用点灯的方式去接触新的事物,不知不觉中,我们已经成为了人们口中常常提到的“一灯大师”。

今天,我们来学习树莓派的使用,依旧从点灯开始,用点灯的方式一步步点亮我们的世界。

实验原理同过树莓派的IO口可以外接很多外设,如舵机、红外发送接收模块、继电器、步进电机、各类兼容传感器、屏幕等。

通过这些外设可以制作很多有趣的设计,改善我们的生活方式提高我们的生活质量。

树莓派的IO口驱动能力是比较弱的,驱动电平为3.3V,高电平驱动比电平驱动能力稍弱些,但这也足够驱动led工作,为方便理解,以下实验以高电平驱动方式进行。

IO口输出高电平,led灯亮,输出低电平则灭。

实验内容•使用面包板和杜邦线连接电路•通过ssh局域网无线连接树莓派•使用wiringPi控制IO•使用vim编辑器实验元器件•树莓派及电源 x1•无线网卡 x1•串口连接器 x1•面包板 x1•Led灯 x1•电阻220欧 x1•杜邦线若干以上器件可在树莓派创客社区淘宝直营店购买:https://52pi.taobao实验步骤一、连接线路。

实物图如下:二、通过ssh连接连接树莓派通过上一课程的学习,已经知道如何通过串口连接树莓派进行联网,接下来学习如何在局域网中通过ssh无线网络连接树莓派,这样摆脱了接串口线的麻烦,方便很多。

1.首先通过串口连接上树莓派,登陆进入树莓派后输入 ifconfig 回车。

可以查看到树莓派的ip地址。

2.电脑打开PuTTY软件,选择SSH模式,输入上面查看的ip地址,端口22,确认无误后点击Open,输入默认用户名密码,登陆完成。

三、使用vi编辑器编写控制代码及编译运行1.登陆树莓派后,输入cd ./wiringPi 进入wiringPi目录,使用vi编辑器编辑c源文件,输入vim.tiny blink.c,如目录下有blink.c文件打开编辑,若无则会新建一个打开编辑。

STM32IO口函数GPIO使用说明

STM32IO口函数GPIO使用说明

STM32之GPIO条记_zhuan 之阳早格格创做1 STM32的输进输出管足有底下8种大概的摆设:(4输进+2输出+2复用输出)①浮空输进_IN_FLOATING②戴上推输进_IPU③戴下推输进_IPD④模拟输进_AIN⑤开漏输出_OUT_OD⑥推挽输出_OUT_PP⑦复用功能的推挽输出_AF_PP⑧复用功能的开漏输出_AF_OD1.1 I/O心的输出模式下,有3种输出速度可选(2MHz、10MHz战50MHz),那个速度是指I/O心启动电路的赞同速度而不是输出旗号的速度,输出旗号的速度取步调有闭(芯片里里正在I/O心的输出部分安插了多个赞同速度分歧的输出启动电路,用户不妨根据自己的需要采用符合的启动电路).通过采用速度去采用分歧的输出启动模块,达到最好的噪声统造战落矮功耗的手段.下频的启动电路,噪声也下,当不需要下的输出频次时,请采用矮频启动电路,那样非常有好处普及系统的EMI本能.天然如果要输出较下频次的旗号,但是却采用了较矮频次的启动模块,很大概会得到得果然输出旗号.闭键是GPIO的引足速度跟应用匹配(推荐10倍以上?).比圆:1.1.1 对付于串心,假若最大波特率只需115.2k,那么用2M 的GPIO的引足速度便够了,既省电也噪声小.1.1.2 对付于C交心,假若使用400k波特率,若念把余量留大些,那么用2M的GPIO的引足速度或者许不敷,那时不妨采用10M的GPIO引足速度.1.1.3 对付于SPI交心,假若使用18M或者9M波特率,用10M的GPIO的引足速度隐然不敷了,需要采用50M的GPIO的引足速度.1.4 所有端心皆有中部中断本领.为了使用中部中断线,端心必须摆设成输进模式.1.5 GPIO心的摆设具备上锁功能,当摆设好GPIO心后,不妨通历步调锁住摆设推拢,曲到下次芯片复位才搞解锁.2 正在STM32中怎么样摆设片内中设使用的IO端心最先,一个中设通过①摆设输进的时钟战②初初化后即被激活(开开);③如果使用该中设的输进输出管足,则需要摆设相映的GPIO端心(可则该中设对付应的输进输出管足不妨搞一般GPIO管足使用);④再对付中设举止仔细摆设.对付应到中设的输进输出功能有下述三种情况:一、中设对付应的管足为输出:需要根据中围电路的摆设采用对付应的管足为复用功能的推挽输出或者复用功能的开漏输出.二、中设对付应的管足为输进:则根据中围电路的摆设不妨采用浮空输进、戴上推输进或者戴下推输进.三、ADC对付应的管足:摆设管足为模拟输进.如果把端心摆设成复用输出功能,则引足战输出寄存器断开,并战片上中设的输出旗号连交.将管足摆设成复用输出功能后,如果中设不被激活,那么它的输出将不决定.3 通用IO端心(GPIO)初初化:3.1 GPIO初初化3.1.1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | B | C, ENABLE):使能APB2总线中设时钟3.1.2 RCC_ APB2PeriphResetCmd (RCC_APB2Periph_GPIOA | B | C,DISABLE):释搁GPIO复位3.2 摆设各个PIN端心(模拟输进_AIN、输进浮空_IN_FLOATING、输进上推_IPU、输进下推_IPD、开漏输出_OUT_OD、推挽式输出_OUT_PP、推挽式复用输出_AF_PP、开漏复用输出_AF_OD)3.3 GPIO初初化完毕============================================== =========================迩去刚刚开初教习STM32,所以从最基础的GPIO开初教起;最先瞅瞅STM32的datasheet上对付GPIO心的简朴介绍:每个GPI/O 端心有二个32 位摆设寄存器(GPIOx_CRL,GPIOx_CRH),二个32位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个32 位子位/复位寄存器(GPIOx_BSRR),一个16 位复位寄存器(GPIOx_BRR)战一个32 位锁定寄存器(GPIOx_LCKR).GPIO 端心的每个位不妨由硬件分别摆设成多种模式.每个I/O 端心位不妨自由编程,然而I/0 端心寄存器必须按32 位字被考察(不允许半字或者字节考察).GPIOx_BSRR 战GPIOx_BRR 寄存器允许对付所有GPIO 寄存器的读/变动的独力考察;那样,正在读战变动考察之间爆收IRQ 时不会爆收伤害.端心位摆设 CNFx[1:0]=xxb,MODEx[1:0]=xxb再瞅GPIO功能很强盛:1.通用I/O(GPIO):最最基础的功能,不妨启动LED、不妨爆收PWM、不妨启动蜂鸣器等等;2.单独的位树坐或者位扫除:便当硬体做业,步调简朴.端心摆设好以去只需GPIO_SetBits(GPIOx, GPIO_Pin_x)便不妨真止对付GPIOx的pinx位为下电仄;3.中部中断/唤醉线:端心必须摆设成输进模式时,所有端心皆有中部中断本领;4.复用功能(AF):复用功能的端心兼有IO功能等.复位功夫战刚刚复位后,复用功能已开开,I/O 端心被摆设成浮空输进模式:(CNFx[1:0]=01b,MODEx[1:0]=00b).5.硬件沉新映射I/O复用功能:为了使分歧器件启拆的中设I/O 功能的数量达到最劣,不妨把一些复用功能沉新映射到其余一些足上.那不妨通过硬件摆设相映的寄存器去完毕.那时,复用功能便不再映射到它们的本初引足上了;6.GPIO锁定体造:当正在一个端心位上真止了所定(LOCK)步调,正在下一次复位之前,将不克不迭再变动端心位的摆设.GPIO基础树坐GPIOMode_TypeDef GPIO mode 定义及偏偏移天面GPIO_Mode_AIN = 0x0, //模拟输进GPIO_Mode_IN_FLOATING = 0x04, //悬空输进GPIO_Mode_IPD = 0x28, //下推输进GPIO_Mode_IPU = 0x48, //上推输进GPIO_Mode_Out_OD = 0x14, //开漏输出GPIO_Mode_Out_PP = 0x10, //推挽输出GPIO_Mode_AF_OD = 0x1C, //开漏复用GPIO_Mode_AF_PP = 0x18 //推挽复用GPIO输进输出速度采用:typedef enum{GPIO_Speed_10MHz = 1,GPIO_Speed_2MHz,GPIO_Speed_50MHz}GPIOSpeed_TypeDef;#define IS_GPIO_SPEED(SPEED) ((SPEED ==GPIO_Speed_10MHz) ||(SPEED == GPIO_Speed_2MHz) || (SPEED ==GPIO_Speed_50MHz))搞一个GPIO输出的考查当I/O 端心被摆设为推挽模式输出时:输出寄存器上的0 激活NMOS,而输出寄存器上的1 将激活PMOS.用那段步调真止:GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;int main(void){#ifdef DEBUG#endif/* 树坐系统时钟 */RCC_Configuration();/* 嵌套中断树坐*/NVIC_Configuration();/* 激活GPIOC clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);/* Configure PC.04, PC.05, PC.06 and PC.07 as Output pushpull */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 |GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure);{/*本考查仅能真止LED1明、熄功能*/GPIO_SetBits(GPIOC, GPIO_Pin_4); //树坐PC.04 pin为下电仄,面明LED1Delay();GPIO_ResetBits(GPIOC, GPIO_Pin_4); //树坐PC.04 pin为矮电仄,燃烧LED1Delay();}}搞一个GPIO输进的考查:以EKSTM32F中LCDdemo搞例子那个考查中把GPIO的PD.04搞为按键输进,当下落沿光临时触收.LCDdemo中的例程如下:最先摆设按键PD.03, PD.04为按键输进交心.void Button_Config(void){GPIO_InitTypeDef GPIO_InitStructure;/* Enable GPIOD clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);/* Configure PD.03, PD.04 as output pushpull */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 ;GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOD, &GPIO_InitStructure);}底下为按键效率是开用中部中断GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource3);EXTI_InitStructure.EXTI_Line = EXTI_Line3; //设定中部中断3EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设定中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //设定下落沿触收模式EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);。

安卓开发板OrangePiZero2外接USB无线网卡测试示例

安卓开发板OrangePiZero2外接USB无线网卡测试示例

安卓开发板OrangePiZero2外接USB无线网卡测试示例
目前Zero2开发板测试过的能用的USB 无线网卡型号为:
RTL8723BU,其他型号的USB 无线网卡请自行测试,如果无法使用就需要移植对应的 USB 无线网卡驱动
1) 首先将 RTL8723BU 无线网卡模块插入开发板的 USB 接口中
2) 然后 linux 系统会自动加载 RTL8723BU 蓝牙和 WIFI 相关的内核模块,通过 lsmod 命令可以看到下面输出
3) 通过 dmesg 命令可以看到 RTL8723BU 模块的加载信息
4) 然后通过 ifconfig 命令可以看到 RTL8723BU WIFI 的设备节点,WIFI 的连接和测试方法参看官方用户手册的 WIFI 连接测试章节
5) 然后通过 hciconfig 命令可以看到两个蓝牙设备,其中 Bus 类型为 USB 的节点就是 RTL8723BU 的蓝牙节点,蓝牙的测试方法直接看手册的蓝牙使用方法章节,这里不再赘述。

树莓派GPIO详细介绍与使用

树莓派GPIO详细介绍与使用

树莓派GPIO详细介绍与使⽤树莓派介绍Raspberry Pi(中⽂名为“树莓派”,简写为RPi,(或者RasPi / RPI) [1] 是为学习计算机编程教育⽽设计),只有信⽤卡⼤⼩的微型电脑,其系统基于。

GPIO树莓派总共40个引脚40根引脚有不同的编号规则来定义,虽然不同的规则叫的名字不⼀样,但实际的⽤途是⼀致的,这⾥只学习⼀种编号规则,也就是物理位置编号,这样更容易进⾏物理连接。

⽐如:1号引脚,是输出1个3.3伏的电压,也就是如果⽤数字万⽤表去测量这根引脚的电压,会⼀直测出来是⼀个恒定并且不能变化的3.3伏。

2号与4号引脚相同,只不过输出的是5伏的电压。

6号引脚,是⼀个GND,也就是接地,如果测量电压的话,就是0伏。

(9、14、20、25、30、34、39相同)11号引脚,是绿⾊图标,其实这个接⼝就是普通的接⼝,可以输⼊也可以输出。

如果设置为输出,则可以输出⾼电压或者低电压。

输出⾼电压就是3.3伏,输出低电压就是0伏。

可以通过程序来控制。

控制GPIO ⽅法⼀通过终端命令cd /sys/class/gpio # 进⼊ GPIO ⽬录ls # 查看GPIO⽬录中的内容# GPIO 操作接⼝从内核空间暴露到⽤户空间echo BCM引脚编码 > export # 例如 echo 26 > export 执⾏之后该⽬录下会增加⼀个引脚⽂件ls这时候会看到⽬录下会出现⼀个gpio26的⽬录cd gpio26进⼊⽬录后就可以通过终端命令控制引脚了控制GPIO ⽅法⼆通过Python控制import RPi.GPIO as GPIOimport timeGPIO.setmode(GPIO.BCM) # 采⽤BCM编码GPIO.setup(18, GPIO.OUT)for i in range(1,100):GPIO.output(18, GPIO.HIGH)time.sleep(0.5)GPIO.output(18, GPIO.LOW)time.sleep(0.5)GPIO.cleanup()如果遇到这个警告可以忽略RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.控制GPIO ⽅法三通过C语⾔控制#include<wiringPi.h>#define Pin 25int mian(){if(wiringPiSetup() < 0)return1;pinMode(Pin,OUTPUT);for(int i=0;i<30;i++){digitalWrite(Pin,1);delay(200);digitalWrite(Pin,0);delay(200);}return 0;}编译运⾏gcc -o ⽂件名⽂件名.c -lwiringPisudo ./⽂件名树莓派遇到的问题gpio readall 未找到命令原因是缺少[[wiringPi]]库树莓派4 ⾃带的 wiringPi 库默认是 2.50 ,⽆法映射到 gpio ,所以需要更新到 2.52及以上才能与树莓派映射。

Q驱与金橙子软件数字接线图

Q驱与金橙子软件数字接线图

Q驱的数字方式连接方法
使用Q驱动,数字方式连接方式如上图。

板卡管脚管脚信号定义Q驱动器管脚Q驱动器信号定义
13输出控制信号112数据信号
32输出控制信号05同步信号
4激光开关控制输出+14出光控制信号+
1计算机电源地6外部电源-
Q驱动器的5脚和12脚分别接一个4.7K 的上拉电阻。

此外需要提供一个 5V 电源,有两种方式:
方式 1,使用外接电源:LMC-1 33脚接外部5V+,14接外部电源地;
方式 2,使用板卡上的内部电源:将LMC-1卡的8脚和33脚短接,14脚和21脚短接即可。

软件的设置:
1)打开软件,选择“参数”
2)进入“配置参数”界面,选择“激光控制”,选择“使用数字Q开关驱动器”。

如下图所示。

至此,金橙子LMC_1控制卡就可以数字方式控制Q驱动电源了。

LMC如何与脚踏开关进行连接
脚踏开关可以连接到LMC打标卡的第19脚“START”以产生开始信号,也可以连接到通用输入信号端来产生开始信号。

下面以连接到通用输入信号0端口举例说明。

图1 脚踏开关使用内部电源
图2 脚踏开关使用外部电源
用通用输入信号来作为开始信号时,接线方式选用图1和2中的任意一种,同时在软件中进行如下的设置:
在软件编辑界面中点击参数设置按钮,弹出配置参数对话框,如下图所示,选择端口属性页,在右下方的“开始标刻端口”栏里选择“0”,点击“确定”按钮,返回到软件编辑界面,此时脚踏开关即可正常工作了。

图3 软件设置服务电话:131********。

树莓派实验教程

树莓派实验教程

Raspberry Pi板实验教程实验一、点亮LED在Raspberry Pi板的边上有2列排针,1列13脚一共26脚。

这2列排针叫GPIO口,在Raspberry Pi板搭载的系统下,用户可以使用C语言或Python语言对这2列GPIO口进行控制,以此来控制外接的外部设备。

在这里,我们选用C语言来进行编程控制。

首先,在使用C语言编程之前,要先将Raspberry Pi板连接上网,下载一个GPIO的wirngpi函数库。

wirngpi 函数库是由一个外国人编写的,在使用C语言的时候可以通过对这个函数库的函数调用来对操作GPIO口。

点击LXTerminal进入root用户权限的命令行模式,依次键入以下命令:sudo apt-get update(需要一定等待时间,与网速有关)sudo apt-get upgrade(需要一定等待时间,与网速有关)sudo apt-get install git-coregit clone git:///wiringPicd wiringPigit pull origincd wiringPi./build下载并安装好wiringPi之后,再来看看GPIO口的排列。

将Raspberry Pi 板放置为两列GPIO口在右上角的方式,这两列GPIO口的引脚位如下图所示。

图1图1右边的这张图,就是GPIO的实际引脚位。

而左边的图则是wirngpi 库定义的引脚位图。

编程的时候,只需要以左图为标准就可以了,不需要理会右图。

现在,我们要使用GPIO口来控制LED的亮灭。

LED就是发光二极管,这里需要一块外接的电路板。

如下图:图2这块板的电路图如下:图3这块板是用来驱动步进电机转动的,板子上有4个发光二极管分别接在ULN2003的四个输出上。

将这板连接到Raspberry Pi板上就可以通过操作Raspberry Pi板的GPIO来控制电机板上的发光二级管。

用杜邦线将Raspberry Pi板和电机板连接起来,如果只是简单的控制上面的1个发光二极管,那么只需要连接三条线:电源线(VCC)、地线(GND)和一条IO线。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Orange PI GPIO控制详细教程一、sysfs方式通过sysfs方式控制GPIO,先访问/sys/class/gpio目录,向export文件写入GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction和value 等,direction控制GPIO方向,而value可控制GPIO输出或获得GPIO输入。

文件IO方式操作GPIO,使用到了4个函数open、close、read、write。

首先,看看系统中有没有“/sys/class/gpio”这个文件夹。

如果没有请在编译内核的时候加入Device Drivers-> GPIO Support ->/sys/class/gpio/…(sysfs interface)。

/sys/class/gpio 的使用说明:gpio_operation 通过/sys/文件接口操作IO端口GPIO到文件系统的映射◇控制GPIO的目录位于/sys/class/gpio◇/sys/class/gpio/export文件用于通知系统需要导出控制的GPIO引脚编号◇/sys/class/gpio/unexport 用于通知系统取消导出◇/sys/class/gpio/gpiochipX目录保存系统中GPIO寄存器的信息,包括每个寄存器控制引脚的起始编号base,寄存器名称,引脚总数导出一个引脚的操作步骤◇首先计算此引脚编号,引脚编号= 控制引脚的寄存器基数+ 控制引脚寄存器位数◇向/sys/class/gpio/export写入此编号,比如12号引脚,在shell中可以通过以下命令实现,命令成功后生成/sys/class/gpio/gpio12目录,如果没有出现相应的目录,说明此引脚不可导出◇direction文件,定义输入输入方向,可以通过下面命令定义为输出。

direction接受的参数:in, out, high, low。

high/low同时设置方向为输出,并将value设置为相应的1/0◇value文件是端口的数值,为1或0几个例子:1. 导出/sys/class/gpio# echo 44 > export2. 设置方向/sys/class/gpio/gpio44# echo out > direction3. 查看方向/sys/class/gpio/gpio44# cat direction4. 设置输出/sys/class/gpio/gpio44# echo 1 > value5. 查看输出值/sys/class/gpio/gpio44# cat value6. 取消导出/sys/class/gpio# echo 44 > unexport二、文件读写例程#include stdlib.h#include stdio.h#include string.h#include unistd.h#include fcntl.h /* define O_WRONLY and O_RDONLY *//* 芯片复位引脚: P1_16 */#define SYSFS_GPIO_EXPORT "/sys/class/gpio/export"#define SYSFS_GPIO_RST_PIN_VAL "48"#define SYSFS_GPIO_RST_DIR "/sys/class/gpio/gpio48/direction"#define SYSFS_GPIO_RST_DIR_VAL "OUT"#define SYSFS_GPIO_RST_VAL "/sys/class/gpio/gpio48/value"#define SYSFS_GPIO_RST_VAL_H "1"#define SYSFS_GPIO_RST_VAL_L "0"int main(){int fd;/* 打开端口/sys/class/gpio# echo 48 > export */fd = open( SYSFS_GPIO_EXPORT, O_WRONLY );if ( fd == -1 ){printf( "ERR: Radio hard reset pin open error.\n" );return(EXIT_FAILURE);}write( fd, SYSFS_GPIO_RST_PIN_VAL, sizeof(SYSFS_GPIO_RST_PIN_VAL) );close( fd );/* 设置端口方向/sys/class/gpio/gpio48# echo out > direction */fd = open( SYSFS_GPIO_RST_DIR, O_WRONLY );if ( fd == -1 ){printf( "ERR: Radio hard reset pin direction open error.\n" );return(EXIT_FAILURE);}write( fd, SYSFS_GPIO_RST_DIR_VAL, sizeof(SYSFS_GPIO_RST_DIR_VAL) );close( fd );/* 输出复位信号: 拉高>100ns */fd = open( SYSFS_GPIO_RST_VAL, O_RDWR );if ( fd == -1 ){printf( "ERR: Radio hard reset pin value open error.\n" );return(EXIT_FAILURE);}while ( 1 ){write( fd, SYSFS_GPIO_RST_VAL_H, sizeof(SYSFS_GPIO_RST_VAL_H) );usleep( 1000000 );write( fd, SYSFS_GPIO_RST_VAL_L, sizeof(SYSFS_GPIO_RST_VAL_L) );usleep( 1000000 );}close( fd );printf( "INFO: Radio hard reset pin value open error.\n" );return(0);}三、中断检测#include stdlib.h#include stdio.h#include string.h#include unistd.h#include fcntl.h#include poll.h#define MSG( args ... ) printf( args )/* 函数声明 */static int gpio_export( int pin );static int gpio_unexport( int pin );static int gpio_direction( int pin, int dir );static int gpio_write( int pin, int value );static int gpio_read( int pin );static int gpio_export( int pin ){char b uffer[64];int len;int fd;fd = open( "/sys/class/gpio/export", O_WRONLY );if ( fd < 0 ){MSG( "Failed to open export for writing!\n" );return(-1);}len = snprintf( buffer, sizeof(buffer), "%d", pin );if ( write( fd, buffer, len ) < 0 ){MSG( "Failed to export gpio!" );return(-1);}close( fd );return(0);}static int gpio_unexport( int pin ){char b uffer[64];int len;int fd;fd = open( "/sys/class/gpio/unexport", O_WRONLY );if ( fd < 0 ){MSG( "Failed to open unexport for writing!\n" );return(-1);}len = snprintf( buffer, sizeof(buffer), "%d", pin );if ( write( fd, buffer, len ) < 0 ){MSG( "Failed to unexport gpio!" );return(-1);}close( fd );return(0);}/* dir: 0-->IN, 1-->OUT */static int gpio_direction( int pin, int dir ){static const char dir_str[] = "in\0out";char path[64];int fd;snprintf( path, sizeof(path), "/sys/class/gpio/gpio%d/direction", pin );fd = open( path, O_WRONLY );if ( fd < 0 ){MSG( "Failed to open gpio direction for writing!\n" );return(-1);}if ( write( fd, &dir_str[dir == 0 ? 0 : 3], dir == 0 ? 2 : 3 ) < 0 ){MSG( "Failed to set direction!\n" );return(-1);}close( fd );return(0);}/* value: 0-->LOW, 1-->HIGH */static int gpio_write( int pin, int value ){static const char values_str[] = "01";char path[64];int fd;snprintf( path, sizeof(path), "/sys/class/gpio/gpio%d/value", pin );fd = open( path, O_WRONLY );if ( fd < 0 ){MSG( "Failed to open gpio value for writing!\n" );return(-1);}if ( write( fd, &values_str[value == 0 ? 0 : 1], 1 ) < 0 ){MSG( "Failed to write value!\n" );return(-1);}close( fd );return(0);}static int gpio_read( int pin ){char p ath[64];char v alue_str[3];int fd;snprintf( path, sizeof(path), "/sys/class/gpio/gpio%d/value", pin );fd = open( path, O_RDONLY );if ( fd < 0 ){MSG( "Failed to open gpio value for reading!\n" );return(-1);}if ( read( fd, value_str, 3 ) < 0 ){MSG( "Failed to read value!\n" );return(-1);}close( fd );return(atoi( value_str ) );}/** none表示引脚为输入,不是中断引脚* rising表示引脚为中断输入,上升沿触发* falling表示引脚为中断输入,下降沿触发* both表示引脚为中断输入,边沿触发* 0-->none, 1-->rising, 2-->falling, 3-->both*/static int gpio_edge( int pin, int edge ){const char dir_str[] = "none\0rising\0falling\0both";char ptr;char path[64];int fd;switch ( edge ){case 0:ptr = 0;break;case 1:ptr = 5;break;case 2:ptr = 12;break;case 3:ptr = 20;break;default:ptr = 0;}snprintf( path, sizeof(path), "/sys/class/gpio/gpio%d/edge", pin );fd = open( path, O_WRONLY );if ( fd < 0 ){MSG( "Failed to open gpio edge for writing!\n" );return(-1);}if ( write( fd, &dir_str[ptr], strlen( &dir_str[ptr] ) ) < 0 ){MSG( "Failed to set edge!\n" );return(-1);}close( fd );return(0);}/* GPIO1_17 */int main(){int gpio_fd, ret;struct pollfd fds[1];char buff[10];unsigned char cnt = 0;/* LED引脚初始化 */gpio_export( 115 );gpio_direction( 115, 1 );gpio_write( 115, 0 );/*按键引脚初始化 */gpio_export( 49 );gpio_direction( 49, 0 );gpio_edge( 49, 1 );gpio_fd = open( "/sys/class/gpio/gpio49/value", O_RDONLY );if ( gpio_fd < 0 ){MSG( "Failed to open value!\n" );return(-1);}fds[0].fd = gpio_fd;fds[0].events = POLLPRI;ret = read( gpio_fd, buff, 10 );if ( ret == -1 )MSG( "read\n" );while ( 1 ){ret = poll( fds, 1, 0 );if ( ret == -1 )MSG( "poll\n" );if ( fds[0].revents & POLLPRI ){ret = lseek( gpio_fd, 0, SEEK_SET );if ( ret == -1 )MSG( "lseek\n" );ret = read( gpio_fd, buff, 10 );if ( ret == -1 )MSG( "read\n" );gpio_write( 115, cnt++ % 2 );}usleep( 100000 );}return(0);}。

相关文档
最新文档