S5PV210开发 -- GPIO
来源:互联网 发布:spark要用java吗? 编辑:程序博客网 时间:2024/06/05 06:19
上一篇文章中,想要让LED亮起来、蜂鸣器响起来,需要控制对应的引脚。但是使用程序该如何控制引脚的电平变化呢?这就是这篇要讲的内容了。
一、什么是 GPIO
GPIO 是 General Purpose Input Output的简称。即,通用输入/输出。
二、S5PV210 GPIO
查看 S5PV210 芯片手册 第 92 页
(1)概述
S5PV210包含237个多功能输入/输出端口引脚和142个存储器端口引脚。总共有34个端口组和2个内存端口组,
如下所示:
•GPA0:8个输入/输出端口 - 2xUART带流量控制
•GPA1:4个输入/输出端口 - 2xUART不带流量控制或1xUART带流量控制
•GPB:8个输入/输出端口 - 2个SPI
•GPC0:5输入/输出端口 - I2S,PCM,AC97
•GPC1:5输入/输出端口 - I2S,SPDIF,LCD_FRM
•GPD0:4个输入/输出端口 - PWM
•GPD1:6输入/输出端口 - 3xI2C,PWM,IEM
•GPE0,1:13输入/输出端口 - 摄像机I / F
•GPF0,1,2,3:30输入/输出端口 - LCD I / F
•GPG0,1,2,3:28输入/输出端口 - 4xMMC通道(通道0和2支持4位和8位模式,但通道1,而通道3只支持4位模式)
•GPH0,1,2,3:32输入/输出端口 - 键盘,外部唤醒(最多32位)。 (GPH *团体在Alive地区)
•GPI:低功耗I2S,PCM(不使用输入/输出端口),PDN配置用于断电AUDIO_SS PDN寄存器。
•GPJ0,1,2,3,4:35输入/输出端口 - 调制解调器IF,CAMIF,CFCON,小键盘,SROM ADDR [22:16]
•MP0_1,2,3:20输入/输出端口 - EBI控制信号(SROM,NF,OneNAND)
•MP0_4,5,6,7:32输入/输出存储器端口 - EBI(有关EBI配置的更多信息,请参阅第5章,和6)
•MP1_0〜8:71个DRAM1端口(不使用输入/输出端口)
•MP2_0〜8:71个DRAM2端口(不使用输入/输出端口)
•ETC0,ETC1,ETC2,ETC4:28个输入/输出ETC端口 - JTAG,工作模式,复位,时钟(ETC3是预留)
GPIO的主要功能包括:
•控制146个GPIO中断
•控制32个外部中断
•237个多功能输入/输出端口
•除了GPH0,GPH1,GPH2和GPH3(GPH *引脚是活动焊盘)之外,控制睡眠模式下的引脚状态.
GPIO由两部分组成,即活动部分和非活动部分。 在活着的部分供电睡眠模式,但在它的外部部分是不一样的。 因此,活动部分中的寄存器在睡眠模式下保持其值。
三、GPIO 寄存器
我们上篇文章讲到,控制LED的GPIO引脚。
当GPJ0_3、GPJ0_4、GPJ0_5、PWMTOUT1 为低电平时,发光二极管发光。
我们先点亮一个LED,配置GPJ0_3寄存器。
查看 S5PV210 芯片手册 第 172 页
端口组GPJ0控制寄存器,有六个控制寄存器,分别是GPJ0CON,GPJ0DAT,GPJ0PUD,GPJ0DRV,GPJ0CONPDN和端口组GPJ0控制寄存器中的GPJ0PUDPDN。
(1)GPJ0CON 寄存器 (配置寄存器) 将其配置成输出模式
GPJ0CON, R/W, Address = 0xE020_0240
GPJ0CON[15:12] 0001 = Output
设置:
GPJ0CON 地址为 0xE020_0240 ,然后要将 GPJ0CON[15:12] 进行位操作,使其变为0001,即输出模式。
位操作方法,参看:C语言再学习 -- 位操作
GPJ0CON &= ~(0x0f<<12);
GPJ0CON |= 0x01<<12;
(2)GPJ0DAT 寄存器 (数据寄存器)LED 低电平亮,高电平灭
GPJ0DAT, R/W, Address = 0xE020_0244
当端口被配置为输入端口时,相应的位是引脚状态。 当端口被配置为输出时端口,引脚状态与相应的位相同。当端口被配置为功能引脚时,未定义值将被读取。
设置:
GPJ0DAT 的地址为 0xE020_0244,然后GPJ0DAT[3]是输出端口,低电平时LED灯亮,高电平时LED灯灭。
位操作方法:
GPJ0DAT |= 0x01<<3; @ 高电平
GPJ0DAT &= ~(0x01<<3); @ 低电平
(3)GPJ0PUD 寄存器(上下拉电阻控制寄存器 )
GPJ0PUD, R/W, Address = 0xE020_0248
GPJ0PUD[n] [2n+1:2n] 00 = Pull-up/ down disabled
设置:
GPJ0PUD 的地址为 0xE020_0248,我们不需要上下拉,因此 GPJ0PUD [7:6] 00 = Pull-up/ down disabled
位操作方法:
GPJ0PUD &= ~0x0c<<4;
(4)总结
主要为这三个寄存器,跟剩余是三个寄存器关系不大。
设置方式:
1、将GPJ0_3管脚设置为输出功能管脚
GPJ0CON 0xE020_0240bit[15:12]为0001,表示输出功能
位操作方法:
GPJ0CON &= ~(0x0f<<12);
GPJ0CON |= 0x01<<12;
2、操作GPJ0_3管脚输出高低电平
GPJ0DAT 0xE020_0244bit[3] 为1:向三极管输出高电平,LED1灭
0:向三极管输出低电平,LED1亮
位操作方法:
GPJ0DAT |= 0x01<<3; @ 高电平
GPJ0DAT &= ~(0x01<<3); @ 低电平
3、禁用GPJ0_3管脚内部的上下电阻
GPJ0PUD 0xE020_0248bit[7:6]为00,表示禁止内部上下拉电阻
位操作方法:
GPJ0PUD &= ~(0x0c<<4);
四、编写驱动程序
此处用到关键字 volatile,参看:C语言再学习 -- 关键字volatile
#define GPJ0CON *((volatile unsigned int*)0xE0200240)#define GPJ0DAT *((volatile unsigned int*)0xE0200244)#define GPJ0PUD *((volatile unsigned int*)0xE0200248)//延时void delay (unsigned int);void led_test (void){//配置相应管脚输出功能 GPJ0CON &= ~(0X0f<<12);GPJ0CON |= 0X01<<12;//禁止内部上拉下拉功能GPJ0PUD &= ~(0X0c<<4);while (1){//LED灭GPJ0DAT |= 0x01<<3; delay (0x100000);//LED亮GPJ0DAT &= ~(0x01<<3);delay (0x100000);}}void delay (unsigned int n ){unsigned int i = 0;for (i = n; i !=0; i--);}
五、编译
(1)生成led.o文件 (不要使用标准库)
(2)生成 led.elf 文件
arm-none-linux-gnueabi-ld -nostartfiles -nostdlib -Ttext=0xc0008000 -eled_test led.o -o led.elf-nostartfiles: 链接时不要添加标准启动信息
-nostdlib: 链接时不要使用标准库文件
-Ttext:指定代码段的起始地址
-e:指定入口函数,默认情况下找的是_start
t# file led.elf led.elf: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped
(3)将elf格式的文件转换为纯机器指令的文件
arm-none-linux-gnueabi-objcopy -O binary led.elf led.bin六、下载led.bin到开发板并执行
七、蜂鸣器响起来
(1)寄存器配置
GPD0CON[2] [11:8]
GPD0CON &= ~(0x0f<<8);
GPD0CON |= 0x01<<8;
GPD0DAT, R/W, Address = 0xE020_00A4)
GPD0DAT[3:0] [3:0]
GPD0DAT |= 0x01<<2; @ 高电平
GPD0DAT &= ~(0x01<<2); @ 低电平
GPD0PUD, R/W, Address = 0xE020_00A8
GPD0PUD[n] [2n+1:2n] 00 = Pull-up/ down disabbuzzer
GPD0PUD &= ~(0x0c<<1);
(2)编写驱动程序
#define GPD0CON *((volatile unsigned int*)0xE02000A0) #define GPD0DAT *((volatile unsigned int*)0xE02000A4) #define GPD0PUD *((volatile unsigned int*)0xE02000A8) //延时 void delay (unsigned int); void buzzer_test (void) { //配置相应管脚输出功能 GPD0CON &= ~(0x0f<<8); GPD0CON |= 0x01<<8; //禁止内部上拉下拉功能 GPD0PUD &= ~(0x0c<<1); while (1) { //蜂鸣器响 GPD0DAT |= 0x01<<2; delay (0x100000); //蜂鸣器不响亮 GPD0DAT &= ~(0x01<<2); delay (0x100000); } } void delay (unsigned int n ) { unsigned int i = 0; for (i = n; i !=0; i--); }
(3)编译
buzzer: buzzer.oarm-none-linux-gnueabi-ld -nostartfiles -nostdlib -Ttext=0xc0008000 -e buzzer_test -o buzzer buzzer.oarm-none-linux-gnueabi-objcopy -O binary buzzer buzzer.binbuzzer.o: buzzer.carm-none-linux-gnueabi-gcc -march=armv5te -nostdlib -c -o buzzer.o buzzer.cclean:rm -vf buzzer.o buzzer buzzer.bin buzzer.s
- S5PV210开发 -- GPIO
- 关于s5pv210 GPIO
- S5PV210 GPIO配置
- S5PV210 GPIO 操作
- S5PV210下gpio模拟i2c
- s5pv210的gpio控制方法
- [嵌入式]S5PV210微处理器GPIO编程
- s5pv210 中配置gpio为中断引脚。
- s5pv210(tiny210)gpio地址表
- s5pv210开发板笔记
- S5PV210开发 -- 前言
- S5PV210开发 -- 启动流程
- S5PV210开发 -- 交叉编译器
- S5PV210开发 -- 通信
- S5PV210开发 -- UART 详解
- S5PV210 GPIO驱动及其在android2.3.1下jni调用
- S5PV210裸板驱动:栈与GPIO的使用
- S5PV210裸板驱动:栈与GPIO的使用
- JavaScript prototype 属性
- python多进程笔记4
- QT之qss教程-QProgressBar
- linux宏定义likely和unlikely解析
- Android基础之EditText在ListView中的使用
- S5PV210开发 -- GPIO
- 2017/11/9 c语言学习之路
- 手机格式,省份证格式,过滤图标,过滤qq图像
- 新 CentOS 6.5 6.9 环境下搭建直播模拟测试环境 ffmpeg+nginx=rtmp (傻瓜式环境搭建)
- Javacore分析
- PHP面向对象的程序设计2
- 【Android进阶】Android Binder之ServiceManager注册服务解析1
- easyUI入门
- android jar转dex