//这是“ARM Corte-M3内核微控制器快速入门与应用”书中的一个Uart的头文件
//为了提高学习效率并压缩学习时间,而整理的一个UART通信程序的头文件供大家使用。
//取名为Lm101UartSR.h ,直接调用文件中的函数即可;
#include "hw_memmap.h"
#include "hw_types.h"
#include "gpio.h"
#include "sysctl.h"
#include "timer.h"
#include "interrupt.h"
#include "uart.h"
//----------------------------------------------------------------
static volatile const unsigned char *g_pucBuffer = 0;
static volatile unsigned long g_ulCount = 0; //发送数据内部计数器(待发送的数据的个数)
//外用变量
unsigned char g_pucString[] ="welcome to nanchang";
unsigned long nlRcvData=0; //用于存放接收到的数据[外用]
unsigned int nbRcvFlags=0; //接收数据标识符(当接收数据中断服务程序收到有数据时nbRcvFlags=1,请用户手工清零)
unsigned char uchRcvd=0x44; //存入接收到的数据
//-----------------------------------------------------------------------------
//延时子程序
//------------------------------------------------------------------------------------
void Ddelay(int e)
{
int a=0;
for( ; e; --e)
for(a=0;a<1000;a++);
}
//----------------------------------------------------------------------------
// 定义待发送的数据串。用户可自定义修改。
//----------------------------------------------------------------------------
// 函数名称:UART_Rx_Int_Handler()。
// 函数功能:UART接收数据中断服务子程序。(中断执行程序)
// 输入参数:无。
// 输出参数:无。
//说明:如果系统发现上位机有数据发过来,就将数据存入nlRcvData缓冲区,并置位nbRcvFlags标识
//----------------------------------------------------------------------------
void UART_Rx_Int_Handler(void)
{
//发现数据发过来先清除中断标志位
UARTIntClear(UART0_BASE, UART_INT_RX);
//接收上位机发来的数据
nlRcvData=UARTCharGet(UART0_BASE);
//接收数据标识符为1(接收到数据)
nbRcvFlags=1;
}
//--------------------------------------------------------------------------------
// 函数名称:UARTTxData()。
// 函数功能:UART串行发送数据程序
// 输入参数:无。
// 输出参数:无。
//说明:本程序用了两个参数,都是全局变量,一个是g_pucBuffer数据缓存区,一个是要发送的数据个数g_ulCount
// 在程序要执行数据发送前,将数据传送到两个缓存区即可.
//----------------------------------------------------------------------------
void UARTTxData(void)
{
while(g_ulCount && UARTSpaceAvail(UART0_BASE))
{
UARTCharNonBlockingPut(UART0_BASE, *g_pucBuffer++); // 发送下一个字符。
g_ulCount--; // 发送字符数自减。
Ddelay(2); //增加一个延时
}
}
//--------------------------------------------------------------------------
// 函数名称:UART_Tx_IntHandler()。
// 函数功能:UART 发送数据中断处理器。(中断执行程序)
// 输入参数:无。
// 输出参数:无。
//说明:如果系统发现有数据发送存在,就起动此程序调用UARTTxIntHandler();数据发送程序发送数据
//----------------------------------------------------------------------------
void UART_Tx_Int_Handler(void)
{
unsigned long ulStatus;
ulStatus = UARTIntStatus(UART0_BASE, true); // 获得中断状态。查看是否有数据要发
UARTIntClear(UART0_BASE, ulStatus); // 清除等待响应的中断。
if(ulStatus & UART_INT_TX) // 检查是否有未响应的传输中断。(判断是否发送数据的信号)
{
UARTTxData(); // 处理传输中断。(发出数据)
}
}
//----------------------------------------------------------------------------
//下面是UART串行通信中外用程序
//----------------------------------------------------------------------------
// 函数名称:UARTSend() 。
// 函数功能:向UART发送字符串。(用户用数据发送子程序)
// 入口参数:pucBuffer[为待发送的数据缓存区,存放时最好用数组],ulCount[指示待发送数据的个数]
// 输出参数:无。
//说明:用户需要发送数据时调用此程序即可
//----------------------------------------------------------------------------
void UARTSend(unsigned char *pucBuffer, unsigned long ulCount)
{
//等待数据发送缓冲区的数据发送完毕
while(g_ulCount); // 等待,直到之前的字符串发送完毕。
//将要发送的数据存入中心缓存区,准备数据发送
g_pucBuffer = pucBuffer; // 保存待传输的数据缓冲。
g_ulCount = ulCount; // 保存计数值。
//禁止发送中数
UARTIntDisable(UART0_BASE, UART_INT_TX); // 使能发送前先禁能。
UARTTxData(); //初始化数据发送
//起动发送中数
UARTIntEnable(UART0_BASE, UART_INT_TX); // 使能UART发送。
}
//----------------------------------------------------------------
// 函数名称:UARTRcv()
// 函数功能:读取收到的数据
// 输入参数:无。
// 输出参数:uchRcvd[传送接收到的数据]
//------------------------------------------------------------------
unsigned char UARTRcv()
{
//unsigned char uchRcvd=0x44;
if(nbRcvFlags)
{
nbRcvFlags=0; //清除接收数据标识
uchRcvd=nlRcvData; //读取收到的数据
}
return uchRcvd;
}
//----------------------------------------------------------------------------
//
// 此程序演示了通过串口发送数据。UART将被配置为 9600波特率, 8-n-1模式持续发
// 送数据。字符将利用中断的方式通过UART发送。
//
//----------------------------------------------------------------------------
// 函数名称:LM101_UART_Initi()
// 函数功能:UART串行初始化程序
//入出参数:无
//----------------------------------------------------------------------------
void LM101_UART_Initi()
{
//设置串行外设为输出
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
//启动PA口 用于串行发送
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
//启动全局中断
IntMasterEnable();
// 设置GPIO的A0和A1为UART引脚。(PA0->RXD,PA1->TXD)
//从PA0:PA1发送数据,这是硬件设置规定的
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
//设置UART串行用通信参数
// 配置UART 为 9600波特率, 8-N-1模式发送数据。
UARTConfigSet(UART0_BASE, 9600, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
//注册UART串行发送中断程序的函数名称为UART0IntHandler
UARTIntRegister(UART0_BASE,UART_Tx_Int_Handler);
//注册UART串行接收中断程序的函数名称为UARTRxIntHandler
UARTIntRegister(UART0_BASE,UART_Rx_Int_Handler);
//使UART串行中断使能(启用发送中断)
UARTIntEnable(UART0_BASE, UART_INT_TX);
// 起用接收中断和中断超时
UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT);
//初值
nlRcvData=0x44;
//将接收数据标识符清0
nbRcvFlags=0;
}
//---------------------------------------------------------------------------------------