日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MSP430F5529 DriverLib 库函数学习笔记(二)GPIO

發(fā)布時(shí)間:2023/12/9 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MSP430F5529 DriverLib 库函数学习笔记(二)GPIO 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 硬知識(shí)
    • 一、MSP430單片機(jī)端口概述
    • 二、通用IO端口輸出特性
    • 三、端口P1和P2
      • 1.輸入寄存器PxIN
      • 2.輸出寄存器PxOUT
    • 3.方向寄存器PxDIR
      • 4.上拉/下拉電阻使能寄存器PxREN
      • 5.輸出驅(qū)動(dòng)能力調(diào)節(jié)寄存器PxDS
      • 6.功能選擇寄存器PxSEL
      • 7.中斷使能寄存器PxIE
      • 8.中斷觸發(fā)邊沿選擇寄存器PxIES
      • 9 .中斷標(biāo)志寄存器PxIFG
    • 四、端口P3~P11
    • 五、端口的應(yīng)用
  • GPIO API
    • GPIO管腳配置
    • 處理GPIO中斷
    • 訪問GPIO引腳值
  • 上機(jī)實(shí)戰(zhàn)
    • 掃描輸入
    • 外部中斷輸入


平臺(tái):Code Composer Studio 10.3.1

MSP430F5529 LaunchPad? Development Kit
(MSP?EXP430F5529LP)

硬知識(shí)

一、MSP430單片機(jī)端口概述

????????通用I/O端口是MSP430單片機(jī)最重要也是最常用的外設(shè)模塊。通用I/O端口不僅可以直接用于輸入/輸出,而且可以為MSP430單片機(jī)應(yīng)用系統(tǒng)提供必要的邏輯控制信號(hào)。
????????MSP430F5xx/6xx系列單片機(jī)最多可以提供12個(gè)通用I/O端口(P1~P11和PJ),大部分端口有8個(gè)引腳,少數(shù)端口引腳數(shù)少于8個(gè)。每個(gè)I/O引腳都可以被獨(dú)立地設(shè)置為輸入或者輸出引腳,并且每個(gè)I/O引腳都可以被獨(dú)立地讀取或者寫入,所有的端口寄存器都可以被獨(dú)立地置位或者清零。
????????P1和P2引腳具有中斷能力。從P1和P2端口的各個(gè)I/O引腳引入的中斷可以獨(dú)立地被使能,并且被設(shè)置為上升沿或者下降沿觸發(fā)中斷。所有P1端口的I/O引腳的中斷都來源于同一個(gè)中斷向量P1IV。同理,P2端口的中斷源都來源于另一個(gè)中斷向量P2IV。
????????可以對(duì)每個(gè)獨(dú)立的端口進(jìn)行字節(jié)訪問,或者將兩個(gè)結(jié)合起來進(jìn)行字訪問。端口組合P1和P2、P3和P4、P5和P6、P7和P8可結(jié)合起來稱為PA、PB、PC和PD端口。當(dāng)進(jìn)行字操作寫入PA口時(shí),所有的16位數(shù)據(jù)都被寫入這個(gè)端口;利用字節(jié)操作寫入PA端口低字節(jié)時(shí),高字節(jié)保持不變;利用字節(jié)指令寫入PA端口的高字節(jié)時(shí),低字節(jié)保持不變。其他端口也是一樣。當(dāng)寫入的數(shù)據(jù)長度小于端口的最大長度時(shí),那些沒有用到的位保持不變。應(yīng)用這個(gè)規(guī)則來訪問所有端口,除了中斷向量寄存器P1IV和P2IV,它們只能進(jìn)行字節(jié)操作。

二、通用IO端口輸出特性

????????MSP430單片機(jī)在默認(rèn)輸出驅(qū)動(dòng)(PxDS.y=0,即欠驅(qū)動(dòng)強(qiáng)度)且單片機(jī)供電電壓VCC為3V條件下,端口低電平和高電平的輸出特性分別如下兩圖所示,其中,電流輸入為正,輸出為負(fù)。

????????當(dāng)PxDS.y控制位被配置為1時(shí),即單片機(jī)端口被配置為強(qiáng)驅(qū)動(dòng)模式。在強(qiáng)驅(qū)動(dòng)模式下,端口的低電平和高電平輸出特性分別如下兩圖所示。

三、端口P1和P2

????????端口P1和P2具有輸入/輸出、中斷和外部模塊功能,可以通過設(shè)置它們各自的9個(gè)控制寄存器來實(shí)現(xiàn)這些功能。下面所述Px代表P1和P2。

1.輸入寄存器PxIN

????????輸入寄存器是CPU掃描I/O引腳信號(hào)的只讀寄存器,用戶不能對(duì)其寫入,只能通過讀取該寄存器的內(nèi)容獲取I/O端口的輸入信號(hào),此時(shí)引腳的方向必須選定為輸入。輸入寄存器中某一位為0,表明該位輸入為低;某一位為1,表明該位輸入為高。

2.輸出寄存器PxOUT

????????該寄存器為I/O端口的輸出緩沖寄存器。其內(nèi)容可以像操作內(nèi)存數(shù)據(jù)一樣寫入,以達(dá)到改變I/O口輸出狀態(tài)的目的。在讀取時(shí),輸出緩存的內(nèi)容與引腳方向定義無關(guān)。改變方向寄存器的內(nèi)容,輸出緩存的內(nèi)容不受影響。
????????0:輸出為低; 1:輸出為高。

3.方向寄存器PxDIR

????????相互獨(dú)立的8位分別定義了8個(gè)引腳的輸入/輸出方向。8位在PUC之后都被復(fù)位。使用輸入或輸出功能時(shí),應(yīng)先定義端口的方向,輸入/輸出才能滿足設(shè)計(jì)者的要求。作為輸入時(shí),只能讀;作為輸出時(shí),可讀可寫。
????????0:輸入模式; 1:輸出模式。

4.上拉/下拉電阻使能寄存器PxREN

該寄存器的每一位可以使能相應(yīng)I/O引腳的上拉/下拉電阻。該寄存器需和輸出寄存器配合使用,才能完成上拉/下拉電阻的配置。
0:上拉/下拉電阻禁止; 1:上拉/下拉電阻使能。

5.輸出驅(qū)動(dòng)能力調(diào)節(jié)寄存器PxDS

????????PxDS寄存器的每一位可使相關(guān)引腳選擇全驅(qū)動(dòng)模式和次驅(qū)動(dòng)模式(減弱驅(qū)動(dòng)能力)。默認(rèn)的是次驅(qū)動(dòng)模式。
????????0:次驅(qū)動(dòng)模式; 1:全驅(qū)動(dòng)模式。

6.功能選擇寄存器PxSEL

????????P1和P2端口還有其他片內(nèi)外設(shè)功能,為了減少引腳,將這些功能與芯片外的聯(lián)系通過復(fù)用P1和P2引腳的方式來實(shí)現(xiàn)。PxSEL用來選擇引腳的I/O端口功能與外圍模塊功能。
????????0:選擇引腳為普通I/O功能; 1:選擇引腳為外圍模塊功能。

7.中斷使能寄存器PxIE

????????該寄存器的8位與該端口的8個(gè)引腳一一對(duì)應(yīng),其中每一位用以控制相應(yīng)引腳的中斷允許。

8.中斷觸發(fā)邊沿選擇寄存器PxIES

????????如果允許Px口的某個(gè)引腳中斷,還需定義該引腳的中斷觸發(fā)沿。該寄存器的8位分別定義了Px口的8個(gè)引腳的中斷觸發(fā)沿。

9 .中斷標(biāo)志寄存器PxIFG

????????該寄存器有8個(gè)標(biāo)志位,它們含有相應(yīng)引腳是否有待處理中斷的信息,即相應(yīng)引腳是否有中斷請(qǐng)求。如果Px的某個(gè)引腳允許中斷,同時(shí)選擇上升沿,則當(dāng)該引腳發(fā)生由低電平向高電平跳變時(shí),PxIFG的相應(yīng)位就會(huì)置位,表明該引腳上有中斷事件發(fā)生。

四、端口P3~P11

????????這些端口沒有中斷能力,其余功能與P1、P2端口一樣,能實(shí)現(xiàn)輸入/輸出功能和外圍模塊功能。每個(gè)端口有6個(gè)寄存器供用戶使用,用戶可通過這6個(gè)寄存器對(duì)它們進(jìn)行訪問和控制。每個(gè)端口的6個(gè)寄存器分別為:輸入寄存器(PxIN)、輸出寄存器(PxOUT)、方向選擇寄存器(PxDIR)、輸出驅(qū)動(dòng)能力調(diào)節(jié)寄存器(PxDS)、上拉/下拉電阻使能寄存器(PxREN)和功能選擇寄存器(PxSEL)。具體用法同P1和P2端口。

五、端口的應(yīng)用

????????端口是單片機(jī)中最經(jīng)常使用的外設(shè)資源。一般在程序的初始化階段對(duì)端口進(jìn)行配置。配置時(shí),先配置功能選擇寄存器PxSEL,若為I/O端口功能,則繼續(xù)配置方向寄存器PxDIR;若為輸入,則繼續(xù)配置中斷使能寄存器PxIE;若允許中斷,則繼續(xù)配置中斷觸發(fā)沿選擇寄存器PxIES。
????????需要注意的是,P1和P2端口的中斷為多源中斷,即P1端口的8位共用一個(gè)中斷向量P1IV,P2端口的8位也共用一個(gè)中斷向量P2IV。當(dāng)Px端口上的8個(gè)引腳中的任何一個(gè)引腳有中斷觸發(fā)時(shí),都會(huì)進(jìn)入同一個(gè)中斷服務(wù)程序。在中斷服務(wù)程序中,首先應(yīng)該通過PxIFG判斷是哪一個(gè)引腳觸發(fā)的中斷,再執(zhí)行相應(yīng)的程序,最后還要用軟件清除相應(yīng)的PxIFG標(biāo)志位。

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_PJ

selectedPins

/* 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_ALL16

driveStrength

//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);

上機(jī)實(shí)戰(zhàn)

掃描輸入

用戶按鍵為P2.1、P1.1,LED為P4.7、P1.0
將P2.1設(shè)為內(nèi)部上拉輸入,P1.0設(shè)為輸出,當(dāng)按下S1時(shí),反轉(zhuǎn)LED1

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));}}}

整個(gè)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成功反轉(zhuǎn)。

外部中斷輸入

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); //設(shè)置中斷類型//P2.1 IFG clearedGPIO_clearInterrupt(GPIO_PORT_P2, GPIO_PIN1); //清除中斷標(biāo)志位__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) // 聲明一個(gè)中斷服務(wù)程序,名為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);} }

經(jīng)燒錄檢驗(yàn),外部中斷輸入配置成功。

總結(jié)

以上是生活随笔為你收集整理的MSP430F5529 DriverLib 库函数学习笔记(二)GPIO的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。