通常对CM3内部资源应用,软件有三种不同的形式可操作:一种就是用最低层的汇编语言操作;第二种就是用C语直接寄存器操作;第三种就是利用提供的API库函数进行操作。由于提供库函数操作简单,同时都是经过认证通过的,因此,下面主要讲解API库函数。
1:通常,Stellaris系列ARM所有片内外设只有在使能以后才可以工作,否则被禁止。暂时不用的片内外设被禁止后可以节省功耗。GPIO也不例外,复位时所有GPIO模块都被禁止,在使用GPIO模块之前必须首先要使能。例如: SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); // 使能GPIOB模块 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); // 使能GPIOG模块
2:这几个函数用来设置GPIO管脚的方向和模式、电流驱动强度和类型。但是在我们的实际编程当中它们并不常用,而是采用更加方便的GPIOPinType系列函数来代替。 GPIO管脚的方向可以设置为输入方向或输出方向。很多片内外设的特定功能管脚,如UART模块的Rx和Tx、Timer模块的CCP管脚等,都与GPIO管脚复用,如果要使用这些特定功能,则必须先要把GPIO管脚的模式设置为硬件自动管理。 GPIO管脚的电流驱动强度可以选择2mA、4mA、8mA或者带转换速率(Slew Rate)控制的8mA驱动。驱动强度越大表明带负载能力越强,但功耗也越高。对绝大多数应用场合选择2mA驱动即可满足要求。GPIO管脚类型可以配置成输入、推挽、开漏三大类,每一类当中还有上拉、下拉的区别。对于配置用作输入端口的管脚,端口可按照要求设置,但是对输入唯一真正有影响的是上拉或下拉终端的配置。关于转换速率(Slew Rate)。对输出信号采取适当舒缓的转换速率控制对抑制信号在传输线上的反射和电磁干扰非常有效。按照Stellaris系列ARM数据手册里给出的数据:在2mA驱动下GPIO输出的上升和下降时间为17ns(典型值,下同);而在8mA驱动下加快到6ns,电磁干扰现象可能比较突出;但在使能8mA转换速率控制以后上升和下降时间分别为10ns和11ns,有了明显的延缓。8mA驱动在使能其转换速率控制后,并不影响其直流驱动能力,仍然是8mA。
功能 设置所选GPIO端口指定管脚的方向和模式 原型 void GPIODirModeSet(unsigned long ulPort, unsigned char ucPins, unsigned long ulPinIO) 参数 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高速总线访问)。如果已经用函数SysCtlGPIOAHBEnable( )使能了AHB功能,则参数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) 参数 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开头的函数。对于前3个函数,名称太长,所以在我们实际编程当中常常采用简短的定义: #define GPIOPinTypeIn GPIOPinTypeGPIOInput #define GPIOPinTypeOut GPIOPinTypeGPIOOutput #define GPIOPinTypeOD GPIOPinTypeGPIOOutputOD
函数GPIOPinTypeGPIOInput( ) 功能 设置所选GPIO端口指定的管脚为高阻输入模式 原型 void GPIOPinTypeGPIOInput(unsigned long ulPort, unsigned char ucPins) 参数 ulPort:所选GPIO端口的基址 ucPins:指定管脚的位组合表示 返回 无 举例:GPIOPinTypeGPIOInput (GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1)
5:函数GPIOPinTypeGPIOOutput( ) 功能 设置所选GPIO端口指定的管脚为推挽输出模式 原型 GPIOPinTypeGPIOOutput(unsigned long ulPort, unsigned char ucPins) 参数 ulPort:所选GPIO端口的基址 ucPins:指定管脚的位组合表示 返回 无
6:函数GPIOPinTypeGPIOOutputOD( ) 功能 设置所选GPIO端口指定的管脚为开漏输出模式 原型 GPIOPinTypeGPIOOutputOD(unsigned long ulPort, unsigned char ucPins) 参数 ulPort:所选GPIO端口的基址 ucPins:指定管脚的位组合表示 返回 无 举例:GPIOPinTypeGPIOOutputOD(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1)
7:函数GPIOPinTypeADC( ) 和这个函数一样的还有: GPIOPinTypeCAN( )、 GPIOPinTypeComparator( ) GPIOPinTypeI2C( ) 、 GPIOPinTypePWM( ) GPIOPinTypeQEI( )、 GPIOPinTypeSSI( ) GPIOPinTypeSSI( )、 GPIOPinTypeUART( ) GPIOPinTypeUSBDigital( ) 功能 设置所选GPIO端口指定的管脚为ADC功能 原型 void GPIOPinTypeADC(unsigned long ulPort, unsigned char ucPins) 参数 ulPort:所选GPIO端口的基址 ucPins:指定管脚的位组合表示 返回 无 说明 对于Sandstorm和Fury家族,ADC管脚是独立存在的,没有与任何GPIO管 脚复用,因此使用ADC功能时不需要调用本函数。对于2008年新推出的 DustDevil家族,ADC管脚与GPIO管脚是复用的,因此使用ADC功能时就 必须要调用本函数进行配置。
8:GPIO管脚读写 对GPIO管脚的读写操作是通过函数GPIOPinWrite( )和GPIOPinRead( )实现的,这是两个非常重要而且很常用的库函数。
函数GPIOPinWrite( ) 功能 向所选GPIO端口的指定管脚写入一个值,以更新管脚状态 原型 void GPIOPinWrite(unsigned long ulPort, unsigned char ucPins, unsigned char ucVal); 参数 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:函数GPIOPinRead( ) 功能 读取所选GPIO端口指定管脚的值 原型 long GPIOPinRead(unsigned long ulPort, unsigned char ucPins) 参数 ulPort:所选GPIO端口的基址 ucPins:指定管脚的位组合表示 返回 返回1个位组合的字节。该字节提供了由ucPins指定管脚的状态,对应的位 值表示GPIO管脚的高低状态。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管脚都可以作为外部中断输入。中断的触发类型分为边沿触发和电平触发两大类,共5种,用起来非常灵活。 (1)配置GPIO管脚的中断触发方式可以通过调用函数GPIOIntTypeSet( )来实现,函数GPIOIntTypeGet( )用来获取配置情况。 (2)函数GPIOPinIntEnable( )和GPIOPinIntDisable( )用来使能和禁止GPIO管脚中断。 (3)函数GPIOPinIntStatus( )用来获取GPIO管脚的中断状态。在同一个GPIO端口上,8个GPIO管脚的中断向量都是共用的。如果同时配置了同一端口上的多个管脚中断,则可以先利用函数GPIOPinIntStatus( )读取中断状态,再进一步确认具体是哪个管脚产生的中断请求。 (4)函数GPIOPinIntClear( )用来及时清除GPIO管脚的中断状态。 (5)函数GPIOPortIntRegister( )用来注册一个GPIO端口中断服务函数,而注销的方法是调用函数GPIOPortIntUnregister( )。
A:函数GPIOIntTypeSet( ) 能 设置所选GPIO端口指定管脚的中断触发类型 原型 void GPIOIntTypeSet(unsigned long ulPort, unsigned char ucPins, unsigned long ulIntType) 参数 ulPort:所选GPIO端口的基址 ucPins:指定管脚的位组合表示 ulIntType:指定中断触发机制的类型,应当取下列值之一: GPIO_FALLING_EDGE // 下降沿触发中断 GPIO_RISING_EDGE // 上升沿触发中断 GPIO_BOTH_EDGES // 双边沿触发中断(上升沿和下降沿都会触发中断) GPIO_LOW_LEVEL // 低电平触发中断 GPIO_HIGH_LEVEL // 高电平触发中断 返回 无 举例:GPIOIntTypeSet (GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1), GPIO_FALLING_EDGE
B:函数GPIOIntTypeGet( ) 功能 获取所选GPIO端口指定管脚的中断触发类型 原型 unsigned long GPIOIntTypeGet(unsigned long ulPort, unsigned char ucPin) 参数 ulPort:所选GPIO端口的基址 ucPins:指定管脚的位组合表示 返回 与上表当中参数ulIntType的取值相同
C:函数GPIOPinIntEnable( ) 功能 使能所选GPIO端口指定管脚的中断 原型 void GPIOPinIntEnable(unsigned long ulPort, unsigned char ucPins) 参数 ulPort:所选GPIO端口的基址 ucPins:指定管脚的位组合表示 返回 无 D:函数GPIOPinIntDisable( ) 功能 禁止所选GPIO端口指定管脚的中断 原型 void GPIOPinIntDisable(unsigned long ulPort, unsigned char ucPins) 参数 ulPort:所选GPIO端口的基址 ucPins:指定管脚的位组合表示 返回 无
E:函数GPIOPinIntStatus( ) 功能 获取所选GPIO端口所有管脚的中断状态 原型 long GPIOPinIntStatus(unsigned long ulPort, tBoolean bMasked) 参数 ulPort:所选GPIO端口的基址 bMasked:屏蔽标志,如果是true则返回屏蔽的中断状态,如果是false则返 回原始的中断状态 返回 1个位组合字节。在该字节中置位的位用来识别一个有效的屏蔽中断或原始 中断。字节的位0代表GPIO端口管脚0、位1代表GPIO端口管脚1,等等。 返回值已被强制转换为long型,因此位31:8应该忽略。
F:函数GPIOPinIntClear( ) 功能 清除所选GPIO端口指定管脚的中断 原型 void GPIOPinIntClear(unsigned long ulPort, unsigned char ucPins) 参数 ulPort:所选GPIO端口的基址 ucPins:指定管脚的位组合表示 返回 无
G:功能 注册所选GPIO端口的一个中断处理程序 原型 void GPIOPortIntRegister(unsigned long ulPort, void (*pfnIntHandler)(void)) 参数 ulPort:所选GPIO端口的基址 pfnIntHandler:函数指针,指向GPIO端口中断处理函数 返回 无
H:函数GPIOPortIntUnregister( ) 功能 注销所选GPIO端口的中断处理程序 原型 void GPIOPortIntUnregister(unsigned long ulPort) 参数 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) 中断函数的定义 The UART interrupt handler.
11: Stellaris?UART正常的异步串行通信,涉及如下内容:
1) 波特率的产生 波特率除数公式: BRD= IBRD*FBRD = SystemClock/(16×BaudRate) 其中: BRD是22位的波特率除数,由16位整数和6位小数组成 IBRD是BRD的整数部分 FBRD是BRD的小数部分 SystemClock是系统时钟(UART模块的时钟直接来自SystemClock) BaudRate是波特率(9600,38400,115200等)
例如,假定系统时钟为20MHz,波特率115200。计算UARTIBRD和UARTFBRD? BRD = 20,000,000 / (16 * 115,200) = 10.8507 UARTIBRD=10 UARTFBRD=integer(0.8507 * 64 + 0.5) = 54 在UART接收器空闲时,如果数据输入变成“低电平”,即接收到了起始位,则接收计数器开始运行,并且数据在Baud16的第8个周期被采样。如果Rx在Baud16的第8周期仍然为低电平,则起始位有效,否则会被认为是错误的起始位并将其忽略。 如果起始位有效,则根据数据字符被编程的长度,在Baud16的每第16个周期对连续的数据位(即一个位周期之后)进行采样。如果奇偶校验模式使能,则还会检测奇偶校验位。 最后,如果Rx为高电平,则有效的停止位被确认,否则发生帧错误。当接收到一个完整的字符时,将数据存放在接收FIFO中。
2) 初始化 要使用UART,必须使能外设时钟,这可以通过将RCGC1寄存器中的UART0、 UART1或 UART2 位置位来实现。 本小节讨论了使用UART模块所需的步骤。例如,假定系统时钟为20MHz,且所需的UART配置为: ■ 波特率115200 ■ 数据长度8位 ■ 1个停止位 ■ 无奇偶校验 ■ FIFO禁能 ■ 无中断 因为对UARTIBRD和UARTFBRD寄存器的写操作必须先于UARTLCRH寄存器,所以在对UART进行编程时,首先要考虑的是波特率除数(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的整数部分写入UARTIBRD寄存器。 3. 将BRD的小数部分写入UARTFBRD寄存器。 4. 将所需的串行参数写入UARTLCRH寄存器(这种情况下为0x0000.0060)。 5. 将UARTCTL寄存器中的UARTEN位置位,以便将UART使能。 UARTConfigSetExpClk( )用来对UART端口的波特率、数据格式进行配置。UARTConfigGetExpClk( )用来获取当前的配置情况。参见表1和表2的描述。 功能 UART配置(要求提供明确的时钟速率) 原型 void UARTConfigSetExpClk(unsigned long ulBase,unsigned long ulUARTClk, unsigned long ulBaud, unsigned long ulConfig) 参数 ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或UART2_BASE ulUARTClk:提供给UART模块的时钟速率,即系统时钟频率 ulBaud:期望设定的波特率 ulConfig:UART端口的数据格式,取下列各组数值之间的“或运算”组合形式: ● 数据字长度 UART_CONFIG_WLEN_8 // 8位数据 UART_CONFIG_WLEN_7 // 7位数据 UART_CONFIG_WLEN_6 // 6位数据 UART_CONFIG_WLEN_5 // 5位数据 ● 停止位 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 函数UARTConfigGetExpClk( ) 功能 获取UART的配置(要求提供明确的时钟速率) 原型 void UARTConfigGetExpClk(unsigned long ulBase, unsigned long ulUARTClk, unsigned long *pulBaud, unsigned long *pulConfig) 参数 ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或UART2_BASE ulUARTClk:提供给UART模块的时钟速率,即系统时钟频率 pulBaud:指针,指向保存获取的波特率的缓冲区 pulConfig:指针,指向保存UART端口的数据格式的缓冲区,参见表1参数ulConfig的描述 返回 无
在实际编程时,往往用两个形式更简单的宏函数UARTConfigSet( )和UARTConfigGet( )来代替上述两个库函数。参见表3和表4的描述。
表3宏函数UARTConfigSet( ) 功能 UART配置(自动获取时钟速率) 原型 #define UARTConfigSet(a, b, c) UARTConfigSetExpClk(a, SysCtlClockGet( ), b, c) 参数 详见表1的描述 返回 无 说明 本宏函数常常用来代替函数UARTConfigSetExpClk( ),在调用之前应当先调用 SysCtlClockSet()函数设置系统时钟(不要使用误差很大的内部振荡器IOSC、IOSC/4、 INT30等) 示例 // 配置UART0:波特率9600,8个数据位,1个停止位,无校验 UARTConfigSet(UART0_BASE, 9600, UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE); // 配置UART1:波特率最大,5个数据位,1个停止位,无校验 UARTConfigSet(UART1_BASE, SysCtlClockGet( ) / 16, UART_CONFIG_WLEN_5 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE); // 配置UART2:波特率2400,8个数据位,2个停止位,偶校验 UARTConfigSet(UART2_BASE, 2400, UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_TWO | UART_CONFIG_PAR_EVEN);
表4宏函数UARTConfigGet( ) 功能 获取UART的配置(自动获取时钟速率) 原型 #define UARTConfigGet(a, b, c) UARTConfigGetExpClk(a, SysCtlClockGet( ), b, c) 参数 详见表1和表2的描述 返回 无
函数UARTParityModeSet( )用来设置校验位的类型,但在实际编程时一般不会用到它,因为在UARTConfigSet( )的参数里已经包含了对校验位的配置。函数UARTParityModeGet( )用来获取校验位的设置情况。参见表5和表6的描述。 功能 设置指定UART端口的校验类型 原型 void UARTParityModeSet(unsigned long ulBase, unsigned long ulParity) 参数 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) 参数 ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或UART2_BASE 返回 校验类型,与表5当中参数ulParity的取值相同
函数UARTFIFOLevelSet( )和UARTFIFOLevelGet( )用来设置和获取收发FIFO触发中断时的深度级别。参见表7和表8描述 功能 设置使指定UART端口产生中断的收发FIFO深度级别 原型 void UARTFIFOLevelSet(unsigned long ulBase, unsigned long ulTxLevel, unsigned long ulRxLevel) 参数 ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或UART2_BASE ulTxLevel:发送中断FIFO的深度级别,取下列值之一: UART_FIFO_TX1_8 // 在1/8深度时产生发送中断 UART_FIFO_TX2_8 // 在1/4深度时产生发送中断 UART_FIFO_TX4_8 // 在1/2深度时产生发送中断 UART_FIFO_TX6_8 // 在3/4深度时产生发送中断 UART_FIFO_TX7_8 // 在7/8深度时产生发送中断 注:当发送FIFO里剩余的数据减少到预设的深度时触发中断,而非填充到预设深度时触发中 断。因 此在需要发送大量数据的应用场合,为了减少中断次数提高发送效率,发送FIFO中断触发深度 级别设置的越浅越好,如设置为UART_FIFO_TX1_8。 UART_FIFO_RX1_8 // 在1/8深度时产生接收中断 UART_FIFO_RX2_8 // 在1/4深度时产生接收中断 UART_FIFO_RX4_8 // 在1/2深度时产生接收中断 UART_FIFO_RX6_8 // 在3/4深度时产生接收中断 UART_FIFO_RX7_8 // 在7/8深度时产生接收中断 注:当接收FIFO里已有的数据累积到预设的深度时触发中断,因此在需要接收大量数据的应用场 合,为了减少中断次数提高接收效率,接收FIFO中断触发深度级别设置的越深越好,如设置为 UART_FIFO_RX7_8。 返回 无
功能 获取使指定UART端口产生中断的收发FIFO深度级别 原型 void UARTFIFOLevelGet(unsigned long ulBase, unsigned long *pulTxLevel, unsigned long *pulRxLevel) 参数 ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或UART2_BASE pulTxLevel:指针,指向保存发送中断FIFO的深度级别的缓冲区 pulRxLevel:指针,指向保存接收中断FIFO的深度级别的缓冲区 返回 无
(2) 使能与禁止 函数UARTEnable( )和UARTDisable( )用来使能和禁止UART端口的收发功能。一般是先配置UART,最后使能收发。当需要修改UART配置时,应当先禁止,配置完成后再使能。参见表9和表10的描述。
表11 函数UARTEnableSIR( )
表12 函数UARTDisableSIR( )
函数UARTDMAEnable( )和UARTDMADisable( )用来使能和禁止UART端口的DMA(Direct Memory Access,直接存储器访问)操作。在2008年新推出的DustDevil家族里,新增了一个μDMA控制器。UART端口也支持DMA传输,能够提高大批量传输数据的效率。参见表13和表14的描述。
函数UARTCharPut( )以轮询的方式发送数据,如果发送FIFO有空位则填充要发送的数据,如果没有空位则一直等待。参见表15的描述
函数UARTCharGet( )以轮询的方式接收数据,如果接收FIFO里有数据则读出数据并返回,如果没有数据则一直等待。参见表16的描述。 函数UARTSpaceAvail( )用来探测发送FIFO里是否有可用的空位。该函数一般用在正式发送之前,以避免长时间的等待。参见表17的描述。 函数UARTCharsAvail( )用来探测接收FIFO里是否有接收到的数据。该函数一般用在正式接收之前,以避免长时间的等待。参见表18的描述。
以上图文的Word格式文档下载(内容和本网页上的一模一样,方便大家保存):
TI M3库函数说明.doc
(1.21 MB, 下载次数: 3)
|