【实验内容】任选一个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--); //软件延时 } }