注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
myredback的个人空间 https://home.eeworld.com.cn/space-uid-166710.html [收藏] [复制] [分享] [RSS]
日志

Lm101UartSR.h

已有 1386 次阅读2010-7-29 16:31 |个人分类:LM3S101

//这是“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;
}
//---------------------------------------------------------------------------------------
发表评论 评论 (1 个评论)
回复 nhaw 2012-4-22 14:49

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章