MSP430-GPIO與中斷相關庫函式及例程
阿新 • • 發佈:2022-03-03
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_TRANSITION
、GPIO_LOW_TO_HIGH_TRANSITION
-
配置驅動能力
void GPIO_setDriveStrength(uint8_t selectedPort, uint16_t selectedPins, uint8_t driveStrength)
·driveStrength·可選引數:
GPIO_REDUCED_OUTPUT_DRIVE_STRENGTH
、GPIO_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);
}