[原创] 【TI首届低功耗设计大赛】+MSP430FR5969中GPIO操作的关键

billjing   2014-11-2 14:41 楼主
终于有时间静下心来学习一下5969,刚起步就碰壁。5969的编程方式官方的给的是基于库的操作,真是有不习惯,但是这是现在编程的最流行的一种,能够提高效率,所以就开始一点点看,想从操作的GPIO开始,根据例程,点LED灯一直没有点亮,感觉挺好郁闷,重新查看例程,里面有一句关键的代码: PMM_unlockLPM5();  然后查看文档,文档中解释,PM5CTL0中的LOCKPM5需要软件复位,不然IO口处于高阻态。正是这个原因,IO操作一直没有成功。
在时间配置时,内部默认是1M的DCO,例程的中配置为8M的DCO。

下面根据是GPIO操作的代码。现在不管用库操作还是直接寄存器操作都可以。


/*******************************************************************************
*
* main.c
*
* Out of Box Demo for the MSP-EXP430FR5969
* Main loop, initialization, and interrupt service routines
*
* June 2014
* E. Chen
*
******************************************************************************/

#include "main.h"
#include "driverlib.h"

uint8_t RXData = 0;                               // UART Receive byte
int mode = 0;                                     // mode selection variable
int pingHost = 0;                                 // ping request from PC GUI
Calendar calendar;                                // Calendar used for RTC

#if defined(__IAR_SYSTEMS_ICC__)
#pragma location = 0x9000
__no_init uint16_t dataArray[12289];
#endif

//-----------------------------------------------------------------------------
int _system_pre_init(void)
{
    // Stop Watchdog timer
    WDT_A_hold(__MSP430_BASEADDRESS_WDT_A__);     // Stop WDT

    /*==================================*/
    /* Choose if segment initialization */
    /* should be done or not. */
    /* Return: 0 to omit initialization */
    /* 1 to run initialization */
    /*==================================*/
    return 1;
}

/*
* main.c
*/
int main(void) {



    // Board initializations
    //Init_GPIO();
    //Init_Clock();
    //Init_UART();

    P1DIR |= 0xFF;
    P1OUT |= 0x00;
    P4DIR  |= 0xFF;
    P4OUT = 0x00;

    PMM_unlockLPM5();

    while (1)
    {
            //GPIO_toggleOutputOnPin(GPIO_PORT_P1,GPIO_PIN0);
            P1OUT |= 0x01;
            P4OUT |= 0x40;
            _delay_cycles(800000);
            P1OUT &= 0xFE;
            P4OUT &= 0xBF;
            //GPIO_toggleOutputOnPin(GPIO_PORT_P1,GPIO_PIN0);
            _delay_cycles(800000);

    }
}

/*
* GPIO Initialization
*/
void Init_GPIO()
{
    // Set all GPIO pins to output low for low power
    GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0|GPIO_PIN1|GPIO_PIN2|GPIO_PIN3|GPIO_PIN4|GPIO_PIN5|GPIO_PIN6|GPIO_PIN7);
    GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN0|GPIO_PIN1|GPIO_PIN2|GPIO_PIN3|GPIO_PIN4|GPIO_PIN5|GPIO_PIN6|GPIO_PIN7);
    GPIO_setOutputLowOnPin(GPIO_PORT_P3, GPIO_PIN0|GPIO_PIN1|GPIO_PIN2|GPIO_PIN3|GPIO_PIN4|GPIO_PIN5|GPIO_PIN6|GPIO_PIN7);
    GPIO_setOutputLowOnPin(GPIO_PORT_P4, GPIO_PIN0|GPIO_PIN1|GPIO_PIN2|GPIO_PIN3|GPIO_PIN4|GPIO_PIN5|GPIO_PIN6|GPIO_PIN7);
    GPIO_setOutputLowOnPin(GPIO_PORT_PJ, GPIO_PIN0|GPIO_PIN1|GPIO_PIN2|GPIO_PIN3|GPIO_PIN4|GPIO_PIN5|GPIO_PIN6|GPIO_PIN7|GPIO_PIN8|GPIO_PIN9|GPIO_PIN10|GPIO_PIN11|GPIO_PIN12|GPIO_PIN13|GPIO_PIN14|GPIO_PIN15);

    GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0|GPIO_PIN1|GPIO_PIN2|GPIO_PIN3|GPIO_PIN4|GPIO_PIN5|GPIO_PIN6|GPIO_PIN7);
    GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN0|GPIO_PIN1|GPIO_PIN2|GPIO_PIN3|GPIO_PIN4|GPIO_PIN5|GPIO_PIN6|GPIO_PIN7);
    GPIO_setAsOutputPin(GPIO_PORT_P3, GPIO_PIN0|GPIO_PIN1|GPIO_PIN2|GPIO_PIN3|GPIO_PIN4|GPIO_PIN5|GPIO_PIN6|GPIO_PIN7);
    GPIO_setAsOutputPin(GPIO_PORT_P4, GPIO_PIN0|GPIO_PIN1|GPIO_PIN2|GPIO_PIN3|GPIO_PIN4|GPIO_PIN5|GPIO_PIN6|GPIO_PIN7);
    GPIO_setAsOutputPin(GPIO_PORT_PJ, GPIO_PIN0|GPIO_PIN1|GPIO_PIN2|GPIO_PIN3|GPIO_PIN4|GPIO_PIN5|GPIO_PIN6|GPIO_PIN7|GPIO_PIN8|GPIO_PIN9|GPIO_PIN10|GPIO_PIN11|GPIO_PIN12|GPIO_PIN13|GPIO_PIN14|GPIO_PIN15);

    PMM_unlockLPM5();  //必须有
}

/*
* Clock System Initialization
*/
void Init_Clock()
{
    // Set DCO frequency to 1 MHz
    CS_setDCOFreq(CS_DCORSEL_0, CS_DCOFSEL_6);
    //Set external clock frequency to 32.768 KHz
    CS_setExternalClockSource(32768, 0);
    //Set ACLK=LFXT
    CS_clockSignalInit(CS_ACLK, CS_LFXTCLK_SELECT, CS_CLOCK_DIVIDER_1);
    // Set SMCLK = DCO with frequency divider of 1
    CS_clockSignalInit(CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1);
    // Set MCLK = DCO with frequency divider of 1
    CS_clockSignalInit(CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1);
    //Start XT1 with no time out
    CS_LFXTStart(CS_LFXTDRIVE_0);
}

应用库操作时,要把头文件包含到里面去,这里学习用工程内部相对引用的方法表示方法:
"${PROJECT_LOC}/driverlib/MSP430FR5xx_6xx"


LedTest.rar (479.39 KB)
(下载次数: 4, 2014-11-2 14:40 上传)




stay hungry,stay foolish.

回复评论 (2)

c库和寄存器库都有吧
不过我还是喜欢用c库
现在单片机种类那么多,都去操作寄存器,那还不得头大
So TM what......?
点赞  2014-11-2 15:02
我觉的使用C库操作上手快,使用寄存器操作更好理解一些。现在也是开始学习使用这种编程方法。
stay hungry,stay foolish.
点赞  2014-11-2 21:41
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复