电子大神的日记本,供应链专家的功夫茶盘,在这里记录、分享与共鸣。

登录以开始

S3C2440串口0中断接收(一)

今天开始在基于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上的显示方式;

博主
1005869216@qq.com
songzi2017's Blog
songzi2017
点击跳转