您现在所在的是:

单片机论坛

回帖:0个,阅读:794 [上一页] [1] [下一页]
1006
mahuaqiang
文章数:39
年度积分:49
历史总积分:1006
注册时间:2005/6/27
发站内信
08年博客人气奖
发表于: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

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

46.8003