硬件链接图,编程
由硬件图可知,当175引脚GPIO[0]输出为0时,LED点亮,当GPIO[0]输出为1时,LED就熄灭,GPIO寄存器的基地址为0x8000d000,下图为用到的几个寄存器的偏移地址spa
首先,选中GPIO引脚,blog
*((unsigned short *)(0x8000d000+0x00)) = 0x5555;开发
*((unsigned short *)(0x8000d000+0x04)) = 0x5555;it
而后,GPIO[0]做为输出,其他的引脚置为输入。io
*((unsigned short *)(0x8000d000+0x08)) = 0xfffe;入门
读取当前GPIO的状态,避免在后续操做中改变GPIO的状态,致使其余的问题,file
unsigned short val;循环
val = *((unsigned short *)(0x8000d000+0x10));硬件
最后,在输出寄存器里,将GPIO[0]置为0,具体为将GPIO当前的状态和0xfffe相与,就会将GPIO[0]置为0了,而其余引脚保持不变。并将改变后的值写入GPIO输出寄存器。
*((unsigned short *)(0x8000d000+0x0c)) = (val&0xfffe);
若是要熄灭LED,只需将最后一句换为:
*((unsigned short *)(0x8000d000+0x0c)) = (val|0x0001);
点亮LED的完整程序以下:
给该程序编写一个Makefile文件,能够借用第二课的hello程序的Makefile文件,修改一下,
接下来下载到开发板运行一下,
由硬件图可知,当按键按下的时候,GPIO[1]引脚的状态为1,当按键松开的时候,GPIO[1]引脚的状态为0,经过读取GPIO[1]引脚的状态就能够知道按键是否按下,经过一个while大循环,不断检测按键的状态。若是按键被按下,就改变一次当前led的状态。具体程序以下:
#include <stdio.h>
void GPIO_Init(void);
void led_on(unsigned short val);
void led_off(unsigned short val);
void main()
{
unsigned short val;
unsigned short flag=0;
GPIO_Init();
while(1)
{
val= *((unsigned short *)(0x8000d000+0x10));
if( (val & 0x02) == 0x02 )
{
if(flag==0)
{
led_on(val);
flag=1;
}
else
{
led_off(val);
flag=0;
}
}
}
}
void GPIO_Init(void)
{
*((unsigned short *)(0x8000d000+0x00)) = 0x5555;
*((unsigned short *)(0x8000d000+0x04)) = 0x5555;
*((unsigned short *)(0x8000d000+0x08)) = 0xfffe;
}
void led_on(unsigned short val)
{
*((unsigned short *)(0x8000d000+0x0c)) = (val&0xfffe);
}
void led_off(unsigned short val)
{
*((unsigned short *)(0x8000d000+0x0c)) = (val|0x0001);
}
这一课主要是编程的内容,问题不难,通常都是嵌入式入门的第一个程序——点亮发光二极管,经过这一课,对操做寄存器来控制引脚的状态大致有了一些理解。同时也学到了一些嵌入式c语言和标准c语言之间的差别。