/******************************************************************************* * Function Name : CAN1_RX1_IRQHandler * Description : This function handles CAN1 RX1 request. * Input : None * Output : None * Return : None *******************************************************************************/ void CAN1_RX1_IRQHandler(void) { if(CAN_GetITStatus(CAN1,CAN_IT_FMP1)== SET) { // if(Bridge.CAN_State!= CAN_PROC_MSGINQUEUE && Bridge.CAN_State!= CAN_PROCESSING ) //{ CAN_Receive(CAN1, CAN_FIFO1, &Bridge.RxMessage1); CANpacket_receive=1; Bridge.CAN_State=ChangeState_level_Busier(Bridge.CAN_State); //CAN_ClearITPendingBit(CAN1, CAN_IT_FMP1) //Don't need this line the intterruption is cleared automatically when read /* } else { Bridge.CAN_Err.ErrorId=CAN_FULLQUEUE; Bridge.CAN_Err.ErrorData= 0; }*/ } else { /*This case has to be treated as an important problem of using the multiport communication: The priority of the CAN communication have to be modified after tests or make an automated algorithm that (numerically ) */ if(CAN_GetITStatus(CAN1,CAN_FLAG_FF1)== SET) { //CAN_ClearITPendingBit( CAN1,CAN_FLAG_FF1); Bridge.CAN_Err.ErrorId=CAN_OVERFLOW; Bridge.CAN_Err.ErrorData=CAN_MessagePending( CAN1,CAN_FIFO1); } /*Interrupt when error iss reported by the CAN BUS controller*/ else if(CAN_GetITStatus(CAN1,CAN_IT_ERR)== SET) { Bridge.CAN_Err.ErrorId=CAN_RCVERR; Bridge.CAN_Err.ErrorData=CAN_GetLastErrorCode(CAN1); } } }
/** * Hardware error ISR for CAN * * @param unit CAN controller number( from 0 ) */ static void Can_ErrIsr( int unit ) { CAN_HW_t *canHw = GetController(unit); Can_UnitType *canUnit = CAN_GET_PRIVATE_DATA(unit); Can_Arc_ErrorType err; err.R = 0; // Check wake up if(SET == CAN_GetITStatus(canHw, CAN_IT_WKU)){ Can_WakeIsr(unit); CAN_ClearITPendingBit(canHw, CAN_IT_WKU); } if(SET == CAN_GetITStatus(canHw, CAN_IT_BOF)){ canUnit->stats.boffCnt++; CanIf_ControllerBusOff(unit); Can_SetControllerMode(unit, CAN_T_STOP); // CANIF272 Can_AbortTx( canHw, canUnit ); // CANIF273 // Clear int CAN_ClearITPendingBit(canHw, CAN_IT_BOF); } if (err.R != 0) { CanIf_Arc_Error( unit, err ); } }
void CAN1_RX0_IRQHandler(void) { // Check the cause of the interrupt if(CAN_GetITStatus(CAN1, CAN_IT_FMP0) == SET) { // Pending message in Fifo 0 CAN_Receive(CAN1, CAN_FIFO0, &CAN_RxStruct); xSemaphoreGive(CANReceiveSemaphore); } else if(CAN_GetITStatus(CAN1, CAN_IT_FF0) == SET) { // Fifo 0 is full } else if(CAN_GetITStatus(CAN1, CAN_IT_FOV0) == SET) { // Fifo 0 overrun } }
void USB_HP_CAN1_TX_IRQHandler(void) //CAN TX {//发送成功进入中断 if (CAN_GetITStatus(CAN1,CAN_IT_TME)!= RESET) { CAN_ClearITPendingBit(CAN1,CAN_IT_TME); } }
void CAN1_RX0_IRQHandler(void) { if (CAN_GetITStatus(CAN1,CAN_IT_FMP0)){//新しいメッセージを受信したら呼び出される CAN_Receive(CAN1, CAN_FIFO0, &can_rx_flame);//受信 GPIOD->BSRRL = GPIO_Pin_15; CAN_Node_Check(&can_rx_flame); } }
//↑今までの割込み関数 //↓今回変更した割込み関数 void CAN1_TX_IRQHandler(void) { if (CAN_GetITStatus(CAN1,CAN_IT_TME)){//メールボックスが空になったら呼び出される 何も送ってない状態では呼び出されない GPIOD->BSRRL = GPIO_Pin_14; //CAN_Transmit_List_Stack(1,&can_tx_flame);//can_tx_flameに次に送るデータを格納する CAN_Transmit(CAN1, &can_tx_flame);//送信 CAN_ClearITPendingBit(CAN1,CAN_IT_TME); } }
void CAN1_RX0_IRQHandler(void) { CanRxMsg RxMessage; //CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); //myRxMessage1 =RxMessage; if(SET == CAN_GetITStatus(CAN1, CAN_IT_FF0)) { CAN_ClearITPendingBit(CAN1, CAN_IT_FF0); } else if(SET == CAN_GetITStatus(CAN1, CAN_IT_FOV0)) { CAN_ClearITPendingBit(CAN1, CAN_IT_FOV0); } else { CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0); CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); FIFO_PUT_ONE(CAN1_RxFifo, RxMessage); } }
/******************************************************************************* * Function Name : CAN_RX0_CALLBACK * Description : CAN0接收的回调函数 * Input : None * Output : None * Return : None *******************************************************************************/ void CAN_RX0_CALLBACK(void) { if (CAN_GetITStatus(CAN1,CAN_IT_FMP0)!= RESET) { CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0); g_CAN_Rx_Provider++; if(g_CAN_Rx_Provider >= CAN_RX_BUFFER_SIZE) g_CAN_Rx_Provider = 0; CAN_Receive(CAN1, CAN_FIFO0, &g_CAN_Rx_message[g_CAN_Rx_Provider]); } }
void CAN1_RX0_IRQHandler(void) { CanRxMsg rx_message; if (CAN_GetITStatus(CAN1, CAN_IT_FMP0) != RESET) { CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0); CAN_Receive(CAN1, CAN_FIFO0, &rx_message); if(can1_rh) can1_rh(&rx_message); } }
void CAN1_RX0_IRQHandler(void) { CanRxMsg RxMessage; static portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; if (CAN_GetITStatus (CAN1, CAN_IT_FMP0)) { CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); if ((RxMessage.StdId == CAN_SLAVE_STD_ID) && (RxMessage.IDE == CAN_ID_STD) && (RxMessage.DLC == CAN_DATA_LENGTH)) xQueueSendToBackFromISR(CanRxQueue, &RxMessage, &xHigherPriorityTaskWoken); } portEND_SWITCHING_ISR(xHigherPriorityTaskWoken); }
// CAN Receive void CAN1_RX0_IRQHandler (void) { __disable_irq(); if (CAN_GetITStatus(CAN1,CAN_IT_FMP0) != RESET) { CANparseMessage(CAN_FIFO0); RxCAN.FIFO0 = SET; GPIOA->ODR ^= GPIO_Pin_5; } __enable_irq(); }
//CAN1接收中断调用函数 void DST_CAN_1::CAN1_RX0_IRQHandler_Fun(void) { if(CAN_GetITStatus(CAN1,CAN_IT_FMP0)!= RESET) { CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0); CAN_Receive(CAN1, CAN_FIFO0, &can1_rx_msg); /********HG900 6025数据接收********/ _data_pro.HG900_6025_DataPro(&can1_rx_msg);//CAN1云台数据处理 //test fun ws(&can1_rx_msg); } }
void USB_LP_CAN1_RX0_IRQHandler(void) #endif { if (CAN_GetITStatus(CAN1, CAN_IT_FMP0) != RESET) { STM_EVAL_LEDOn(LED7); CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); SendCanMsg(RxMessage); STM_EVAL_LEDOff(LED7); } else USB_Istr(); }
void USB_LP_CAN1_RX0_IRQHandler(void) { if (CAN_GetITStatus(CAN1, CAN_IT_FMP0) == RESET) { return; } CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0); //GPIO_ResetBits(GPIOA, GPIO_Pin_8); CanRxMsg message; while(CAN_MessagePending(CAN1, 0)) { CAN_Receive(CAN1, 0, &message); } if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_8) == Bit_SET) { GPIO_ResetBits(GPIOA, GPIO_Pin_8); } else { GPIO_SetBits(GPIOA, GPIO_Pin_8); } }
void USB_LP_CAN1_RX0_IRQHandler(void) { if(CAN_GetITStatus(CAN1, CAN_IT_FMP0)) { CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0); CAN_Receive(CAN1, 0, &CanRxMsgStructure); for(countCAN = 0; countCAN < 8; countCAN++) { USART_SendData(USART2, CanRxMsgStructure.Data[countCAN]); while(!USART_GetFlagStatus(USART2, USART_FLAG_TC)); USART_ClearFlag(USART2, USART_FLAG_TC); } autoSendFlag++; startFlag = 1; } }
void Can0_Interrupt(){ if (CAN_GetITStatus(CAN1,CAN_IT_FMP0)){ CAN_Receive(CAN1, CAN_FIFO0, &can_rx_flame); Can0::read((int)can_rx_flame.StdId,(int)can_rx_flame.DLC,can_rx_flame.Data); } }
void CAN1_TX_IRQHandler(void) { int16_t id; int8_t code; uint32_t tsr; if (CAN_GetITStatus(CAN1, CAN_IT_TME) != RESET) { tsr = CAN1->TSR; if(can1_sh) { if((tsr & CAN_TSR_TME0) && (tsr & CAN_TSR_RQCP0)) { CAN1->TSR = CAN_TSR_RQCP0; id = can1_mailbox0_id; if (tsr & CAN_TSR_TXOK0) code = 0; else if (tsr & CAN_TSR_TERR0) code = 1; else if (tsr & CAN_TSR_ALST0) code = 3; else code = 4; } else if((tsr & CAN_TSR_TME1) && (tsr & CAN_TSR_RQCP1)) { CAN1->TSR = CAN_TSR_RQCP1; id = can1_mailbox1_id; if (tsr & CAN_TSR_TXOK1) code = 0; else if (tsr & CAN_TSR_TERR1) code = 1; else if (tsr & CAN_TSR_ALST1) code = 3; else code = 4; } else if((tsr & CAN_TSR_TME2) && (tsr & CAN_TSR_RQCP2)) { CAN1->TSR = CAN_TSR_RQCP2; id = can1_mailbox2_id; if (tsr & CAN_TSR_TXOK2) code = 0; else if (tsr & CAN_TSR_TERR2) code = 1; else if (tsr & CAN_TSR_ALST2) code = 3; else code = 4; } else { id = -1; } if(id >= 0) can1_sh(id, code); } if(can1_mutex_transmit == 0 && can1_mutex_queue == 0 && (can1_pq_full == 1 || can1_pq_end != can1_pq_start)) { can1_mutex_queue = 1; CAN1_Transmit(can1_pq[can1_pq_start].id, can1_pq[can1_pq_start].addr, can1_pq[can1_pq_start].data, can1_pq[can1_pq_start].size); can1_pq_full = 0; can1_pq_start = (can1_pq_start + 1) % CAN1_PACKET_QUEUE_SIZE; can1_mutex_queue = 0; } } }
/************************************************************************* CAN2_RX0_IRQHandler ���������������ǡ���������CAN���ݽ����ж� *************************************************************************/ void CAN2_RX0_IRQHandler(void) { CanRxMsg rx_message; if (CAN_GetITStatus(CAN2,CAN_IT_FMP0)!= RESET) { CAN_ClearITPendingBit(CAN2, CAN_IT_FMP0); CAN_Receive(CAN2, CAN_FIFO0, &rx_message); //�������������� if(rx_message.StdId == 0x401) { gyro_ok_flag = 1; temp_yaw_angle = (int32_t)(rx_message.Data[0]<<24)|(int32_t)(rx_message.Data[1]<<16) | (int32_t)(rx_message.Data[2]<<8) | (int32_t)(rx_message.Data[3]); last_yaw_angle = this_yaw_angle; this_yaw_angle = -((float)temp_yaw_angle*0.01); } //ң���� ��� ��̨ͨ�� if(rx_message.StdId == 0x402) { temp_yaw = (uint16_t)(rx_message.Data[0]<<8)|(uint16_t)(rx_message.Data[1]); temp_pitch = (uint16_t)(rx_message.Data[2]<<8)|(uint16_t)(rx_message.Data[3]); shooting_flag = (uint8_t)rx_message.Data[4]; mode_flag = (uint8_t)rx_message.Data[6];//S2 ���� //for mouse if(shooting_flag == 1) //cyq:��ǹ { if(ShootFlag == 1) { Motor_PWM_Set(MOTOR_NUM1,-1000); ShootFlag=0; } } else { if(ShootFlag == 0) { ShootFlag=1; } } if (mode_flag == 1) { target_pitch_angle += (temp_pitch - 1024)/66.0;//ң�� target_yaw_angle += (temp_yaw - 1024)/600.0 ;//cyq } else { target_pitch_angle -= (temp_pitch - 1024)/10.0;//cyq ������� target_yaw_angle += (temp_yaw - 1024)/10.0 ;//cyq:����µij��� } if(target_pitch_angle > pitch_max) { target_pitch_angle = pitch_max; } else if(target_pitch_angle < -pitch_max) { target_pitch_angle = -pitch_max; } } } }