用stm8AF52AF單片機進行CAN通訊資料接收并決議時,寫的CAN中斷函式出現不能跳出中斷函式,用CANpro軟體給板子發資料的時候,過了一段時間程式就死在了CAN中斷函式里跳不出來,請教一下各位是如何寫can 中斷處理函式,我的程式如下
INTERRUPT_HANDLER(CAN_RX_IRQHandler, 8)
{
unsigned char x8=0;
CAN_Id_TypeDef ide;
CAN_RTR_TypeDef rtr;
/* Receiver Receives Frame */
CAN_SyncFlag = SET;
CAN_Receive();
CAN_ReceivedId=CAN_GetReceivedId();
CAN_ReceivedDLC=CAN_GetReceivedDLC();
ide=CAN_GetReceivedIDE();//讀取幀型別(標準或擴展)
rtr=CAN_GetReceivedRTR();//讀取幀型別(資料或遠程)
for(x8=0;x8<CAN_ReceivedDLC;x8++)
{
CAN_ReceivedData[x8]=CAN_GetReceivedData(x8);
}
CAN_ReceivedDataFlag= SET;
CAN->IER = 0;
}
void CANRxHandle(void)
{
unsigned char x8=0;
unsigned int y16=0;
unsigned long y32=0;
if(CAN_ReceivedDataFlag!=RESET)
{
LED =!LED;
CAN_ReceivedDataFlag = RESET;
//報文決議
switch (xxx)
{
資料決議
}
//-------------------------
default:break;
}//
CAN_SyncFlag = RESET;
CAN_RxTimeOut = 0;
CAN_ReceivedDataFlag = RESET;
}
}
#define TIM4_PRESCALER1 995// freq / 1000 = 1Hz
unsigned int TIM4_Prescaler1 = 0;
INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
{
Tim1sCnt++;//1s tick counter
Tim100msCnt++;//100ms tick counter
DlyMsCnt++;//delay ms counter
SampFreqMsCnt++;//sample frequency counter
DispRefreshFreqMsCnt++;//display refresh frequency counter
RingDlyMsCnt++;
//--------------------------------------------------------
if(RingFlag != RESET)
{
BUZ = !BUZ;
}
else
{
BUZ = BUZ_OFF;
}
//--------------------------------------------------------
if(TIM4_Prescaler1++ >= TIM4_PRESCALER1)
{
TIM4_Prescaler1 = 0;
SysTime.second++;
SecondCnt++;
}
/*----------------------------------------------------*/
if(UART1_RxFlag != RESET)
{
UART1_RxOvTimMsCnt++;
if(Rx7eFlag)
{
if(UART1_RxOvTimMsCnt >= 5000)
{
Rx7eFlag = RESET;
UART1_RxFlag = RESET;
UART1_RxOvTimMsCnt = 0;
UART1_RxCounter = 0;
}
}
else
{
if(UART1_RxOvTimMsCnt >= UART1_RX_OVTIM_MS)
{
UART1_RxOkFlag=SET;
UART1_RxFlag = RESET;
UART1_EnableRxFlag=RESET;
UART1_RxOvTimMsCnt = 0;
}
}
}
/*----------------------------------------------------*/
if(UART3_RxFlag != RESET)
{
if(UART3_RxOvTimMsCnt++ >= UART3_RX_OVTIM_MS)
{
UART3_RxFlag = RESET;
UART3_RxOvTimMsCnt = 0;
UART3_RxCounter = 0;
}
}
/*----------------------------------------------------*/
//超時處理
if(CAN_SyncFlag != RESET)
{
if(CAN_RxTimeOut++ >= CAN_RX_TIME_OUT)
{
CAN_SyncFlag = RESET;
// CAN_EnableRxFlag =RESET;
CAN_ReceivedDataFlag= RESET;
CAN_RxTimeOut = 0;
//CanFreqSCnt = 0;
}
}
/*----------------------------------------------------*/
/* Clear TIM4 update flag */
TIM4->SR1 = (uint8_t)(~TIM4_FLAG_UPDATE);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/87182.html
標籤:單片機/工控
上一篇:剛剛面試上一家公司,求解答的,急
