环境:
开发板:JZ2440
系统:Ubuntu 14.04
交叉编译器:arm-linux-gcc 3.4.5
这一节我们实现的是操作GPIO点亮LED
其实操作GPIO很简单,分为以下几个步骤
1.引脚设置为输入/输出
2.配置引脚输出0/1
对于学过单片机的同学都知道 要想控制硬件 不是一上来就是写代码 而是先查看原理图和手册的基础上才能完成代码的编写
我使用的开发板是JZ2440 通过浏览硬件原理图可知
开发板的GPIO是接到GPF4 GPF5 GPF6三个引脚 并且接入电路图为
学过电路或者模拟电路的同学都知道 二极管的单方向导通性 如不理解就学好电路吧
看原理图可知当nLED1 = 0(低电平)时 二极管导通,LED点亮
所以我们点亮LED的方法就是
1.设置GPF4为输出引脚
2.输出0(低电平)
知道如上信息还不够 我们知道了怎样操作引脚才能电路led 但是怎么操作呢?
学过单片机的同学都知道要用GPIO寄存器操作 所以翻阅2440手册可以得到
从手册上得知操作GPFCON和GPFDAT就可以实现我们的目的
1.操作GPFCON[9:8] = 01
2.操作GPFDAT[4] = 0
根据以上的信息 我们就能学出一个GPIO的操作程序
汇编实现如下
@******************************************************************************
@ File:led_on.S
@ 功能:LED点灯程序,点亮LED1
@******************************************************************************
.text
.global _start
_start:
LDR R0,=0x56000050 @ R0设为GPFCON寄存器。此寄存器
@ 用于选择端口B各引脚的功能:
@ 是输出、是输入、还是其他
MOV R1,#0x00000100
STR R1,[R0] @ 设置GPF4为输出口, 位[9:8]=0b01
LDR R0,=0x56000054 @ R0设为GPBDAT寄存器。此寄存器
@ 用于读/写端口B各引脚的数据
MOV R1,#0x00000000 @ 此值改为0x00000010,
@ 可让LED1熄灭
STR R1,[R0] @ GPF4输出0,LED1点亮
MAIN_LOOP:
B MAIN_LOOP
c语言代码实现如下
#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)
int main()
{
GPFCON = 0x00000500; // 设置GPF4为输出口, 位[9:8]=0b01
GPFDAT = 0x00000000; // GPF4输出0,LED1点亮
return 0;
}
通过两个步骤就能实现对GPIO的控制 当然对GPIO的操作不止这些 但是已经实现了这些 其他还会难吗?无非就是看手册操作寄存器的事吗?一切都不会远