原创 S3C2440串口0中断接收(一)

2009-11-25 23:50 6445 5 5 分类: MCU/ 嵌入式

今天开始在基于S3C2440在FreeRTOS基础上,实现串口和上位机通信,需要做的事情:


1.底层驱动,占用UART0,中断方式接收数据包;


2.由于UART0已经被调试串口占用,因此需要完成LCD驱动,将调试信息打印到LCD上;


3.上层专门起一个vTaskUart任务,负责处理串口通信;


4.暂时用串口调试助手代替VC上位机软件,等通信没问题在自己用VC编个专用串口通信软件,控制QQ2440;


5.下面给出UART0初始化为中断接收的代码:


/*******************************************************************************
Name        : BspUart0IntInit
Copyright   : songzi&jingjing
Description : UART0中断初始化函数
Input       : dwBaud -- 波特率
Output      : None
Return      : SUCCESS/FAILURE
Notes       : none
*******************************************************************************/
S32 BspUart0Init(U32 dwBaud)
{
 rUFCON0 = 0x0;  //UART channel 0 FIFO control register, FIFO disable
 rUFCON1 = 0x0;  //UART channel 1 FIFO control register, FIFO disable
 rUFCON2 = 0x0;  //UART channel 2 FIFO control register, FIFO disable
 rUMCON0 = 0x0;  //UART chaneel 0 MODEM control register, AFC disable
 rUMCON1 = 0x0;  //UART chaneel 1 MODEM control register, AFC disable


 /*初始化UART0*/
 rUFCON0 = 0x27;  //RX Trigger 12Byte, Tx Rx FIFO reset enable
 rUMCON0 = 0x0;  //UART chaneel 0 MODEM control register, AFC disable
 rULCON0 = 0x3;  //Line control register : Normal,No parity,1 stop,8 bits
 //rUCON0 = 0x245;   // Control register
 rUCON0  = 0x385;   //rx=level,tx=level,enable timeout int,disbale rx error int,normal
 rUBRDIV0=( (int)(PCLK/16./dwBaud+0.5) -1 ); //Baud rate divisior register 0


    /*中断初始化*/
 BspUart0ISRInit();


 return EXCU_OK;
}


/*******************************************************************************
Name        : Uart0_Exception
Copyright   : songzi&jingjing
Description : UART0中断服务函数
Input       : none
Output      : None
Return      : SUCCESS/FAILURE
*******************************************************************************/
void Uart0_Exception(void)
{
 static portBASE_TYPE xTaskWoken;


    /*先禁止UART接收*/
    rINTSUBMSK |= (1 << BITPOS_SUBINT_RXD0);
 
 /*初始化*/
 xTaskWoken = pdFALSE;


 if(rSUBSRCPND&BIT_SUB_RXD0)
    {
  /* Unblock the task by releasing the semaphore. */
  xTaskWoken = xSemaphoreGiveFromISR( xSemaphore, xTaskWoken );


  while(rUTRSTAT0&1)
  {
      //has data, non-fifo mode
   WrUTXH0(rURXH0);
  }
  
     /*打印提示信息*/
     //BspRs232Printf("Enter Timer2 INT %d time(s)\r\n", g_dwTimer2Cnt++);
 }


    /*clear UART0 INT flag*/
 rSUBSRCPND = rSUBSRCPND | (1 << BITPOS_SUBINT_RXD0);
 rSRCPND = rSRCPND|( 1 << BITPOS_INT_UART0);


 /*再使能UART0接收中断*/
 rINTSUBMSK &= ~(1 << BITPOS_SUBINT_RXD0);
 rINTPND = rINTPND;


 /*强制中断内切换*/
 portEXIT_SWITCHING_ISR(pdTRUE);


 return;
}


/*******************************************************************************
Name        : BspUart0ISRInit
Copyright   : songzi&jingjing
Description : UART0中断初始化
Input       : none
Output      : None
Return      : SUCCESS/FAILURE
*******************************************************************************/
S32 BspUart0ISRInit(void)
{
    /*使用默认的固定的优先级*/
 rPRIORITY = 0x00000000;


    /*UART0中断均为IRQ中断*/
    rINTMOD &= ~(1 << BITPOS_INT_UART0);


 /*安装UART0中断向量*/
 pISR_UART0 = (uint32) Uart0_OSHandler;


    /*使能UART0 RXD0子中断*/
 rINTSUBMSK &= ~(1 << BITPOS_SUBINT_RXD0);
 /*打开UART0中断允许*/
 rINTMSK &= ~(1 << BITPOS_INT_UART0);


 return EXCU_OK;
}


注意


1.这里的中断时受RTOS管理的,每中断接收一个字符,并发送一次信号量给另一个任务,同时进行任务切换;


2.上面代码已经可以成功接收超级终端发来的字符,在QQ2440V3上验证过;


3.明天搞LCD驱动和调试信息在LCD上的显示方式;

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /3 下一条