單片機TM4C123學習(一):GPIO模塊的應用


【實驗內容】任選一個LED燈,4秒內從全滅到全亮,亮度變化至少20個台階,循環往復。

1.#ifdef DEBUG 的作用

//*****************************************************************************
//
// The error routine that is called if the driver library encounters an error.
//
//*****************************************************************************
#ifdef DEBUG
void
__error__(char *pcFilename, unsigned long ulLine)
{
}
#endif

 

   在工程設置里有一些設置會對該工程自動產生一系列的宏,用以控制程序的編譯和運行。就好象樓上說的一樣,如果你把代碼夾在#ifdef DEBUG 和對應的 #endif 中間,那么這段代碼只有在調試(DEBUG)下才會被編譯。也就是說,如果你在RELEASE模式下,這些代碼根本就不會存在於你的最終代碼里頭。

   你可以手動實現DEBUG的定義如:
   
   #define DEBUG

   那么你的 #ifdef DEBUG 就會是真的。夾在中間的代碼會進行編譯,可以說,這些宏代碼本身是面向編譯器使用的,不要用來實現你的業務邏輯代碼,這樣會帶來很不好的影響。這類宏定義的一個典型應用就是產生/屏蔽調試信息,你可以把這種應用放在你希望對程序的執行過程進行跟蹤的代碼里,為它們加上一些‘痕跡’,方便你進行判斷。而在其他模式(RELEASE)下,這個函數只不過是一個空函數,又因為它是inline的,所以它實際上不會為你產生任何代碼。這樣你就能為自己的代碼帶來一種非常實用的效果,既能在DEBUG模式下為你提供判斷的依據,又能在最終的RELEASE版中方便的拋棄掉它們,而不需要你手動地刪除掉那些代碼。

   作為宏指令,如果定義了DEBUG宏那么編譯#IF后面到#ENDIF的代碼否則不編譯DEBUG宏一般是編譯器產生,如果編譯模式是DEBUG就會產生這個宏,如果是RELEASE就不會

2.設置系統時鍾

    //
    //設置系統時鍾為50MHz
    //
    SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
                       SYSCTL_XTAL_16MHZ);

因為SYSCTL_USE_PLL啟用了內部的PLL,它的時鍾參考源是外部晶振(16MHZ),PLL額定值是200MHz,SYSCTL_SYSDIV_4將其四分頻,所以是50MHz不知道你用哪款芯片,811的話內部有內部振盪器12MHz+-30%

3.LED燈初始化

D2——藍色——PF0(鎖定狀態,需要解鎖)

D3——綠色——PA4

D4——紅色——PD6

//*****************************************************************************
//Attention
//TM4C123 NMI unlock - To those who want to use PF0 and PD7, be reminded that these pins defaults as NMI ! ! !
//
//*****************************************************************************
    //
    // LED燈初始化
    //
    
    //1.外部設備設能,這里要用到PF0,所以使能PF端口
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    //2.PF0解鎖(只有藍燈需要)
    HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY;
    HWREG(GPIO_PORTF_BASE + GPIO_O_CR) |= 0xFF;
    HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = 0;        
    //3.設置PF0管腳為輸出類型    
   GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_0);
    //4.因為藍色的LED管腳有復用,所以初始狀態是亮的,這里把它滅掉(其他燈也可以順手滅一下)
    GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,1<<0);

綜合起來LED燈的初始化有以下幾個步驟:外部設備使能,(解鎖),設置管腳類型為輸出,滅燈

4.主程序

while(1)
    {
        for(k=20;k>0;k--)    
          for(i=4000;i>0;i--)
            {
                GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,0<<0);    //設置藍色LED燈狀態為亮
                for(j=30*(20-k);j>0;j--);                         //軟件延時        
                GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,1<<0);    //設置藍色LED燈狀態為滅
                for(j=30*k;j>0;j--);                              //軟件延時
            }            
            
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM