8.1 点亮LED
硬件连接图,
由硬件图可知,当175引脚GPIO[0]输出为0时,LED点亮,当GPIO[0]输出为1时,LED就熄灭,GPIO寄存器的基地址为0x8000d000,下图为用到的几个寄存器的偏移地址
首先,选中GPIO引脚,
*((unsigned short *)(0x8000d000+0x00)) = 0x5555;
*((unsigned short *)(0x8000d000+0x04)) = 0x5555;
然后,GPIO[0]作为输出,其余的引脚置为输入。
*((unsigned short *)(0x8000d000+0x08)) = 0xfffe;
读取当前GPIO的状态,避免在后续操作中改变GPIO的状态,导致其他的问题,
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文件,修改一下,
接下来下载到开发板运行一下,
8.2 按键控制LED的亮灭
由硬件图可知,当按键按下的时候,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);
}
8.3 总结
这一课主要是编程的内容,问题不难,一般都是嵌入式入门的第一个程序——点亮发光二极管,通过这一课,对操作寄存器来控制引脚的状态大体有了一些理解。同时也学到了一些嵌入式c语言和标准c语言之间的差异。
原文地址:https://www.cnblogs.com/LiuFarrell/p/9836798.html