今天开始在基于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上的显示方式;
文章评论(0条评论)
登录后参与讨论