第8課 點亮第一個LED燈

8.1 點亮LED

硬件鏈接圖,編程

 

由硬件圖可知,當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文件,修改一下,

 

接下來下載到開發板運行一下,

 

 

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語言之間的差別。

相關文章
相關標籤/搜索