1. 程式人生 > 其它 >MSP430-GPIO與中斷相關庫函式及例程

MSP430-GPIO與中斷相關庫函式及例程

0、巨集定義

#define GPIO_PORT_P1                                                          1
#define GPIO_PORT_P2                                                          2
#define GPIO_PORT_P3                                                          3
#define GPIO_PORT_P4                                                          4
#define GPIO_PORT_P5                                                          5
#define GPIO_PORT_P6                                                          6
#define GPIO_PORT_P7                                                          7
#define GPIO_PORT_P8                                                          8
#define GPIO_PORT_P9                                                          9
#define GPIO_PORT_P10                                                        10
#define GPIO_PORT_P11                                                        11
#define GPIO_PORT_PA                                                          1
#define GPIO_PORT_PB                                                          3
#define GPIO_PORT_PC                                                          5
#define GPIO_PORT_PD                                                          7
#define GPIO_PORT_PE                                                          9
#define GPIO_PORT_PF                                                         11
#define GPIO_PORT_PJ                                                         13

引腳

#define GPIO_PIN0                                                      (0x0001)
#define GPIO_PIN1                                                      (0x0002)
#define GPIO_PIN2                                                      (0x0004)
#define GPIO_PIN3                                                      (0x0008)
#define GPIO_PIN4                                                      (0x0010)
#define GPIO_PIN5                                                      (0x0020)
#define GPIO_PIN6                                                      (0x0040)
#define GPIO_PIN7                                                      (0x0080)
#define GPIO_PIN8                                                      (0x0100)
#define GPIO_PIN9                                                      (0x0200)
#define GPIO_PIN10                                                     (0x0400)
#define GPIO_PIN11                                                     (0x0800)
#define GPIO_PIN12                                                     (0x1000)
#define GPIO_PIN13                                                     (0x2000)
#define GPIO_PIN14                                                     (0x4000)
#define GPIO_PIN15                                                     (0x8000)
#define GPIO_PIN_ALL8                                                    (0xFF)
#define GPIO_PIN_ALL16                                                 (0xFFFF)

1、API函式

  • 配置為輸出埠

    void GPIO_setAsOutputPin(uint8_t selectedPort, uint16_t selectedPins)
    
  • 配置為輸入埠

    void GPIO_setAsInputPin(uint8_t selectedPort, uint16_t selectedPins)
    
  • 配置為複用功能輸出

    void GPIO_setAsPeripheralModuleFunctionOutputPin(uint8_t selectedPort, uint16_t selectedPins)
    
  • 配置為複用功能輸入

    void GPIO_setAsPeripheralModuleFunctionInputPin(uint8_t selectedPort, uint16_t selectedPins)
    
  • 輸出高電平

    void GPIO_setOutputHighOnPin(uint8_t selectedPort, uint16_t selectedPins)
    
  • 輸出低電平

    void GPIO_setOutputLowOnPin(uint8_t selectedPort, uint16_t selectedPins)
    
  • 翻轉電平輸出

    void GPIO_toggleOutputOnPin(uint8_t selectedPort, uint16_t selectedPins)
    
  • 配置為下拉輸入

    void GPIO_setAsInputPinWithPullDownResistor(uint8_t selectedPort, uint16_t selectedPins)
    
  • 配置為上拉輸入

    void GPIO_setAsInputPinWithPullUpResistor(uint8_t selectedPort, uint16_t selectedPins)
    
  • 讀取輸入電平

    uint8_t GPIO_getInputPinValue(uint8_t selectedPort, uint16_t selectedPins)
    

    返回

    #define GPIO_INPUT_PIN_HIGH                                              (0x01)
    #define GPIO_INPUT_PIN_LOW                                               (0x00)
    
  • 使能中斷

    void GPIO_enableInterrupt(uint8_t selectedPort, uint16_t selectedPins)
    
  • 禁用中斷

    void GPIO_disableInterrupt(uint8_t selectedPort, uint16_t selectedPins)
    
  • 獲取中斷狀態

    uint16_t GPIO_getInterruptStatus(uint8_t selectedPort, uint16_t selectedPins)
    
  • 清除中斷標誌

    void GPIO_clearInterrupt(uint8_t selectedPort, uint16_t selectedPins)
    
  • 選取中斷沿

    void GPIO_selectInterruptEdge(uint8_t selectedPort, uint16_t selectedPins, uint8_t edgeSelect)
    

    edgeSelect可選引數:GPIO_HIGH_TO_LOW_TRANSITIONGPIO_LOW_TO_HIGH_TRANSITION

  • 配置驅動能力

    void GPIO_setDriveStrength(uint8_t selectedPort, uint16_t selectedPins, uint8_t driveStrength)
    

    ·driveStrength·可選引數:GPIO_REDUCED_OUTPUT_DRIVE_STRENGTHGPIO_FULL_OUTPUT_DRIVE_STRENGTH

2、例程

說明

程式示例基於MSP430F5529 LaucnPad及拓展板套件,通過外部中斷實現按鍵控制LED燈狀態翻轉,分別由S1,S2,S3按鍵控制L1,L2,L3的亮滅,每按下一次按鍵LED燈的狀態翻轉一次。硬體原理圖如下:

原始碼

#include "driverlib.h"


// 消抖延時
void delay(int cnt)
{
    while(cnt)
        cnt--;
}

int main(void) 
{

    WDT_A_hold(WDT_A_BASE);

    // 配置按鍵為上拉輸入
    GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN2 | GPIO_PIN3);  // S1 | S2
    GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P2, GPIO_PIN3);  // S3
    // 使能中斷
    _enable_interrupts();
    GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN2 | GPIO_PIN3);
    GPIO_enableInterrupt(GPIO_PORT_P2, GPIO_PIN3);
    // 選取為下降沿
    GPIO_selectInterruptEdge(GPIO_PORT_P1, GPIO_PIN2 | GPIO_PIN3, GPIO_HIGH_TO_LOW_TRANSITION);
    GPIO_selectInterruptEdge(GPIO_PORT_P2, GPIO_PIN3, GPIO_HIGH_TO_LOW_TRANSITION);
    // 清除中斷標誌
    GPIO_clearInterrupt(GPIO_PORT_P1, GPIO_PIN2 | GPIO_PIN3);
    GPIO_clearInterrupt(GPIO_PORT_P2, GPIO_PIN3);
    // LED配置為輸出埠,預設輸出高電平
    GPIO_setAsOutputPin(GPIO_PORT_P8, GPIO_PIN1);   GPIO_setOutputHighOnPin(GPIO_PORT_P8, GPIO_PIN1);    // L1
    GPIO_setAsOutputPin(GPIO_PORT_P3, GPIO_PIN7);   GPIO_setOutputHighOnPin(GPIO_PORT_P3, GPIO_PIN7);    // L2
    GPIO_setAsOutputPin(GPIO_PORT_P7, GPIO_PIN4);   GPIO_setOutputHighOnPin(GPIO_PORT_P7, GPIO_PIN4);    // L3

    return (0);
}

// 編寫中斷函式
// P1
#pragma vector=PORT1_VECTOR
__interrupt
void Port_1(void)
{
    delay(50000);
    if(!( GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN2) &
          GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN3) ))
    {
        //獲取中斷標誌
        if(GPIO_getInterruptStatus(GPIO_PORT_P1, GPIO_PIN2))    // S1
        {
            GPIO_toggleOutputOnPin(GPIO_PORT_P8, GPIO_PIN1);    // L1
        }
        else    // S2
        {
            GPIO_toggleOutputOnPin(GPIO_PORT_P3, GPIO_PIN7);    // L2
        }
    }
    //清除中斷標誌位
    GPIO_clearInterrupt(GPIO_PORT_P1, GPIO_PIN2 | GPIO_PIN3);
}
// P2
#pragma vector=PORT2_VECTOR
__interrupt
void Port_2(void)
{
    delay(50000);
    if(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN3))
        GPIO_toggleOutputOnPin(GPIO_PORT_P7, GPIO_PIN4);    // L3
    //清除中斷標誌位
    GPIO_clearInterrupt(GPIO_PORT_P2, GPIO_PIN3);
}