本帖最后由 nwx8899 于 2011-12-28 20:14 编辑
LM3S811使用心得之三 串口通信
利用 串口调试助手 实现LM3S811与PC机之间通信。
一 以下首先是一些关于LM3S811 UART模块的总结
1、
函数:UARTConfigSetExpClk( )
功能: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端口的数据格式,取下列各组数值之间的“或运算”组合形式:
2、
函数:UARTConfigSet( )
功能:UART配置(自动获取时钟速率)
原型:#define UARTConfigSet(a, b, c) UARTConfigSetExpClk(a, SysCtlClockGet( ), b, c)
参数:详见UARTConfigSetExpClk函数描述
返回:无
说明:本宏函数常常用来代替函数UARTConfigSetExpClk( ),在调用之前应当先调用SysCtlClockSet( )函数设置系统时钟(不要使用误差很大的内部振荡器IOSC、IOSC/4、INT30等)
3、
函数:UARTEnable( )
功能:使能指定UART端口的发送和接收操作
原型:void UARTEnable(unsigned long ulBase)
参数:ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE
4、函数:UARTCharPut( )
功能:发送1个字符到指定的UART端口(等待)
原型:void UARTCharPut(unsigned long ulBase, unsigned char ucData)
参数:ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或UART2_BASE
ulData:要发送的字符
返回:无(在未发送完毕前不会返回)
5、函数:UARTCharGet( )
功能:从指定的UART端口接收1个字符(等待)
原型:long UARTCharGet(unsigned long ulBase)
参数:ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或UART2_BASE
返回:读取到的字符,并自动转换为long型(在未收到字符之前会一直等待)
6、函数:UARTCharPutNonBlocking( )
功能:发送1个字符到指定的UART端口(不等待)
原型:tBoolean UARTCharPutNonBlocking(unsigned long ulBase, unsigned char ucData)
参数:ulBase:UART端口的基址,取值UART0_BASE、UART1_BASE或UART2_BASE
ulData:要发送的字符
返回:如果发送FIFO里有可用空间,则将数据放入发送FIFO,并立即返回true
如果发送FIFO里没有可用空间,则立即返回false(发送失败)
说明:通常,在调用本函数之前应当先调用UARTSpaceAvail( )确认发送FIFO里有可用空间
二 任务
以下程序主要实现的目的是:首先LM3S811向PC发送“请输入密码”,如果在串口调试助手上正确输入程序预先设置的密码(nwx8899),则串口调试助手将再次收到“您是我们的会员,欢迎光临!”的字样;否则将受到:”对不起,密码错误!“
[attach]8
7417[/a
ttach]
三 代码
#include "hw_types.h"
#include "hw_memmap.h"
#include "gpio.h"
#include "uart.h"
//防止JTAG失效,上电或者复位时按下板上的USER按键,进去此函数,板上LED一直闪烁。
void JtagWait(void)
{
unsigned long i;
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
// 使能KEY、LED所在的PC端口
GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, GPIO_PIN_4);
// 设置KEY所在管脚PC4为输入
GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_5 );
// 设置LED所在管脚PC5为输出
if (GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_4) == 0x00)
// 若复位或上电时按下KEY,则进入
{
while(1)
//死循环,以等待JTAG连接,LED闪烁
{
for(i=0;i<200000;i++);
GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_5,GPIO_PIN_5);
//点亮LED
for(i=0;i<200000;i++);
GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_5,~GPIO_PIN_5);
//熄灭LED
}
}
SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOC);
// 禁止KEY所在的GPIO端口
}
// Send strings to the UART0.
void Uart0SendStrings(unsigned char *pStr)
{
while((*pStr!='\0'))
{
//Sends the character ucData to the transmit FIFO for the specified port.
//If there is no space available in the transmit FIFO, this
//function will wait until there is space available before return-ing.
UARTCharPut(UART0_BASE, *(pStr++));
//发送字符,若FIFO满,自动等待
//Writes the character ucData to the transmit FIFO for the speci?ed port.
//This function does not block, so if there is no space available,
//then a false is returned, and the application will have to retry the function later.
//UARTCharPutNonBlocking(UART0_BASE, *(pStr++));
//发送字符,若FIFO满,返回false
}
}
//主函数
int main(void)
{
char cThisChar;
unsigned char arr[20];
unsigned char ans[] = "nwx8899\0";
int i=0;
int DoorFlag = 1;
//int i = 0;
// Set GPIO A0 and A1 as UART pins.
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
// Configure the UART for 115,200, 8-N-1 operation.
UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 9600,
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));
//发送一串字符
//while(1)
//{
do
{
//
// Read a character using the blocking read function. This function
// will not return until a character is available.
//
cThisChar = UARTCharGet(UART0_BASE);
arr[i++] = cThisChar;
//
// Write the same character using the blocking write function. This
// function will not return until there was space in the FIFO and
// the character is written.
//
UARTCharPut(UART0_BASE, cThisChar);
//
// Stay in the loop until either a CR or LF is received.
//
} while((cThisChar != '\n') && (cThisChar != '\r'));
arr = '\0';
Uart0SendStrings("Result:\n");
DoorFlag = 1;
for(i=0;i<7;++i)
{
if(arr != ans)
DoorFlag = 0;
}
if(DoorFlag == 1)
Uart0SendStrings("您是我们的会员,欢迎光临!\n");
else
Uart0SendStrings("对不起,密码错误!\n");
//UARTCharPut(UART0_BASE, arr);
//Uart0SendStrings(arr);
//Uart0SendStrings(ans);
//}
//GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_5,GPIO_PIN_5);
//点亮LED
//while(1);
}
|