MSP430F5529 DriverLib 库函数学习笔记(二)GPIO
目錄
- 硬知識
- 一、MSP430單片機端口概述
- 二、通用IO端口輸出特性
- 三、端口P1和P2
- 1.輸入寄存器PxIN
- 2.輸出寄存器PxOUT
- 3.方向寄存器PxDIR
- 4.上拉/下拉電阻使能寄存器PxREN
- 5.輸出驅動能力調節寄存器PxDS
- 6.功能選擇寄存器PxSEL
- 7.中斷使能寄存器PxIE
- 8.中斷觸發邊沿選擇寄存器PxIES
- 9 .中斷標志寄存器PxIFG
- 四、端口P3~P11
- 五、端口的應用
- GPIO API
- GPIO管腳配置
- 處理GPIO中斷
- 訪問GPIO引腳值
- 上機實戰
- 掃描輸入
- 外部中斷輸入
平臺:Code Composer Studio 10.3.1
MSP430F5529 LaunchPad? Development Kit
(MSP?EXP430F5529LP)
硬知識
一、MSP430單片機端口概述
????????通用I/O端口是MSP430單片機最重要也是最常用的外設模塊。通用I/O端口不僅可以直接用于輸入/輸出,而且可以為MSP430單片機應用系統提供必要的邏輯控制信號。
????????MSP430F5xx/6xx系列單片機最多可以提供12個通用I/O端口(P1~P11和PJ),大部分端口有8個引腳,少數端口引腳數少于8個。每個I/O引腳都可以被獨立地設置為輸入或者輸出引腳,并且每個I/O引腳都可以被獨立地讀取或者寫入,所有的端口寄存器都可以被獨立地置位或者清零。
????????P1和P2引腳具有中斷能力。從P1和P2端口的各個I/O引腳引入的中斷可以獨立地被使能,并且被設置為上升沿或者下降沿觸發中斷。所有P1端口的I/O引腳的中斷都來源于同一個中斷向量P1IV。同理,P2端口的中斷源都來源于另一個中斷向量P2IV。
????????可以對每個獨立的端口進行字節訪問,或者將兩個結合起來進行字訪問。端口組合P1和P2、P3和P4、P5和P6、P7和P8可結合起來稱為PA、PB、PC和PD端口。當進行字操作寫入PA口時,所有的16位數據都被寫入這個端口;利用字節操作寫入PA端口低字節時,高字節保持不變;利用字節指令寫入PA端口的高字節時,低字節保持不變。其他端口也是一樣。當寫入的數據長度小于端口的最大長度時,那些沒有用到的位保持不變。應用這個規則來訪問所有端口,除了中斷向量寄存器P1IV和P2IV,它們只能進行字節操作。
二、通用IO端口輸出特性
????????MSP430單片機在默認輸出驅動(PxDS.y=0,即欠驅動強度)且單片機供電電壓VCC為3V條件下,端口低電平和高電平的輸出特性分別如下兩圖所示,其中,電流輸入為正,輸出為負。
????????當PxDS.y控制位被配置為1時,即單片機端口被配置為強驅動模式。在強驅動模式下,端口的低電平和高電平輸出特性分別如下兩圖所示。
三、端口P1和P2
????????端口P1和P2具有輸入/輸出、中斷和外部模塊功能,可以通過設置它們各自的9個控制寄存器來實現這些功能。下面所述Px代表P1和P2。
1.輸入寄存器PxIN
????????輸入寄存器是CPU掃描I/O引腳信號的只讀寄存器,用戶不能對其寫入,只能通過讀取該寄存器的內容獲取I/O端口的輸入信號,此時引腳的方向必須選定為輸入。輸入寄存器中某一位為0,表明該位輸入為低;某一位為1,表明該位輸入為高。
2.輸出寄存器PxOUT
????????該寄存器為I/O端口的輸出緩沖寄存器。其內容可以像操作內存數據一樣寫入,以達到改變I/O口輸出狀態的目的。在讀取時,輸出緩存的內容與引腳方向定義無關。改變方向寄存器的內容,輸出緩存的內容不受影響。
????????0:輸出為低; 1:輸出為高。
3.方向寄存器PxDIR
????????相互獨立的8位分別定義了8個引腳的輸入/輸出方向。8位在PUC之后都被復位。使用輸入或輸出功能時,應先定義端口的方向,輸入/輸出才能滿足設計者的要求。作為輸入時,只能讀;作為輸出時,可讀可寫。
????????0:輸入模式; 1:輸出模式。
4.上拉/下拉電阻使能寄存器PxREN
該寄存器的每一位可以使能相應I/O引腳的上拉/下拉電阻。該寄存器需和輸出寄存器配合使用,才能完成上拉/下拉電阻的配置。
0:上拉/下拉電阻禁止; 1:上拉/下拉電阻使能。
5.輸出驅動能力調節寄存器PxDS
????????PxDS寄存器的每一位可使相關引腳選擇全驅動模式和次驅動模式(減弱驅動能力)。默認的是次驅動模式。
????????0:次驅動模式; 1:全驅動模式。
6.功能選擇寄存器PxSEL
????????P1和P2端口還有其他片內外設功能,為了減少引腳,將這些功能與芯片外的聯系通過復用P1和P2引腳的方式來實現。PxSEL用來選擇引腳的I/O端口功能與外圍模塊功能。
????????0:選擇引腳為普通I/O功能; 1:選擇引腳為外圍模塊功能。
7.中斷使能寄存器PxIE
????????該寄存器的8位與該端口的8個引腳一一對應,其中每一位用以控制相應引腳的中斷允許。
8.中斷觸發邊沿選擇寄存器PxIES
????????如果允許Px口的某個引腳中斷,還需定義該引腳的中斷觸發沿。該寄存器的8位分別定義了Px口的8個引腳的中斷觸發沿。
9 .中斷標志寄存器PxIFG
????????該寄存器有8個標志位,它們含有相應引腳是否有待處理中斷的信息,即相應引腳是否有中斷請求。如果Px的某個引腳允許中斷,同時選擇上升沿,則當該引腳發生由低電平向高電平跳變時,PxIFG的相應位就會置位,表明該引腳上有中斷事件發生。
四、端口P3~P11
????????這些端口沒有中斷能力,其余功能與P1、P2端口一樣,能實現輸入/輸出功能和外圍模塊功能。每個端口有6個寄存器供用戶使用,用戶可通過這6個寄存器對它們進行訪問和控制。每個端口的6個寄存器分別為:輸入寄存器(PxIN)、輸出寄存器(PxOUT)、方向選擇寄存器(PxDIR)、輸出驅動能力調節寄存器(PxDS)、上拉/下拉電阻使能寄存器(PxREN)和功能選擇寄存器(PxSEL)。具體用法同P1和P2端口。
五、端口的應用
????????端口是單片機中最經常使用的外設資源。一般在程序的初始化階段對端口進行配置。配置時,先配置功能選擇寄存器PxSEL,若為I/O端口功能,則繼續配置方向寄存器PxDIR;若為輸入,則繼續配置中斷使能寄存器PxIE;若允許中斷,則繼續配置中斷觸發沿選擇寄存器PxIES。
????????需要注意的是,P1和P2端口的中斷為多源中斷,即P1端口的8位共用一個中斷向量P1IV,P2端口的8位也共用一個中斷向量P2IV。當Px端口上的8個引腳中的任何一個引腳有中斷觸發時,都會進入同一個中斷服務程序。在中斷服務程序中,首先應該通過PxIFG判斷是哪一個引腳觸發的中斷,再執行相應的程序,最后還要用軟件清除相應的PxIFG標志位。
GPIO API
????????GPIO APl被分成三組功能:
????????????????處理配置GPIO引腳的功能,
????????????????處理中斷的功能,
????????????????以及訪問引腳值的功能。
GPIO管腳配置
GPIO_setAsOutputPin(uint8_t selectedPort, uint16_t selectedPins); GPIO_setAsInputPin(uint8_t selectedPort, uint16_t selectedPins); GPIO_setAsInputPinWithPullDownResistor(uint8_t selectedPort, uint16_t selectedPins); GPIO_setAsInputPinWithPullUpResistor(uint8_t selectedPort, uint16_t selectedPins); GPIO_setDriveStrength(uint8_t selectedPort, uint16_t selectedPins, uint8_t driveStrength); GPIO_setAsPeripheralModuleFunctionOutputPin(uint8_t selectedPort, uint16_t selectedPins); GPIO_setAsPeripheralModuleFunctionInputPin(uint8_t selectedPort, uint16_t selectedPins);selectedPort
//is the selected port. Valid values are: GPIO_PORT_P1 GPIO_PORT_P2 GPIO_PORT_P3 GPIO_PORT_P4 GPIO_PORT_P5 GPIO_PORT_P6 GPIO_PORT_P7 GPIO_PORT_P8 GPIO_PORT_P9 GPIO_PORT_P10 GPIO_PORT_P11 GPIO_PORT_PA GPIO_PORT_PB GPIO_PORT_PC GPIO_PORT_PD GPIO_PORT_PE GPIO_PORT_PF GPIO_PORT_PJselectedPins
/* is the specified pin in the selected port. Mask value is the logical OR of any of the following: */ 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_PIN_ALL8 GPIO_PIN_ALL16driveStrength
//specifies the drive strength of the pin Valid values are: GPIO_REDUCED_OUTPUT_DRIVE_STRENGTH GPIO_FULL_OUTPUT_DRIVE_STRENGTH處理GPIO中斷
GPIO_enableInterrupt(uint8_t selectedPort, uint16_t selectedPins); GPIO_disableInterrupt(uint8_t selectedPort, uint16_t selectedPins); GPIO_clearInterrupt(uint8_t selectedPort, uint16_t selectedPins); GPIO_getInterruptStatus(uint8_t selectedPort, uint16_t selectedPins); GPIO_selectInterruptEdge(uint8_t selectedPort, uint16_t selectedPins, uint8_t edgeSelect);edgeSelect
//specifies what transition sets the interrupt flag Valid values are: GPIO_HIGH_TO_LOW_TRANSITION GPIO_LOW_TO_HIGH_TRANSITION訪問GPIO引腳值
GPIO_setOutputHighOnPin(uint8_t selectedPort, uint16_t selectedPins); GPIO_setOutputLowOnPin(uint8_t selectedPort, uint16_t selectedPins); GPIO_toggleOutputOnPin(uint8_t selectedPort, uint16_t selectedPins); GPIO_getInputPinValue(uint8_t selectedPort, uint16_t selectedPins);上機實戰
掃描輸入
用戶按鍵為P2.1、P1.1,LED為P4.7、P1.0
將P2.1設為內部上拉輸入,P1.0設為輸出,當按下S1時,反轉LED1
整個main文件為
#include "driverlib.h"#define MCLK_IN_HZ 25000000#define delay_us(x) __delay_cycles((MCLK_IN_HZ/1000000*(x))) #define delay_ms(x) __delay_cycles((MCLK_IN_HZ/1000*(x)))int main(void) {WDT_A_hold(WDT_A_BASE);GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN2);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN3);UCS_turnOnXT2 (UCS_XT2_DRIVE_4MHZ_8MHZ);PMM_setVCore(PMM_CORE_LEVEL_3);UCS_initClockSignal(UCS_FLLREF, UCS_XT2CLK_SELECT, UCS_CLOCK_DIVIDER_8);UCS_initFLLSettle(25000, 50);UCS_initClockSignal(UCS_MCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P2, GPIO_PIN1);GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);while(1){if(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1)){delay_ms(20);if(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1)){GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);while(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1));}}} }按下S1,LED1成功反轉。
外部中斷輸入
GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P2, GPIO_PIN1);//P2.1 interrupt enabledGPIO_enableInterrupt(GPIO_PORT_P2, GPIO_PIN1); //使能中斷//P2.1 Hi/Lo edgeGPIO_selectInterruptEdge(GPIO_PORT_P2, GPIO_PIN1, GPIO_HIGH_TO_LOW_TRANSITION); //設置中斷類型//P2.1 IFG clearedGPIO_clearInterrupt(GPIO_PORT_P2, GPIO_PIN1); //清除中斷標志位__bis_SR_register(GIE); //啟用可屏蔽中斷while(1){} //****************************************************************************** // //This is the PORT2_VECTOR interrupt vector service routine // //****************************************************************************** #pragma vector=PORT2_VECTOR // P2口中斷源 __interrupt void Port_2 (void) // 聲明一個中斷服務程序,名為Port_2() {if(GPIO_getInterruptStatus(GPIO_PORT_P2, GPIO_PIN1)){delay_ms(20);if(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1)){//P1.0 = toggleGPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);while(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1));}//P2.1 IFG clearedGPIO_clearInterrupt(GPIO_PORT_P2, GPIO_PIN1);} }經燒錄檢驗,外部中斷輸入配置成功。
總結
以上是生活随笔為你收集整理的MSP430F5529 DriverLib 库函数学习笔记(二)GPIO的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: svn 服务器搭建
- 下一篇: Cognos TM1_10.1.1服务端