发表于:2008/7/29 9:40:00
#0楼
#i nclude config.h
#i nclude stdlib.h
#define taskstklengh 64 //define the task0 stack length 定义用户任务0的堆栈长度
os_stk taskstk [taskstklengh]; //define the task0 stack 定义用户任务0的堆栈
void task0(void *pdata); //task0 任务0
/* 定义串口0模式设置数据结构 */
typedef struct uartmodea
{ uint8 databa; // 字长度,5/6/7/8
uint8 stopba; // 停止位,1/2
uint8 paritya; // 奇偶校验位,0为无校验,1奇数校验,2为偶数校验
} uartmodea;
/* 定义串口1模式设置数据结构 */
typedef struct uartmodeb
{ uint8 databb; // 字长度,5/6/7/8
uint8 stopbb; // 停止位,1/2
uint8 parityb; // 奇偶校验位,0为无校验,1奇数校验,2为偶数校验
} uartmodeb;
uint8 rcv_bufa[8]; // uart0数据接收缓冲区
uint8 rcv_bufb[8]; // uart1数据接收缓冲区
volatile uint8 rcv_newa; // 接收新数据标志
volatile uint8 rcv_newb; // 接收新数据标志
/****************************************************************************
* 名称:irq_uart0()
* 功能:串口uart0接收中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void __irq irq_uart0(void)
{
uint8 i;
if( 0x04==(u0iir&0x0f) ) rcv_newa = 1;// 设置接收到新的数据标志
for(i=0; i
/****************************************************************************
* 名称:sendbyte()
* 功能:向串口uart0发送字节数据。
* 入口参数:data 要发送的数据
* 出口参数:无
****************************************************************************/
void sendbytea(uint8 dataa)
{
u0thr = dataa; // 发送数据
}
/****************************************************************************
* 名称:sendbyte()
* 功能:向串口uart0发送字节数据。
* 入口参数:data 要发送的数据
* 出口参数:无
****************************************************************************/
void sendbyteb(uint8 datab)
{
u1thr = datab; // 发送数据
}
/****************************************************************************
* 名称:isendbuf()
* 功能:将缓冲区的数据发送回主机(使用fifo),并等待发送完毕。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void isendbufa(void)
{ uint8 i;
for(i=0; i115200) ) return(0);
if( (set.databa8) ) return(0);
if( (0==set.stopba)||(set.stopba>2) ) return(0);
if( set.paritya>4 ) return(0);
/* 设置串口波特率 */
u0lcr = 0x80; // dlab位置1
baka = (fpclk>>4)/bauda;
u0dlm = baka>>8;
u0dll = baka&0xff;
/* 设置串口模式 */
baka = set.databa-5; // 设置字长度
if(2==set.stopba) baka |= 0x04; // 判断是否为2位停止位
if(0!=set.paritya) {set.paritya = set.paritya-1; baka |= 0x08;}
baka |= set.paritya115200) ) return(0);
if( (set.databb8) ) return(0);
if( (0==set.stopbb)||(set.stopbb>2) ) return(0);
if( set.parityb>4 ) return(0);
/* 设置串口波特率 */
u1lcr = 0x80; // dlab位置1
bakb = (fpclk>>4)/baudb;
u1dlm = bakb>>8;
u1dll = bakb&0xff;
/* 设置串口模式 */
bakb = set.databb-5; // 设置字长度
if(2==set.stopbb) bakb |= 0x04; // 判断是否为2位停止位
if(0!=set.parityb) {set.parityb = set.parityb-1; bakb |= 0x08;}
bakb |= set.parityb
int main (void)
{
osinit ();
ostaskcreate (task0,(void *)0, &taskstk[taskstklengh - 1], 2);
osstart ();
return 0;
}
/*********************************************************************************************************
** task0 任务0
********************************************************************************************************/
void task0 (void *pdata)
{
uint8 rcv_countera;
uint8 rcv_counterb;
uartmodea uart0_set;
uartmodeb uart1_set;
pinsel0 = 0x00050005; // 设置i/o连接到uart0
pinsel1 = 0x00000000;
//*******************************************************************
rcv_newa = 0;
uart0_set.databa = 8; // 8位数据位
uart0_set.stopba = 1; // 1位停止位
uart0_set.paritya = 0; // 无奇偶校验
uart0_ini(115200, uart0_set); // 初始化串口模式
u0fcr = 0x81; // 使能fifo,并设置触发点为8字节
u0ier = 0x01; // 允许rbr中断,即接收中断
//*******************************************************************
rcv_newb = 0;
uart1_set.databb = 8; // 8位数据位
uart1_set.stopbb = 1; // 1位停止位
uart1_set.parityb = 0; // 无奇偶校验
uart1_ini(115200, uart1_set); // 初始化串口模式
u1fcr = 0x81; // 使能fifo,并设置触发点为8字节
u1ier = 0x01; // 允许rbr中断,即接收中断
//*******************************************************************
/* 设置中断允许 */
vicintselect = 0x00000000; // 设置所有通道为irq中断
vicvectcntl0 = 0x26; // uart0中断通道分配到irq slot 0,即优先级最高
vicvectaddr0 = (int)irq_uart0; // 设置uart0向量地址
vicintenable = 0x000006c0; // 使能uart0中断
//*******************************************************************
/* 设置中断允许 */
vicvectcntl1 = 0x27; // uart0中断通道分配到irq slot 0,即优先级最高
vicvectaddr1 = (int)irq_uart1; // 设置uart1向量地址
while(1) // 等待中断
{
//if(1==rcv_newb)
if(rcv_newb==1)
{
rcv_newb = 0;
isendbufb(); // 将接收到的数据发送回主机
}
//if(1==rcv_newa)
if(rcv_newa==1)
{
rcv_newa = 0;
isendbufa(); // 将接收到的数据发送回主机
}
}
// return(0);
}
/*********************************************************************************************************
** end of file
****************************************
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=55556&Name=mahuaqiang
#i nclude stdlib.h
#define taskstklengh 64 //define the task0 stack length 定义用户任务0的堆栈长度
os_stk taskstk [taskstklengh]; //define the task0 stack 定义用户任务0的堆栈
void task0(void *pdata); //task0 任务0
/* 定义串口0模式设置数据结构 */
typedef struct uartmodea
{ uint8 databa; // 字长度,5/6/7/8
uint8 stopba; // 停止位,1/2
uint8 paritya; // 奇偶校验位,0为无校验,1奇数校验,2为偶数校验
} uartmodea;
/* 定义串口1模式设置数据结构 */
typedef struct uartmodeb
{ uint8 databb; // 字长度,5/6/7/8
uint8 stopbb; // 停止位,1/2
uint8 parityb; // 奇偶校验位,0为无校验,1奇数校验,2为偶数校验
} uartmodeb;
uint8 rcv_bufa[8]; // uart0数据接收缓冲区
uint8 rcv_bufb[8]; // uart1数据接收缓冲区
volatile uint8 rcv_newa; // 接收新数据标志
volatile uint8 rcv_newb; // 接收新数据标志
/****************************************************************************
* 名称:irq_uart0()
* 功能:串口uart0接收中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void __irq irq_uart0(void)
{
uint8 i;
if( 0x04==(u0iir&0x0f) ) rcv_newa = 1;// 设置接收到新的数据标志
for(i=0; i
/****************************************************************************
* 名称:sendbyte()
* 功能:向串口uart0发送字节数据。
* 入口参数:data 要发送的数据
* 出口参数:无
****************************************************************************/
void sendbytea(uint8 dataa)
{
u0thr = dataa; // 发送数据
}
/****************************************************************************
* 名称:sendbyte()
* 功能:向串口uart0发送字节数据。
* 入口参数:data 要发送的数据
* 出口参数:无
****************************************************************************/
void sendbyteb(uint8 datab)
{
u1thr = datab; // 发送数据
}
/****************************************************************************
* 名称:isendbuf()
* 功能:将缓冲区的数据发送回主机(使用fifo),并等待发送完毕。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void isendbufa(void)
{ uint8 i;
for(i=0; i115200) ) return(0);
if( (set.databa8) ) return(0);
if( (0==set.stopba)||(set.stopba>2) ) return(0);
if( set.paritya>4 ) return(0);
/* 设置串口波特率 */
u0lcr = 0x80; // dlab位置1
baka = (fpclk>>4)/bauda;
u0dlm = baka>>8;
u0dll = baka&0xff;
/* 设置串口模式 */
baka = set.databa-5; // 设置字长度
if(2==set.stopba) baka |= 0x04; // 判断是否为2位停止位
if(0!=set.paritya) {set.paritya = set.paritya-1; baka |= 0x08;}
baka |= set.paritya115200) ) return(0);
if( (set.databb8) ) return(0);
if( (0==set.stopbb)||(set.stopbb>2) ) return(0);
if( set.parityb>4 ) return(0);
/* 设置串口波特率 */
u1lcr = 0x80; // dlab位置1
bakb = (fpclk>>4)/baudb;
u1dlm = bakb>>8;
u1dll = bakb&0xff;
/* 设置串口模式 */
bakb = set.databb-5; // 设置字长度
if(2==set.stopbb) bakb |= 0x04; // 判断是否为2位停止位
if(0!=set.parityb) {set.parityb = set.parityb-1; bakb |= 0x08;}
bakb |= set.parityb
int main (void)
{
osinit ();
ostaskcreate (task0,(void *)0, &taskstk[taskstklengh - 1], 2);
osstart ();
return 0;
}
/*********************************************************************************************************
** task0 任务0
********************************************************************************************************/
void task0 (void *pdata)
{
uint8 rcv_countera;
uint8 rcv_counterb;
uartmodea uart0_set;
uartmodeb uart1_set;
pinsel0 = 0x00050005; // 设置i/o连接到uart0
pinsel1 = 0x00000000;
//*******************************************************************
rcv_newa = 0;
uart0_set.databa = 8; // 8位数据位
uart0_set.stopba = 1; // 1位停止位
uart0_set.paritya = 0; // 无奇偶校验
uart0_ini(115200, uart0_set); // 初始化串口模式
u0fcr = 0x81; // 使能fifo,并设置触发点为8字节
u0ier = 0x01; // 允许rbr中断,即接收中断
//*******************************************************************
rcv_newb = 0;
uart1_set.databb = 8; // 8位数据位
uart1_set.stopbb = 1; // 1位停止位
uart1_set.parityb = 0; // 无奇偶校验
uart1_ini(115200, uart1_set); // 初始化串口模式
u1fcr = 0x81; // 使能fifo,并设置触发点为8字节
u1ier = 0x01; // 允许rbr中断,即接收中断
//*******************************************************************
/* 设置中断允许 */
vicintselect = 0x00000000; // 设置所有通道为irq中断
vicvectcntl0 = 0x26; // uart0中断通道分配到irq slot 0,即优先级最高
vicvectaddr0 = (int)irq_uart0; // 设置uart0向量地址
vicintenable = 0x000006c0; // 使能uart0中断
//*******************************************************************
/* 设置中断允许 */
vicvectcntl1 = 0x27; // uart0中断通道分配到irq slot 0,即优先级最高
vicvectaddr1 = (int)irq_uart1; // 设置uart1向量地址
while(1) // 等待中断
{
//if(1==rcv_newb)
if(rcv_newb==1)
{
rcv_newb = 0;
isendbufb(); // 将接收到的数据发送回主机
}
//if(1==rcv_newa)
if(rcv_newa==1)
{
rcv_newa = 0;
isendbufa(); // 将接收到的数据发送回主机
}
}
// return(0);
}
/*********************************************************************************************************
** end of file
****************************************
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=55556&Name=mahuaqiang