zoukankan      html  css  js  c++  java
  • 单片机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--);                              //软件延时
                }            
                
        }
  • 相关阅读:
    假如
    天涯 好文章
    Widget中PendingIntent和RemoteViews用法
    申请android google map API key
    初步学习:Eclipse3.6开发C/C++程序
    Android getWidth和getMeasuredWidth的正解
    intent intentfilter
    mapview 生成apikey
    ViewConfiguration.getScaledTouchSlop () 用法
    Android JNI知识简介
  • 原文地址:https://www.cnblogs.com/pursuit1996/p/4912472.html
Copyright © 2011-2022 走看看