硬件鏈接圖,編程
由硬件圖可知,當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語言之間的差別。