#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h" //单步调试
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
//#include "driverlib/rom.h" //使用rom里面固化的api函数,以节约flash空间
#include "driverlib/sysctl.h"
#include "driverlib/systick.h"
#include "driverlib/uart.h"
#include"stdio.h"
#define PINS GPIO_PIN_5
#define UARTCharPutNB UARTCharPutNonBlocking
void
uartInit(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);//使能UART模块
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//使能RX和TX所在的端口PA//
GPIOPinTypeUART(GPIO_PORTA_BASE, //配置RX和TX
GPIO_PIN_0|GPIO_PIN_1); //为收发功能//
UARTConfigSetExpClk(UART0_BASE,SysCtlClockGet(),//配置GPIO端口 ,系统时钟频率
9600,UART_CONFIG_WLEN_8| // 波特率9600,数据位8
UART_CONFIG_PAR_NONE| //效检位:无
UART_CONFIG_STOP_ONE); //停止位1
UARTEnable(UART0_BASE); //使能UART0
UARTFIFOLevelSet(UART0_BASE, //配置FIFO中断触发深度
UART_FIFO_TX2_8, //发送FIFO为2/8深度(4B)
UART_FIFO_RX6_8); //接收FIFO深度6/8深度(12B)
UARTIntEnable(UART0_BASE,UART_INT_TX); //使能发送中断//
IntEnable(INT_UART0); //能使UART0中断
IntMasterEnable(); //打开总中断//
UARTEnable(UART0_BASE); //使能UART端口//
}
void LED_INIT(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);//使能外设GIOPE
GPIOPadConfigSet(GPIO_PORTE_BASE, PINS,
GPIO_STRENGTH_4MA,
GPIO_PIN_TYPE_STD);//配置管脚驱动,驱动电流2MA其实已足够
GPIODirModeSet(GPIO_PORTE_BASE, PINS, GPIO_DIR_MODE_OUT);//设置管脚输出
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);//使能外设GIOPF
GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_2|GPIO_PIN_3, //PF2,PF3//
GPIO_STRENGTH_4MA,
GPIO_PIN_TYPE_STD);//配置管脚驱动,驱动电流2MA其实已足够
GPIODirModeSet(GPIO_PORTF_BASE, GPIO_PIN_2|GPIO_PIN_3, GPIO_DIR_MODE_OUT);//设置管脚输出
}
const char TxData[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
volatile int TxIndex=0;
volatile int n=0; //显示中断次数作用,因为板用8MHZ所以不宜定义长字符//
volatile tBoolean TxEndFlag = false;
//填充发送FIFO(填满FIFO之后就退出,不会等待)
void
TxFIFOFill(void)
{
char c;
for(;;)
{
c=TxData[TxIndex];
if(c=='\0') //若填充完毕//
{
TxEndFlag=true; //发送结束标志位,并退出//
break;
}
if(UARTSpaceAvail(UART0_BASE)) //若FIFO中有可用空间
{
UARTCharPutNB(UART0_BASE,c); //填充发FIFO
TxIndex++;
} else{ //若没有空则跳出//
break;
}
}
}
void UARTput(const char *pucBuffer) //通过UART发送字符串//
{
while(*pucBuffer)
{
// 通过字符串指针发送数据
UARTCharPutNonBlocking(UART0_BASE, *pucBuffer++);
}
}
int
main(void)
{
char S[40];
SysCtlClockSet(SYSCTL_OSC_MAIN|SYSCTL_XTAL_8MHZ|
SYSCTL_USE_OSC|SYSCTL_SYSDIV_1); //系统时钟
uartInit();
LED_INIT();
TxFIFOFill();
for(;;)
{
if(TxEndFlag) //若发送结束则跳出//
{
TxEndFlag=false;
break;
}
}
sprintf(S,"n=%d\r\n",n); //显示中断次数//
UARTput(S); //发送数据//
for(;;)
{
if(n>4)
{
GPIOPinWrite(GPIO_PORTE_BASE, PINS, ~PINS);//输出高电低PE5LED亮
}else{
GPIOPinWrite(GPIO_PORTE_BASE, PINS, PINS);//输出高电低PE5LED亮表明已进入中断
}
}
}
// UART0中断服务函数
void UART0_ISR(void)
{
unsigned long ulStatus;
ulStatus = UARTIntStatus(UART0_BASE, true); // 读取当前中断状态
UARTIntClear(UART0_BASE, ulStatus); // 清除中断状态
// GPIOPinWrite(GPIO_PORTE_BASE, PINS, ~PINS);//输出高电低PE5LED亮
if (ulStatus & UART_INT_TX) // 若是发送中断
{
TxFIFOFill();
n++;
//GPIOPinWrite(GPIO_PORTE_BASE, PINS, PINS);//输出高电低PE5LED亮表明已进入中断
}
}
从以上的设置看出的确32位的LM3S比8位的AVR要强得多。