📄 lm3s-uart0.c
字号:
#include <hw_memmap.h>
#include <hw_types.h>
#include <hw_ints.h>
#include <hw_sysctl.h>
#include <hw_gpio.h>
#include <hw_uart.h>
#include <interrupt.h>
#include <sysctl.h>
#include <gpio.h>
#include <uart.h>
#include <string.h>
#include "LM3S-UART0.H"
#define SysCtlPeriEnable SysCtlPeripheralEnable
/* UART初始化 */
void uart0Init(void)
{
SysCtlPeriEnable(SYSCTL_PERIPH_GPIOA); /* 使能UART0所在的GPIOA端口 */
SysCtlPeriEnable(SYSCTL_PERIPH_UART0); /* 使能UART0模块 */
GPIOPinTypeUART(GPIO_PORTA_BASE , /* 配置PA0和PA1为UART功能 */
GPIO_PIN_0 | GPIO_PIN_1);
UARTConfigSet(UART0_BASE ,
9600 , /* 波特率:9600 */
UART_CONFIG_WLEN_8 | /* 数据位:8 */
UART_CONFIG_STOP_ONE | /* 停止位:1 */
UART_CONFIG_PAR_NONE); /* 校验位:无 */
UARTFIFOLevelSet(UART0_BASE , /* 设置发送和接收的FIFO深度 */
UART_FIFO_TX4_8 ,
UART_FIFO_RX4_8);
UARTIntEnable(UART0_BASE , UART_INT_TX); /* 使能发送中断 */
IntEnable(INT_UART0); /* 使能UART0总中断 */
IntMasterEnable(); /* 使能处理器中断 */
UARTEnable(UART0_BASE); /* 使能UART0端口 */
}
/* 定义发送数据的最大限制长度 */
#define TX_MAX 80
/* 定义全局变量 */
char GcBuf[1 + TX_MAX]; /* 定义缓冲区 */
short GsCnt = 0; /* 发送计数器 */
short GsLen = 0; /* 数据有效长度 */
tBoolean GbBusy = false; /* 忙标志:true-正在发送 */
/* false-空闲 */
/* 填充发送FIFO(填满FIFO之后就退出,不会等待) */
void uart0FIFOFill(void)
{
for (;;) {
/* 如果已经发送完毕,则清除忙标志,并退出 */
if ( GsCnt >= GsLen ) {
GbBusy = false;
break;
}
/* 如果发送FIFO里没有可用空间,则退出(不必等待) */
if ( !UARTSpaceAvail(UART0_BASE) ) {
break;
}
/* 如果未发送完,并且发送FIFO里有可用空间,则填充发送FIFO */
UARTCharPutNonBlocking(UART0_BASE , GcBuf[GsCnt++]);
}
}
/* 发送字符串(FIFO中断方式,高效) */
void uart0FIFOIntPutS(const char *pStr)
{
/* 如果上次发送还没有结束,则暂时等待 */
while ( GbBusy );
/* 发送之前的初始化配置 */
GsCnt = 0;
strncpy(GcBuf , pStr , TX_MAX);
GsLen = strlen(GcBuf);
GbBusy = true;
/* 填充发送FIFO,启动中断发送过程 */
uart0FIFOFill();
/* 不必等待发送完毕就退出,其余数据的FIFO填充任务由中断服务函数完成 */
return;
}
// UART0中断服务函数
void UART0_ISR(void)
{
UARTIntClear(UART0_BASE , UART_INT_TX); /* 清除发送中断 */
uart0FIFOFill(); /* 填充发送FIFO */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -