www.pudn.com > ARM-Cortex-M3.zip > uart_send.c, change:2007-11-23,size:8801b


/****************************************Copyright (c)**************************************************** 
**                               Guangzhou ZHIYUAN electronics Co.,LTD. 
**                                      
**                                 http://www.embedtools.com		   
** 
**--------------File Info--------------------------------------------------------------------------------- 
** File Name:               uart_send.c	    
** Last modified Date:      2007.09.17  
** Last Version:            v1.0	   
** Description:             Stellaris系列单片机UART发送程序 
** 	    			        UART发送数据最好采用中断方式以便系统去做其它工作.	   
**-------------------------------------------------------------------------------------------------------- 
** Created By:              Ni Likao	    
** Created date:            2007.09.17     
** Version: v1.0	   
** Descriptions:            开发板上LED灯的闪烁表示数据正在被发送.	  
** 
**-------------------------------------------------------------------------------------------------------- 
** Modified by: 
** Modified date: 
** Version: 
** Description: 
** 
*********************************************************************************************************/ 
 
#include "hw_ints.h" 
#include "hw_memmap.h" 
#include "hw_types.h" 
#include "gpio.h" 
#include "interrupt.h" 
#include "sysctl.h" 
#include "uart.h" 
 
#define  TXD_LED  GPIO_PIN_6 
#define  UART0_PIN GPIO_PIN_0 | GPIO_PIN_1 
 
static volatile const unsigned char *g_pucBuffer = 0;                   /*  发送数据缓冲区指针          */ 
static volatile unsigned long       g_ulCount = 0;                      /*  发送数据个数                */ 
 
static const unsigned char          g_pucString[] = "welcome to http://www.zlgmcu.com\r\n"; 
 
/********************************************************************************************************* 
** Function name:           UART0_ISR 
** Descriptions:            UART0中断服务函数,工作在串口发送中断下. 
**                          用KEIL软件时,在Startup.S中添加该中断函数名 
** input parameters:        无 
** output parameters:       无 
** Returned value:          无 
** Created By:              Ni Likao 
** Created date:            2007.09.17 
**-------------------------------------------------------------------------------------------------------- 
** Modified by:              
** Modified date:            
**-------------------------------------------------------------------------------------------------------- 
*********************************************************************************************************/ 
 
void UART0_ISR (void)                                                    
{ 
    unsigned long ulStatus; 
     
    ulStatus = UARTIntStatus(UART0_BASE, true);                         /*  获得中断状态                */ 
    UARTIntClear(UART0_BASE, ulStatus);                                 /*  清除等待响应的中断          */ 
    if (ulStatus & UART_INT_TX) {                                       /*  检查是否有未响应的传输中断  */ 
     
        while (g_ulCount && UARTSpaceAvail(UART0_BASE)) { 	            /*  处理传输中断                */ 
    		 
            UARTCharNonBlockingPut(UART0_BASE, *g_pucBuffer++);         /*  发送下一个字符              */ 
            g_ulCount--;                                                /*  发送字符数自减              */ 
        } 
    } 
} 
 
/********************************************************************************************************** 
** Function name:           UARTSend 
** Descriptions:            发送数据处理函数,用于串口数据发送. 
**                          用KEIL软件时,在Startup.S中添加该中断函数名 
** input parameters:        *pucBuffer,ulCount 
** output parameters:       无 
** Returned value:          无 
** Created By:              Ni Likao 
** Created date:            2007.09.17 
**-------------------------------------------------------------------------------------------------------- 
** Modified by:              
** Modified date:            
**-------------------------------------------------------------------------------------------------------- 
*********************************************************************************************************/ 
 
void UARTSend (const unsigned char  *pucBuffer, unsigned long  ulCount)     
{ 
     
    while (g_ulCount) {                                                 /*  等待直到之前的字符串发送完毕*/ 
        ; 
    }                                                   
    g_pucBuffer = pucBuffer;                                            /*  保存待传输的数据缓冲        */ 
    g_ulCount = ulCount;                                                /*  保存计数值                  */ 
    while (UARTSpaceAvail(UART0_BASE)) {                                /*  处理传输中断                */     
        UARTCharNonBlockingPut(UART0_BASE, *g_pucBuffer++);             /*  发送下一个字符              */ 
        g_ulCount--;                                                    /*  发送字符数自减              */ 
    } 
} 
 
/********************************************************************************************************* 
** Function name:           main	    
** Descriptions:            该范例程序演示了串口发送程序,数据通过串口从单片机向上位机发送数据.                       
**                          UART将被配置为 9600波特率,8-n-1模式持续发送数据。开发板上LED灯的 
**                          闪烁表示数据正在被发送. 
** input parameters:        无 
** output parameters:       无       
** Returned value:          无	  
** Created By:              Ni Likao 
** Created date:            2007.09.17 
**-------------------------------------------------------------------------------------------------------- 
** Modified by:              
** Modified date:            
**-------------------------------------------------------------------------------------------------------- 
*********************************************************************************************************/ 
int main (void) 
{   
     
    SysCtlClockSet(SYSCTL_SYSDIV_16 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | 
                   SYSCTL_XTAL_6MHZ);                                   /*  设置晶振为时钟源            */ 
 
    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);                        /*  使能UART外设                */ 
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);                        /*  使能GPIOA外设               */ 
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);                        /*  使能GPIOB外设               */ 
 
    IntMasterEnable();                                                  /*  开总中断                    */ 
	GPIOPinTypeUART(GPIO_PORTA_BASE, UART0_PIN);                        /*  配置UART功能脚              */ 
                                                                        /*  设置GPIO的A0和A1为UART引脚  */ 
                                                                        /*  (A0->RXD,A1->TXD)           */ 
    GPIODirModeSet(GPIO_PORTB_BASE, TXD_LED,                            
                   GPIO_DIR_MODE_OUT);                                  /*  设置 GPIO B0和B1为输出口    */ 
    GPIOPadConfigSet(GPIO_PORTB_BASE, TXD_LED, GPIO_STRENGTH_2MA, 
	                 GPIO_PIN_TYPE_STD);								/*  配置PB6口为2ma驱动电流		*/ 
					                                                    /*  及PULL-PUSH类型				*/ 
	GPIOPinWrite(GPIO_PORTB_BASE, TXD_LED, 0);                          /*  初始化IO口                  */ 
 
    UARTConfigSet(UART0_BASE, 9600, (UART_CONFIG_WLEN_8 | 
                                     UART_CONFIG_STOP_ONE | 
                                     UART_CONFIG_PAR_NONE));            /*  配置UART 为 9600波特率      */ 
    UARTIntClear(UART0_BASE, UART_INT_TX);                              /*  8-N-1模式发送数据           */                                                                         
    UARTIntEnable(UART0_BASE, UART_INT_TX);                             /*  设置UART中断类型            */ 
    IntEnable(INT_UART0);                                               /*  UART中断使能                */ 
    while(1) { 
         
        UARTSend(g_pucString, sizeof(g_pucString) - 1);                 /*  向UART发送一个字符串        */          
        GPIOPinWrite(GPIO_PORTB_BASE, TXD_LED, 
                     GPIOPinRead(GPIO_PORTB_BASE, TXD_LED) ^ TXD_LED);  /*  翻转GPIO B4 端口            */                                                                        
     
    } 
} 
 
/********************************************************************************************************* 
  END FILE 
*********************************************************************************************************/