📄 uart0.c
字号:
/*
*********************************************************
* Copyright (c)
* All rights reserved.
*
* 文件名称:Uart0.c
* 文件标识:
* 摘 要:本文件是对串口0进行初始化和操作。
* 当前版本:1.0
* 作 者:刘征
* 完成日期:2005.4.3
*
* 取代版本:
* 作 者:
* 完成日期:
*********************************************************
*/
/*
*********************************************************
* 头文件
*********************************************************
*/
#include <string.h>
#include <stdlib.h>
#include "2410addr.h"
#include "2410lib.h"
#include "def.h"
#include "uart0.h"
/*
*********************************************************
* 函数原型
*********************************************************
*/
/*
*********************************************************
* 常量
*********************************************************
*/
/*
*********************************************************
* 变量
*********************************************************
*/
volatile U16 rx_dncs;
volatile U32 rx_point,rx_isdone,rx_filesize,rx_checksum;
volatile U32 isDone,isTxInt,isRxInt,tx_cnt,tx_end,rx_cnt,rx_end,afc_err;
volatile U8 *txdataPt;
volatile U8 *txdataFl;
volatile U8 *rxdataPt;
volatile U8 *rxdataCk;
volatile U32 save_rGPHCON,save_rGPHDAT,save_rGPHUP;
volatile U32 save_ULCON0,save_UCON0,save_UFCON0,save_UMCON0;
volatile U32 save_ULCON1,save_UCON1,save_UFCON1,save_UMCON1;
volatile U32 save_ULCON2,save_UCON2,save_UFCON2,save_UMCON2;
volatile static char *uart0TxStr;
volatile static char *uart0RxStr;
volatile static char *uart2TxStr;
volatile static char *uart2RxStr;
/*
*********************************************************
* 函数介绍:本函数是串口的端口功能设置。
* 输入参数:无
* 输出参数:无
* 返回值 :无
*********************************************************
*/
void Uart_Port_Set(void)
{
//Push UART GPIO port configuration
save_rGPHCON=rGPHCON;
save_rGPHDAT=rGPHDAT;
save_rGPHUP=rGPHUP;
//Configure UART port
rGPHCON&=0x3c0000;
rGPHCON|=0x2faaa; // nRTS1,nCTS1
rGPHUP|=0x1ff; //Uart port pull-up disable
//rINTSUBMSK=0x7ff; //SUBINT ALL MASK
//Push Uart control registers
save_ULCON0=rULCON0;
save_UCON0=rUCON0;
save_UFCON0=rUFCON0;
save_UMCON0=rUMCON0;
save_ULCON1=rULCON1;
save_UCON1 =rUCON1;
save_UFCON1=rUFCON1;
save_UMCON1=rUMCON1;
save_ULCON2=rULCON2;
save_UCON2 =rUCON2;
save_UFCON2=rUFCON2;
save_UMCON2=rUMCON2;
}
/*
*********************************************************
* 函数介绍:本函数是返回串口的端口设置的原功能。
* 输入参数:无
* 输出参数:无
* 返回值 :无
*********************************************************
*/
void Uart_Port_Return(void)
{
//Pop UART GPIO port configuration
rGPHCON=save_rGPHCON;
rGPHDAT=save_rGPHDAT;
rGPHUP=save_rGPHUP;
//Pop Uart control registers
rULCON0=save_ULCON0;
rUCON0 =save_UCON0;
rUFCON0=save_UFCON0;
rUMCON0=save_UMCON0;
rULCON1=save_ULCON1;
rUCON1 =save_UCON1;
rUFCON1=save_UFCON1;
rUMCON1=save_UMCON1;
rULCON2=save_ULCON2;
rUCON2 =save_UCON2;
rUFCON2=save_UFCON2;
rUMCON2=save_UMCON2;
}
/*
*********************************************************
* 函数介绍:本函数是使用Uclk设置波特率。
* 输入参数:ch---通道号
* baud---波特率
* 输出参数:无
* 返回值 :无
*********************************************************
*/
void Uart_Uclk_En(int ch,int baud)
{
if(ch == 0) {
Uart_Select(0);
rUCON0|=0x400; // Select UCLK
rUBRDIV0=( (int)(UCLK/16./baud) -1 ); //Baud rate divisior register
Uart_Printf("UCLK is enabled by UART0.\n");
}
else if(ch==1){
Uart_Select(1);
rUCON1|=0x400; // Select UCLK
rUBRDIV1=( (int)(UCLK/16./baud) -1 ); //Baud rate divisior register
Uart_Select(0);
Uart_Printf("UCLK is enabled by UART1.\n");
}
else {
Uart_Select(2);
rUCON2|=0x400; // Select UCLK
rUBRDIV2=( (int)(UCLK/16./baud) -1 ); //Baud rate divisior register
Uart_Select(0);
Uart_Printf("UCLK is enabled by UART2.\n");
}
//for(i=0;i<100;i++); // For the satble operation
}
/*
*********************************************************
* 函数介绍:本函数是使用Pclk设置波特率。
* 输入参数:ch---通道号
* baud---波特率
* 输出参数:无
* 返回值 :无
*********************************************************
*/
void Uart_Pclk_En(int ch, int baud)
{
if(ch == 0) {
Uart_Select(0);
rUCON0&=0x3ff; // Select PCLK
rUBRDIV0=( (int)(PCLK/16./baud) -1 ); //Baud rate divisior register
Uart_Printf("PCLK is enabled by UART0.\n");
}
else if(ch==1){
Uart_Select(1);
rUCON1|=0x3ff; // Select PCLK
rUBRDIV1=( (int)(PCLK/16./baud) -1 ); //Baud rate divisior register
Uart_Select(0);
Uart_Printf("PCLK is enabled by UART1.\n");
}
else {
Uart_Select(2);
rUCON2|=0x3ff; // Select PCLK
rUBRDIV2=( (int)(PCLK/16./baud) -1 ); //Baud rate divisior register
Uart_Select(0);
Uart_Printf("PCLK is enabled by UART2.\n");
}
//for(i=0;i<100;i++); // For the satble operation
}
/*
*********************************************************
* 函数介绍:本函数是串口0发送中断处理函数。
* 输入参数:无
* 输出参数:无
* 返回值 :无
*********************************************************
*/
void __irq Uart0_TxInt(void)
{
rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0); // Just for the safety
if(*uart0TxStr != '\0')
{
WrUTXH0(*uart0TxStr++);
ClearPending(BIT_UART0); // Clear master pending
rSUBSRCPND=(BIT_SUB_TXD0); // Clear Sub int pending
rINTSUBMSK&=~(BIT_SUB_TXD0); // Unmask sub int
}
else
{
isTxInt=0;
ClearPending(BIT_UART0); // Clear master pending
rSUBSRCPND=(BIT_SUB_TXD0); // Clear Sub int pending
rINTMSK|=(BIT_UART0);
}
}
/*
*********************************************************
* 函数介绍:本函数是串口0接收中断及出错处理中断函数。
* 输入参数:无
* 输出参数:无
* 返回值 :无
*********************************************************
*/
void __irq Uart0_RxIntOrErr(void)
{
rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);//set sub int
if(rSUBSRCPND&BIT_SUB_RXD0)
{
__sub_Uart0_RxInt();
}
else
{
__sub_Uart0_RxErrInt();
}
ClearPending(BIT_UART0);
rSUBSRCPND=(BIT_SUB_RXD0|BIT_SUB_ERR0); // Clear Sub int pending
rINTSUBMSK&=~(BIT_SUB_RXD0|BIT_SUB_ERR0);
}
/*
*********************************************************
* 函数介绍:本函数是串口0接收中断处理子中断函数。
* 输入参数:无
* 输出参数:无
* 返回值 :无
*********************************************************
*/
void __sub_Uart0_RxInt(void)
{
if(RdURXH0()!='\r')
{
Uart_Printf("%c",RdURXH0());
*uart0RxStr++ =(char)RdURXH0();
}
else
{
isRxInt=0;
*uart0RxStr='\0';
Uart_Printf("\n");
}
}
/*
*********************************************************
* 函数介绍:本函数是串口0接收出错中断处理子中断函数。
* 输入参数:无
* 输出参数:无
* 返回值 :无
*********************************************************
*/
void __sub_Uart0_RxErrInt(void)
{
switch(rUERSTAT0)//to clear and check the status of register bits
{
case '1':
Uart_Printf("Overrun error\n");
break;
case '2':
Uart_Printf("Parity error\n");
break;
case '4':
Uart_Printf("Frame error\n");
break;
case '8':
Uart_Printf("Breake detect\n");
break;
default :
break;
}
}
/*
*********************************************************
* 函数介绍:本函数是串口0功能测试函数。
* 输入参数:无
* 输出参数:无
* 返回值 :无
*********************************************************
*/
void Test_Uart0_Int(void)
{
Uart_Port_Set();
Uart_Select(0);
/*********** UART0 Tx test with interrupt ***********/
isTxInt=1;
uart0TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890->UART0 Tx interrupt test is good!!!!\r\n";
Uart_Printf("[Uart channel 0 Tx Interrupt Test]\n");
pISR_UART0=(unsigned)Uart0_TxInt;
rULCON0=(0<<6)|(0<<3)|(0<<2)|(3); // Normal,No parity,One stop bit, 8bit
rUCON0 &= 0x400; // For the PCLK <-> UCLK fuction
rUCON0 |= (TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1);
//Clock,Tx:Def,Rx:Def,Rx timeout:x,Rx error int:x,Loop-back:x,Send break:x,Tx:int,Rx:int
Uart_TxEmpty(0); //wait until tx buffer is empty.
rINTMSK=~(BIT_UART0);
rINTSUBMSK=~(BIT_SUB_TXD0);
while(isTxInt);
/*********** UART0 Rx test with interrupt ***********/
isRxInt=1;
uart0RxStr=(char *)UARTBUFFER;
Uart_Printf("\n[Uart channel 0 Rx Interrupt Test]:\n");
Uart_Printf("After typing ENTER key, you will see the characters which was typed by you.");
Uart_Printf("\nTo quit, press ENTER key.!!!\n");
Uart_TxEmpty(0); //wait until tx buffer is empty.
pISR_UART0 =(unsigned)Uart0_RxIntOrErr;
rULCON0=(0<<6)|(0<<3)|(0<<2)|(3); // Normal,No parity,One stop bit, 8bit
rUCON0 &= 0x400; // For the PCLK <-> UCLK fuction
rUCON0 |= (TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(1<<6)|(0<<5)|(0<<4)|(1<<2)|(1);
//Clock,Tx:pulse,Rx:pulse,Rx timeout:x,Rx error int:o,Loop-back:x,Send break:x,Tx:int,Rx:int
// Clear Int Pending and Unmask
ClearPending(BIT_UART0);
rINTMSK=~(BIT_UART0);
rSUBSRCPND=(BIT_SUB_TXD0|BIT_SUB_RXD0|BIT_SUB_ERR0);
rINTSUBMSK=~(BIT_SUB_RXD0|BIT_SUB_ERR0);
while(isRxInt);
rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_ERR0);
rINTMSK|=(BIT_UART0);
Uart_Printf("%s\n",(char *)UARTBUFFER);
Uart_Port_Return();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -