|
新手咨詢個問題,一直困惑很久了,求解答。
板子是采用STM32L151,程序是前人寫的,其中有一功能塊是跟上位機(jī)或后臺485通訊,用的是UART1,通訊很正常。但我一直在困惑程序是怎么處理串口1的,因?yàn)樵趍ain()里除了串口1初始化語句外,沒有任何該串口的處理語句。在中斷部分里也是普通的串口發(fā)送接收語句。系統(tǒng)里也沒看到OS方面的語句(自己還沒學(xué)過OS這一塊,當(dāng)時擔(dān)心是不是程序里加了OS),但uart1跟后臺通訊很正常,一直琢磨這程序是怎么運(yùn)行的。我貼出具體程序,煩請幫忙分析一下。
在中斷stm32l1xx_it.c里有串口的處理語句:
void USART1_IRQHandler(void)
{
App_UART1_Irq_Handle();
App_UART1_Task(); //通信任務(wù)
}
在App_UART1_Irq_Handle()里,就是正常的串口接收和發(fā)送,要說復(fù)雜點(diǎn)就是用了隊(duì)列通訊方式,其他也沒看出有跳轉(zhuǎn)出去執(zhí)行通訊處理部分。
void App_UART1_Irq_Handle(void)
{
//接收中斷
if(USART_GetITStatus(RS485_USARTX, USART_IT_RXNE) != RESET)
{
g_Com_Buff.com_Buff[g_Com_Buff.com_lenth] = Sub_Com_check_even(USART_ReceiveData(RS485_USARTX)); //接收數(shù)據(jù)并進(jìn)行偶校驗(yàn)
g_Com_Buff.com_lenth++;
//判斷長度超標(biāo)處理
if (g_Com_Buff.com_lenth > MAX_ADU_LENTH)
{
g_Com_Buff.com_lenth = 0;
}
//發(fā)送串口接收消息
Queue_Insert(&Com_Queue ,COM_MSQ_IDLE_RX_ONE_BYTE);
USART_ClearFlag(RS485_USARTX, USART_FLAG_RXNE);//清除中斷標(biāo)志
}
//發(fā)送中斷
if(USART_GetITStatus(RS485_USARTX, USART_IT_TXE) != RESET)
{
USART_SendData(RS485_USARTX, g_Com_Buff.com_Buff[current_send++]);
if(current_send >= g_Com_Buff.com_lenth)
{
//等待最后一個數(shù)據(jù)送完
while(USART_GetFlagStatus(RS485_USARTX, USART_FLAG_TC) == RESET);
USART_ClearFlag(RS485_USARTX, USART_FLAG_TC);
//關(guān)發(fā)送中斷
Bsp_rs485_Tx_Int_Ctr(0);
//current_send = 0;
if(Queue_Insert(&Com_Queue ,COM_MSQ_RESPON_OK) != Q_OK)
{
Bsp_rs485_dir_Ctr(1);
Bsp_rs485_Rx_Int_Ctr(1);
}
}
}
}
在 App_UART1_Task();里
void App_UART1_Task(void)
{
/*!< 消息數(shù)目變量*/
d_uint8 qmsg_com_num = 0;
/*!< 判斷消息隊(duì)列中是否有消息*/
if (Queue_Query(&Com_Queue, &qmsg_com_num) == PAR_ERR)
{
/*!< 隊(duì)列出現(xiàn)致命錯誤*/
App_Com_Task_Init();
com_state = COM_IDLE;
com_last_state = COM_IDLE;
return;
}
/*!< 消息隊(duì)列中有消息*/
while (qmsg_com_num > 0)
{
com_state = Com_Task_Table[com_last_state].pHandle();
if (com_state != com_last_state)
{
Com_Task_Table[com_last_state].pExit();
Com_Task_Table[com_state].pEnter();
com_last_state = com_state;
}
/*!< 判斷消息隊(duì)列中是否有消息*/
if (Queue_Query(&Com_Queue, &qmsg_com_num) == PAR_ERR)
{
/*!< 隊(duì)列出現(xiàn)致命錯誤*/
App_Com_Task_Init();
com_state = COM_IDLE;
com_last_state = COM_IDLE;
return;
}
}
}
這一塊也沒有看出系統(tǒng)執(zhí)行到這里,跳出去處理其他語句函數(shù)啥的。
煩請大家?guī)臀曳治鲆幌�,如果上位機(jī)發(fā)送數(shù)據(jù)過來,程序中斷跳轉(zhuǎn)到這兩個語句里,是怎么跳出去處理的?
|
|