通常對CM3內(nèi)部資源應用,軟件有三種不同的形式可操作:一種就是用最低層的匯編語言操作;第二種就是用C語直接寄存器操作;第三種就是利用提供的API庫函數(shù)進行操作。由于提供庫函數(shù)操作簡單,同時都是經(jīng)過認證通過的,因此,下面主要講解API庫函數(shù)。
1:通常,Stellaris系列ARM所有片內(nèi)外設只有在使能以后才可以工作,否則被禁止。暫時不用的片內(nèi)外設被禁止后可以節(jié)省功耗。GPIO也不例外,復位時所有GPIO模塊都被禁止,在使用GPIO模塊之前必須首先要使能。例如: SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); // 使能GPIOB模塊 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); // 使能GPIOG模塊
2:這幾個函數(shù)用來設置GPIO管腳的方向和模式、電流驅動強度和類型。但是在我們的實際編程當中它們并不常用,而是采用更加方便的GPIOPinType系列函數(shù)來代替。 GPIO管腳的方向可以設置為輸入方向或輸出方向。很多片內(nèi)外設的特定功能管腳,如UART模塊的Rx和Tx、Timer模塊的CCP管腳等,都與GPIO管腳復用,如果要使用這些特定功能,則必須先要把GPIO管腳的模式設置為硬件自動管理。 GPIO管腳的電流驅動強度可以選擇2mA、4mA、8mA或者帶轉換速率(Slew Rate)控制的8mA驅動。驅動強度越大表明帶負載能力越強,但功耗也越高。對絕大多數(shù)應用場合選擇2mA驅動即可滿足要求。GPIO管腳類型可以配置成輸入、推挽、開漏三大類,每一類當中還有上拉、下拉的區(qū)別。對于配置用作輸入端口的管腳,端口可按照要求設置,但是對輸入唯一真正有影響的是上拉或下拉終端的配置。關于轉換速率(Slew Rate)。對輸出信號采取適當舒緩的轉換速率控制對抑制信號在傳輸線上的反射和電磁干擾非常有效。按照Stellaris系列ARM數(shù)據(jù)手冊里給出的數(shù)據(jù):在2mA驅動下GPIO輸出的上升和下降時間為17ns(典型值,下同);而在8mA驅動下加快到6ns,電磁干擾現(xiàn)象可能比較突出;但在使能8mA轉換速率控制以后上升和下降時間分別為10ns和11ns,有了明顯的延緩。8mA驅動在使能其轉換速率控制后,并不影響其直流驅動能力,仍然是8mA。
功能 設置所選GPIO端口指定管腳的方向和模式 原型 void GPIODirModeSet(unsigned long ulPort, unsigned char ucPins, unsigned long ulPinIO) 參數(shù) ulPort:所選GPIO端口的基址,應當取下列值之一: GPIO_PORTA_BASE // GPIOA的基址(0x40004000) GPIO_PORTB_BASE // GPIOB的基址(0x40005000) GPIO_PORTC_BASE // GPIOC的基址(0x40006000) GPIO_PORTD_BASE // GPIOD的基址(0x40007000) GPIO_PORTE_BASE // GPIOE的基址(0x40024000) GPIO_PORTF_BASE // GPIOF的基址(0x40025000) GPIO_PORTG_BASE // GPIOG的基址(0x40026000) GPIO_PORTH_BASE // GPIOH的基址(0x40027000) 在2008年新推出的DustDevil家族(LM3S3xxx/5xxx系列,以及部分LM3S1xxx/2xxx型號)里新增了一項AHB功能(GPIO高速總線訪問)。如果已經(jīng)用函數(shù)SysCtlGPIOAHBEnable( )使能了AHB功能,則參數(shù)ulPort應當取下列值之一: GPIO_PORTA_AHB_BASE // GPIOA的AHB基址 GPIO_PORTB_AHB_BASE // GPIOB的AHB基址 GPIO_PORTC_AHB_BASE // GPIOC的AHB基址 GPIO_PORTD_AHB_BASE // GPIOD的AHB基址 GPIO_PORTE_AHB_BASE // GPIOE的AHB基址 GPIO_PORTF_AHB_BASE // GPIOF的AHB基址 GPIO_PORTG_AHB_BASE // GPIOG的AHB基址 GPIO_PORTH_AHB_BASE // GPIOH的AHB基址 ucPins:指定管腳的位組合表示,應當取下列值之一或者它們之間的任意“或運算”組合形式: GPIO_PIN_0 // GPIO管腳0的位表示(0x01) GPIO_PIN_1 // GPIO管腳1的位表示(0x02) GPIO_PIN_2 // GPIO管腳2的位表示(0x04) GPIO_PIN_3 // GPIO管腳3的位表示(0x08) GPIO_PIN_4 // GPIO管腳4的位表示(0x10) GPIO_PIN_5 // GPIO管腳5的位表示(0x20) GPIO_PIN_6 // GPIO管腳6的位表示(0x40) GPIO_PIN_7 // GPIO管腳7的位表示(0x80) ulPinIO:管腳的方向或模式,應當取下列值之一: GPIO_DIR_MODE_IN // 輸入方向 GPIO_DIR_MODE_OUT // 輸出方向 GPIO_DIR_MODE_HW // 硬件控制 返回 無
3:功能 設置所選GPIO端口指定管腳的驅動強度和類型 原型 void GPIOPadConfigSet(unsigned long ulPort, unsigned char ucPins, unsigned long ulStrength, unsigned long ulPadType) 參數(shù) ulPort:所選GPIO端口的基址 ucPins:指定管腳的位組合表示 ulStrength:指定輸出驅動強度,應當取下列值之一: GPIO_STRENGTH_2MA // 2mA驅動強度 GPIO_STRENGTH_4MA // 4mA驅動強度 GPIO_STRENGTH_8MA // 8mA驅動強度 GPIO_STRENGTH_8MA_SC // 帶轉換速率(Slew Rate) 控制的8mA驅動 ulPadType:指定管腳類型。應當取下列值之一: GPIO_PIN_TYPE_STD // 推挽 GPIO_PIN_TYPE_STD_WPU // 帶弱上拉的推挽 GPIO_PIN_TYPE_STD_WPD // 帶弱下拉的推挽 GPIO_PIN_TYPE_OD // 開漏 GPIO_PIN_TYPE_OD_WPU // 帶弱上拉的開漏 GPIO_PIN_TYPE_OD_WPD // 帶弱下拉的開漏 GPIO_PIN_TYPE_ANALOG // 模擬比較器 返回 無
4、GPIO管腳類型設置 這是一系列以GPIOPinType開頭的函數(shù)。對于前3個函數(shù),名稱太長,所以在我們實際編程當中常常采用簡短的定義: #define GPIOPinTypeIn GPIOPinTypeGPIOInput #define GPIOPinTypeOut GPIOPinTypeGPIOOutput #define GPIOPinTypeOD GPIOPinTypeGPIOOutputOD
函數(shù)GPIOPinTypeGPIOInput( ) 功能 設置所選GPIO端口指定的管腳為高阻輸入模式 原型 void GPIOPinTypeGPIOInput(unsigned long ulPort, unsigned char ucPins) 參數(shù) ulPort:所選GPIO端口的基址 ucPins:指定管腳的位組合表示 返回 無 舉例:GPIOPinTypeGPIOInput (GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1)
5:函數(shù)GPIOPinTypeGPIOOutput( ) 功能 設置所選GPIO端口指定的管腳為推挽輸出模式 原型 GPIOPinTypeGPIOOutput(unsigned long ulPort, unsigned char ucPins) 參數(shù) ulPort:所選GPIO端口的基址 ucPins:指定管腳的位組合表示 返回 無
6:函數(shù)GPIOPinTypeGPIOOutputOD( ) 功能 設置所選GPIO端口指定的管腳為開漏輸出模式 原型 GPIOPinTypeGPIOOutputOD(unsigned long ulPort, unsigned char ucPins) 參數(shù) ulPort:所選GPIO端口的基址 ucPins:指定管腳的位組合表示 返回 無 舉例:GPIOPinTypeGPIOOutputOD(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1)
7:函數(shù)GPIOPinTypeADC( ) 和這個函數(shù)一樣的還有: GPIOPinTypeCAN( )、 GPIOPinTypeComparator( ) GPIOPinTypeI2C( ) 、 GPIOPinTypePWM( ) GPIOPinTypeQEI( )、 GPIOPinTypeSSI( ) GPIOPinTypeSSI( )、 GPIOPinTypeUART( ) GPIOPinTypeUSBDigital( ) 功能 設置所選GPIO端口指定的管腳為ADC功能 原型 void GPIOPinTypeADC(unsigned long ulPort, unsigned char ucPins) 參數(shù) ulPort:所選GPIO端口的基址 ucPins:指定管腳的位組合表示 返回 無 說明 對于Sandstorm和Fury家族,ADC管腳是獨立存在的,沒有與任何GPIO管 腳復用,因此使用ADC功能時不需要調(diào)用本函數(shù)。對于2008年新推出的 DustDevil家族,ADC管腳與GPIO管腳是復用的,因此使用ADC功能時就 必須要調(diào)用本函數(shù)進行配置。
8:GPIO管腳讀寫 對GPIO管腳的讀寫操作是通過函數(shù)GPIOPinWrite( )和GPIOPinRead( )實現(xiàn)的,這是兩個非常重要而且很常用的庫函數(shù)。
函數(shù)GPIOPinWrite( ) 功能 向所選GPIO端口的指定管腳寫入一個值,以更新管腳狀態(tài) 原型 void GPIOPinWrite(unsigned long ulPort, unsigned char ucPins, unsigned char ucVal); 參數(shù) ulPort:所選GPIO端口的基址 ucPins:指定管腳的位組合表示 ucVal:寫入指定管腳的值 注:ucPins指定的管腳對應的ucVal當中的位如果是1,則置位相應的管腳,如果是0,則 清零相應的管腳;ucPins未指定的管腳不受影響。 返回 無 示例 GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, 0x00); // 清除PA3 GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_5, 0xFF); // 置位PB5
// 同時置位PD2、PD6 GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_2 | GPIO_PIN_6, 0xFF);
// 變量ucData輸出到PA0~PA7 GPIOPinWrite(GPIO_PORTA_BASE, 0xFF, ucData);
9:函數(shù)GPIOPinRead( ) 功能 讀取所選GPIO端口指定管腳的值 原型 long GPIOPinRead(unsigned long ulPort, unsigned char ucPins) 參數(shù) ulPort:所選GPIO端口的基址 ucPins:指定管腳的位組合表示 返回 返回1個位組合的字節(jié)。該字節(jié)提供了由ucPins指定管腳的狀態(tài),對應的位 值表示GPIO管腳的高低狀態(tài)。ucPins未指定管腳位值是0。返回值已強制 轉換為long型,因此位31:8應該忽略。 示例 // 讀取PA4,返回值保存在ucData里,可能的值是0x00或0x10 ucData = GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_4); // 同時讀取PB1、PB2和PB6,返回PB1、PB2和PB6的位組合存在ucData里 ucData = GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_1 |GPIO_PIN_2 | GPIO_PIN_6); // 讀取整個PF端口 ucData = GPIOPinRead(GPIO_PORTF_BASE, 0xFF);
10、GPIO中斷
在Stellaris系列ARM里,每個GPIO管腳都可以作為外部中斷輸入。中斷的觸發(fā)類型分為邊沿觸發(fā)和電平觸發(fā)兩大類,共5種,用起來非常靈活。 (1)配置GPIO管腳的中斷觸發(fā)方式可以通過調(diào)用函數(shù)GPIOIntTypeSet( )來實現(xiàn),函數(shù)GPIOIntTypeGet( )用來獲取配置情況。 (2)函數(shù)GPIOPinIntEnable( )和GPIOPinIntDisable( )用來使能和禁止GPIO管腳中斷。 (3)函數(shù)GPIOPinIntStatus( )用來獲取GPIO管腳的中斷狀態(tài)。在同一個GPIO端口上,8個GPIO管腳的中斷向量都是共用的。如果同時配置了同一端口上的多個管腳中斷,則可以先利用函數(shù)GPIOPinIntStatus( )讀取中斷狀態(tài),再進一步確認具體是哪個管腳產(chǎn)生的中斷請求。 (4)函數(shù)GPIOPinIntClear( )用來及時清除GPIO管腳的中斷狀態(tài)。 (5)函數(shù)GPIOPortIntRegister( )用來注冊一個GPIO端口中斷服務函數(shù),而注銷的方法是調(diào)用函數(shù)GPIOPortIntUnregister( )。
A:函數(shù)GPIOIntTypeSet( ) 能 設置所選GPIO端口指定管腳的中斷觸發(fā)類型 原型 void GPIOIntTypeSet(unsigned long ulPort, unsigned char ucPins, unsigned long ulIntType) 參數(shù) ulPort:所選GPIO端口的基址 ucPins:指定管腳的位組合表示 ulIntType:指定中斷觸發(fā)機制的類型,應當取下列值之一: GPIO_FALLING_EDGE // 下降沿觸發(fā)中斷 GPIO_RISING_EDGE // 上升沿觸發(fā)中斷 GPIO_BOTH_EDGES // 雙邊沿觸發(fā)中斷(上升沿和下降沿都會觸發(fā)中斷) GPIO_LOW_LEVEL // 低電平觸發(fā)中斷 GPIO_HIGH_LEVEL // 高電平觸發(fā)中斷 返回 無 舉例:GPIOIntTypeSet (GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1), GPIO_FALLING_EDGE
B:函數(shù)GPIOIntTypeGet( ) 功能 獲取所選GPIO端口指定管腳的中斷觸發(fā)類型 原型 unsigned long GPIOIntTypeGet(unsigned long ulPort, unsigned char ucPin) 參數(shù) ulPort:所選GPIO端口的基址 ucPins:指定管腳的位組合表示 返回 與上表當中參數(shù)ulIntType的取值相同
C:函數(shù)GPIOPinIntEnable( ) 功能 使能所選GPIO端口指定管腳的中斷 原型 void GPIOPinIntEnable(unsigned long ulPort, unsigned char ucPins) 參數(shù) ulPort:所選GPIO端口的基址 ucPins:指定管腳的位組合表示 返回 無 D:函數(shù)GPIOPinIntDisable( ) 功能 禁止所選GPIO端口指定管腳的中斷 原型 void GPIOPinIntDisable(unsigned long ulPort, unsigned char ucPins) 參數(shù) ulPort:所選GPIO端口的基址 ucPins:指定管腳的位組合表示 返回 無
E:函數(shù)GPIOPinIntStatus( ) 功能 獲取所選GPIO端口所有管腳的中斷狀態(tài) 原型 long GPIOPinIntStatus(unsigned long ulPort, tBoolean bMasked) 參數(shù) ulPort:所選GPIO端口的基址 bMasked:屏蔽標志,如果是true則返回屏蔽的中斷狀態(tài),如果是false則返 回原始的中斷狀態(tài) 返回 1個位組合字節(jié)。在該字節(jié)中置位的位用來識別一個有效的屏蔽中斷或原始 中斷。字節(jié)的位0代表GPIO端口管腳0、位1代表GPIO端口管腳1,等等。 返回值已被強制轉換為long型,因此位31:8應該忽略。
F:函數(shù)GPIOPinIntClear( ) 功能 清除所選GPIO端口指定管腳的中斷 原型 void GPIOPinIntClear(unsigned long ulPort, unsigned char ucPins) 參數(shù) ulPort:所選GPIO端口的基址 ucPins:指定管腳的位組合表示 返回 無
G:功能 注冊所選GPIO端口的一個中斷處理程序 原型 void GPIOPortIntRegister(unsigned long ulPort, void (*pfnIntHandler)(void)) 參數(shù) ulPort:所選GPIO端口的基址 pfnIntHandler:函數(shù)指針,指向GPIO端口中斷處理函數(shù) 返回 無
H:函數(shù)GPIOPortIntUnregister( ) 功能 注銷所選GPIO端口的中斷處理程序 原型 void GPIOPortIntUnregister(unsigned long ulPort) 參數(shù) ulPort:所選GPIO端口的基址 返回 無
// Set GPIO A0 and A1 as UART pins. // GPIOPinConfigure(GPIO_PA0_U0RX); GPIOPinConfigure(GPIO_PA1_U0TX); ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ); // // Enable the pull-ups on the JTAG signals. // // SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); // GPIOPadConfigSet(GPIO_PORTC_BASE, // GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3, // GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
// // Configure CAN Pins.
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); GPIOPinTypeCAN(GPIO_PORTB_BASE, GPIO_PIN_4 | GPIO_PIN_5); GPIOPinConfigure(GPIO_PB4_CAN0RX); GPIOPinConfigure(GPIO_PB5_CAN0TX);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); GPIOPinTypeCAN(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_1); GPIOPinConfigure(GPIO_PF0_CAN1RX); GPIOPinConfigure(GPIO_PF1_CAN1TX);
// // Enable the CAN controller. // SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0); SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN1);
// // Reset the state of all the message object and the state of the CAN // module to a known state. // CANInit(CAN0_BASE); CANInit(CAN1_BASE);
// // Configure the bit rate for the CAN device, the clock rate to the CAN // controller is fixed at 8MHz for this class of device and the bit rate is // set to 250000. // CANBitRateSet(CAN0_BASE, 8000000, 20000); CANBitRateSet(CAN1_BASE, 8000000, 20000);
// // Take the CAN0 device out of INIT state. // CANEnable(CAN0_BASE); CANEnable(CAN1_BASE);
// // Enable interrups from CAN controller. // CANIntEnable(CAN0_BASE, CAN_INT_MASTER | CAN_INT_ERROR); CANIntEnable(CAN1_BASE, CAN_INT_MASTER | CAN_INT_ERROR);
// // Set up the message object that will receive all messages on the CAN // bus. // //CANConfigureNetwork(); // This message object will receive updates for the LED brightness. // g_MsgObjectLED.ulMsgID = 0x21; g_MsgObjectLED.ulMsgIDMask = 0;
幾個頭文件的說明
Void UARTIntHandler(void) 中斷函數(shù)的定義 The UART interrupt handler.
11: Stellaris?UART正常的異步串行通信,涉及如下內(nèi)容:
1) 波特率的產(chǎn)生 波特率除數(shù)公式: BRD= IBRD*FBRD = SystemClock/(16×BaudRate) 其中: BRD是22位的波特率除數(shù),由16位整數(shù)和6位小數(shù)組成 IBRD是BRD的整數(shù)部分 FBRD是BRD的小數(shù)部分 SystemClock是系統(tǒng)時鐘(UART模塊的時鐘直接來自SystemClock) BaudRate是波特率(9600,38400,115200等)
例如,假定系統(tǒng)時鐘為20MHz,波特率115200。計算UARTIBRD和UARTFBRD? BRD = 20,000,000 / (16 * 115,200) = 10.8507 UARTIBRD=10 UARTFBRD=integer(0.8507 * 64 + 0.5) = 54 在UART接收器空閑時,如果數(shù)據(jù)輸入變成“低電平”,即接收到了起始位,則接收計數(shù)器開始運行,并且數(shù)據(jù)在Baud16的第8個周期被采樣。如果Rx在Baud16的第8周期仍然為低電平,則起始位有效,否則會被認為是錯誤的起始位并將其忽略。 如果起始位有效,則根據(jù)數(shù)據(jù)字符被編程的長度,在Baud16的每第16個周期對連續(xù)的數(shù)據(jù)位(即一個位周期之后)進行采樣。如果奇偶校驗模式使能,則還會檢測奇偶校驗位。 最后,如果Rx為高電平,則有效的停止位被確認,否則發(fā)生幀錯誤。當接收到一個完整的字符時,將數(shù)據(jù)存放在接收FIFO中。
2) 初始化 要使用UART,必須使能外設時鐘,這可以通過將RCGC1寄存器中的UART0、 UART1或 UART2 位置位來實現(xiàn)。 本小節(jié)討論了使用UART模塊所需的步驟。例如,假定系統(tǒng)時鐘為20MHz,且所需的UART配置為: ■ 波特率115200 ■ 數(shù)據(jù)長度8位 ■ 1個停止位 ■ 無奇偶校驗 ■ FIFO禁能 ■ 無中斷 因為對UARTIBRD和UARTFBRD寄存器的寫操作必須先于UARTLCRH寄存器,所以在對UART進行編程時,首先要考慮的是波特率除數(shù)(BRD)。而BRD可以通過等式計算得到: BRD = 20,000,000 / (16 * 115,200) = 10.8507 即UARTIBRD 寄存器的DIVINT位域應該設為10。加載到UARTFBRD 寄存器的值是通過以下等式算出來的: UARTFBRD[DIVFRAC] = integer(0.8507 * 64 + 0.5) = 54 如此便得到了BRD的值,接著要按照以下順序將UART配置寫入模塊: 1. 將UARTCTL寄存器中的UARTEN位清零,以便將UART禁能。 2. 將BRD的整數(shù)部分寫入UARTIBRD寄存器。 3. 將BRD的小數(shù)部分寫入UARTFBRD寄存器。 4. 將所需的串行參數(shù)寫入UARTLCRH寄存器(這種情況下為0x0000.0060)。 5. 將UARTCTL寄存器中的UARTEN位置位,以便將UART使能。 UARTConfigSetExpClk( )用來對UART端口的波特率、數(shù)據(jù)格式進行配置。UARTConfigGetExpClk( )用來獲取當前的配置情況。參見表1和表2的描述。 功能 UART配置(要求提供明確的時鐘速率) 原型 void UARTConfigSetExpClk(unsigned long ulBase,unsigned long ulUARTClk, unsigned long ulBaud, unsigned long ulConfig) 參數(shù) ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或UART2_BASE ulUARTClk:提供給UART模塊的時鐘速率,即系統(tǒng)時鐘頻率 ulBaud:期望設定的波特率 ulConfig:UART端口的數(shù)據(jù)格式,取下列各組數(shù)值之間的“或運算”組合形式: ● 數(shù)據(jù)字長度 UART_CONFIG_WLEN_8 // 8位數(shù)據(jù) UART_CONFIG_WLEN_7 // 7位數(shù)據(jù) UART_CONFIG_WLEN_6 // 6位數(shù)據(jù) UART_CONFIG_WLEN_5 // 5位數(shù)據(jù) ● 停止位 UART_CONFIG_STOP_ONE // 1個停止位 UART_CONFIG_STOP_TWO // 2個停止位(可降低誤碼率) ● 校驗位 UART_CONFIG_PAR_NONE // 無校驗 UART_CONFIG_PAR_EVEN // 偶校驗 UART_CONFIG_PAR_ODD // 奇校驗 UART_CONFIG_PAR_ONE // 校驗位恒為1 UART_CONFIG_PAR_ZERO // 校驗位恒為0 返回 無 表2 函數(shù)UARTConfigGetExpClk( ) 功能 獲取UART的配置(要求提供明確的時鐘速率) 原型 void UARTConfigGetExpClk(unsigned long ulBase, unsigned long ulUARTClk, unsigned long *pulBaud, unsigned long *pulConfig) 參數(shù) ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或UART2_BASE ulUARTClk:提供給UART模塊的時鐘速率,即系統(tǒng)時鐘頻率 pulBaud:指針,指向保存獲取的波特率的緩沖區(qū) pulConfig:指針,指向保存UART端口的數(shù)據(jù)格式的緩沖區(qū),參見表1參數(shù)ulConfig的描述 返回 無
在實際編程時,往往用兩個形式更簡單的宏函數(shù)UARTConfigSet( )和UARTConfigGet( )來代替上述兩個庫函數(shù)。參見表3和表4的描述。
表3宏函數(shù)UARTConfigSet( ) 功能 UART配置(自動獲取時鐘速率) 原型 #define UARTConfigSet(a, b, c) UARTConfigSetExpClk(a, SysCtlClockGet( ), b, c) 參數(shù) 詳見表1的描述 返回 無 說明 本宏函數(shù)常常用來代替函數(shù)UARTConfigSetExpClk( ),在調(diào)用之前應當先調(diào)用 SysCtlClockSet()函數(shù)設置系統(tǒng)時鐘(不要使用誤差很大的內(nèi)部振蕩器IOSC、IOSC/4、 INT30等) 示例 // 配置UART0:波特率9600,8個數(shù)據(jù)位,1個停止位,無校驗 UARTConfigSet(UART0_BASE, 9600, UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE); // 配置UART1:波特率最大,5個數(shù)據(jù)位,1個停止位,無校驗 UARTConfigSet(UART1_BASE, SysCtlClockGet( ) / 16, UART_CONFIG_WLEN_5 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE); // 配置UART2:波特率2400,8個數(shù)據(jù)位,2個停止位,偶校驗 UARTConfigSet(UART2_BASE, 2400, UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_TWO | UART_CONFIG_PAR_EVEN);
表4宏函數(shù)UARTConfigGet( ) 功能 獲取UART的配置(自動獲取時鐘速率) 原型 #define UARTConfigGet(a, b, c) UARTConfigGetExpClk(a, SysCtlClockGet( ), b, c) 參數(shù) 詳見表1和表2的描述 返回 無
函數(shù)UARTParityModeSet( )用來設置校驗位的類型,但在實際編程時一般不會用到它,因為在UARTConfigSet( )的參數(shù)里已經(jīng)包含了對校驗位的配置。函數(shù)UARTParityModeGet( )用來獲取校驗位的設置情況。參見表5和表6的描述。 功能 設置指定UART端口的校驗類型 原型 void UARTParityModeSet(unsigned long ulBase, unsigned long ulParity) 參數(shù) ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或UART2_BASE ulParity:指定使用的校驗類型,取下列值之一: UART_CONFIG_PAR_NONE // 無校驗 UART_CONFIG_PAR_EVEN // 偶校驗 UART_CONFIG_PAR_ODD // 奇校驗 UART_CONFIG_PAR_ONE // 校驗位恒為1 UART_CONFIG_PAR_ZERO // 校驗位恒為0 返回 無
功能 獲取指定UART端口正在使用的校驗類型 原型 unsigned long UARTParityModeGet(unsigned long ulBase) 參數(shù) ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或UART2_BASE 返回 校驗類型,與表5當中參數(shù)ulParity的取值相同
函數(shù)UARTFIFOLevelSet( )和UARTFIFOLevelGet( )用來設置和獲取收發(fā)FIFO觸發(fā)中斷時的深度級別。參見表7和表8描述 功能 設置使指定UART端口產(chǎn)生中斷的收發(fā)FIFO深度級別 原型 void UARTFIFOLevelSet(unsigned long ulBase, unsigned long ulTxLevel, unsigned long ulRxLevel) 參數(shù) ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或UART2_BASE ulTxLevel:發(fā)送中斷FIFO的深度級別,取下列值之一: UART_FIFO_TX1_8 // 在1/8深度時產(chǎn)生發(fā)送中斷 UART_FIFO_TX2_8 // 在1/4深度時產(chǎn)生發(fā)送中斷 UART_FIFO_TX4_8 // 在1/2深度時產(chǎn)生發(fā)送中斷 UART_FIFO_TX6_8 // 在3/4深度時產(chǎn)生發(fā)送中斷 UART_FIFO_TX7_8 // 在7/8深度時產(chǎn)生發(fā)送中斷 注:當發(fā)送FIFO里剩余的數(shù)據(jù)減少到預設的深度時觸發(fā)中斷,而非填充到預設深度時觸發(fā)中 斷。因 此在需要發(fā)送大量數(shù)據(jù)的應用場合,為了減少中斷次數(shù)提高發(fā)送效率,發(fā)送FIFO中斷觸發(fā)深度 級別設置的越淺越好,如設置為UART_FIFO_TX1_8。 UART_FIFO_RX1_8 // 在1/8深度時產(chǎn)生接收中斷 UART_FIFO_RX2_8 // 在1/4深度時產(chǎn)生接收中斷 UART_FIFO_RX4_8 // 在1/2深度時產(chǎn)生接收中斷 UART_FIFO_RX6_8 // 在3/4深度時產(chǎn)生接收中斷 UART_FIFO_RX7_8 // 在7/8深度時產(chǎn)生接收中斷 注:當接收FIFO里已有的數(shù)據(jù)累積到預設的深度時觸發(fā)中斷,因此在需要接收大量數(shù)據(jù)的應用場 合,為了減少中斷次數(shù)提高接收效率,接收FIFO中斷觸發(fā)深度級別設置的越深越好,如設置為 UART_FIFO_RX7_8。 返回 無
功能 獲取使指定UART端口產(chǎn)生中斷的收發(fā)FIFO深度級別 原型 void UARTFIFOLevelGet(unsigned long ulBase, unsigned long *pulTxLevel, unsigned long *pulRxLevel) 參數(shù) ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或UART2_BASE pulTxLevel:指針,指向保存發(fā)送中斷FIFO的深度級別的緩沖區(qū) pulRxLevel:指針,指向保存接收中斷FIFO的深度級別的緩沖區(qū) 返回 無
(2) 使能與禁止 函數(shù)UARTEnable( )和UARTDisable( )用來使能和禁止UART端口的收發(fā)功能。一般是先配置UART,最后使能收發(fā)。當需要修改UART配置時,應當先禁止,配置完成后再使能。參見表9和表10的描述。
表11 函數(shù)UARTEnableSIR( )
表12 函數(shù)UARTDisableSIR( )
函數(shù)UARTDMAEnable( )和UARTDMADisable( )用來使能和禁止UART端口的DMA(Direct Memory Access,直接存儲器訪問)操作。在2008年新推出的DustDevil家族里,新增了一個μDMA控制器。UART端口也支持DMA傳輸,能夠提高大批量傳輸數(shù)據(jù)的效率。參見表13和表14的描述。
函數(shù)UARTCharPut( )以輪詢的方式發(fā)送數(shù)據(jù),如果發(fā)送FIFO有空位則填充要發(fā)送的數(shù)據(jù),如果沒有空位則一直等待。參見表15的描述
函數(shù)UARTCharGet( )以輪詢的方式接收數(shù)據(jù),如果接收FIFO里有數(shù)據(jù)則讀出數(shù)據(jù)并返回,如果沒有數(shù)據(jù)則一直等待。參見表16的描述。 函數(shù)UARTSpaceAvail( )用來探測發(fā)送FIFO里是否有可用的空位。該函數(shù)一般用在正式發(fā)送之前,以避免長時間的等待。參見表17的描述。 函數(shù)UARTCharsAvail( )用來探測接收FIFO里是否有接收到的數(shù)據(jù)。該函數(shù)一般用在正式接收之前,以避免長時間的等待。參見表18的描述。
以上圖文的Word格式文檔下載(內(nèi)容和本網(wǎng)頁上的一模一樣,方便大家保存):
TI M3庫函數(shù)說明.doc
(1.21 MB, 下載次數(shù): 3)
2023-12-17 21:30 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|