【實驗內容】任選一個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--); //軟件延時 } }