📄 stm32f10x_it.c
字号:
/**
******************************************************************************
* @file CAN/LoopBack/stm32f10x_it.c
* @author MCD Application Team
* @version V3.3.0
* @date 04/16/2010
* @brief Main Interrupt Service Routines.
* This file provides template for all exceptions handler and
* peripherals interrupt service routine.
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_it.h"
#include "stm32_eth.h"
#include "can.h"
#include "spi.h"
#include <stdio.h>
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
CanRxMsg RxMessage; //CAN1
CanRxMsg RxMessage2; //CAN2
extern u8 tim_3;
extern u8 tim_5;
extern u8 tim_25;
extern volatile u16 tim_cnt;//定时器计数值
extern u8 can1_flag; //CAN1中断接收数据标志
extern u8 startflg1; //CAN1中断接收推子模块远程帧标志
extern u8 startmain; //CAN1中断接收总控模块远程帧标志
extern u8 InputFlag; //CAN2输入模块远程帧标志
extern u8 OutputFlag; //CAN2输出模块远程帧标志
extern u8 ADGainData[40]; //推子模块AD增益值
extern u8 ManGainData[4]; //总控模块AD增益值
extern u8 KeyData[20]; //按键接收值
extern u8 FaceKey; //总控模块界面按键
extern u8 TalkKey; //总控模块对讲按键
extern u8 EfctKey; //总控模块效果按键
extern u8 ScenKey; //总控模块场景按键
extern u16 TuiziAddr[5];
extern u16 InputAddr[5];
extern u16 OutputAddr[5];
extern void LwIP_Pkt_Handle(void);
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/******************************************************************************/
/* Cortex-M3 Processor Exceptions Handlers */
/******************************************************************************/
/**
* @brief This function handles NMI exception.
* @param None
* @retval None
*/
void NMI_Handler(void)
{
}
/**
* @brief This function handles Hard Fault exception.
* @param None
* @retval None
*/
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
}
/**
* @brief This function handles Memory Manage exception.
* @param None
* @retval None
*/
void MemManage_Handler(void)
{
/* Go to infinite loop when Memory Manage exception occurs */
while (1)
{
}
}
/**
* @brief This function handles Bus Fault exception.
* @param None
* @retval None
*/
void BusFault_Handler(void)
{
/* Go to infinite loop when Bus Fault exception occurs */
while (1)
{
}
}
/**
* @brief This function handles Usage Fault exception.
* @param None
* @retval None
*/
void UsageFault_Handler(void)
{
/* Go to infinite loop when Usage Fault exception occurs */
while (1)
{
}
}
/**
* @brief This function handles SVCall exception.
* @param None
* @retval None
*/
void SVC_Handler(void)
{
}
/**
* @brief This function handles Debug Monitor exception.
* @param None
* @retval None
*/
void DebugMon_Handler(void)
{
}
/**
* @brief This function handles PendSVC exception.
* @param None
* @retval None
*/
void PendSV_Handler(void)
{
}
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
}
/******************************************************************************/
/* STM32F10x Peripherals Interrupt Handlers */
/******************************************************************************/
/*******************************************************************************
* Function Name : TIM3_IRQHandler
* Description : This function handles TIM3 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIMx的中断待处理位:TIM 中断源
tim_cnt++;
if(tim_cnt%40 == 0) tim_25 = 1;
if(tim_cnt%200 == 0) tim_5 = 1;
if(tim_cnt%300 == 0) tim_3 = 1;
if(tim_cnt>=1000) tim_cnt= 0;
}
}
/**
* @brief This function handles CAN1 RX0 Handler.
* @param None
* @retval None
*/
void CAN1_RX0_IRQHandler(void)
{
u8 j = 0;
// GPIOE->ODR ^= GPIO_Pin_14; //LED闪烁
Init_RxMes(&RxMessage);
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
//推子模块初始化远程帧
if(((RxMessage.StdId & 0xFF)== 0x00)&&(RxMessage.IDE == CAN_ID_STD))
{
if(RxMessage.RTR == CAN_RTR_REMOTE)
{
switch(RxMessage.StdId)
{
case (0x100):
startflg1 |= 1<<0;
TuiziAddr[0] = RxMessage.StdId & 0x7FF;
break;
case (0x200):
startflg1 |= 1<<1;
TuiziAddr[1] = RxMessage.StdId & 0x7FF;
break;
case (0x300):
startflg1 |= 1<<2;
TuiziAddr[2] = RxMessage.StdId & 0x7FF;
break;
case (0x400):
startflg1 |= 1<<3;
TuiziAddr[3] = RxMessage.StdId & 0x7FF;
break;
case (0x500):
startflg1 |= 1<<4;
TuiziAddr[4] = RxMessage.StdId & 0x7FF;
break;
default:
break;
}
}
}
//标志符高3位为1-5,表示模块地址;低8位为1表示数据为按键值
else if(((RxMessage.StdId & 0xFF)== 0x01)&&(RxMessage.IDE == CAN_ID_STD))
{
// can1_flag = 1;
// if(RxMessage.DLC == 4){}
// GPIOE->ODR ^= GPIO_Pin_14; //LED闪烁
switch(RxMessage.StdId)
{
case (0x101):
can1_flag |= 1<<0;
KeyData[0] |= RxMessage.Data[0]; //一位表示一个按键状态,"|="可以防止
KeyData[1] |= RxMessage.Data[1]; //按下不同按键,但按键信息还没有来得
KeyData[2] |= RxMessage.Data[2]; //及处理时,按键信息丢失的情况。
KeyData[3] |= RxMessage.Data[3];
break;
case (0x201):
can1_flag |= 1<<1;
KeyData[4] |= RxMessage.Data[0];
KeyData[5] |= RxMessage.Data[1];
KeyData[6] |= RxMessage.Data[2];
KeyData[7] |= RxMessage.Data[3];
break;
case (0x301):
can1_flag |= 1<<2;
KeyData[8] |= RxMessage.Data[0];
KeyData[9] |= RxMessage.Data[1];
KeyData[10]|= RxMessage.Data[2];
KeyData[11]|= RxMessage.Data[3];
break;
case (0x401):
can1_flag |= 1<<3;
KeyData[12] |= RxMessage.Data[0];
KeyData[13] |= RxMessage.Data[1];
KeyData[14] |= RxMessage.Data[2];
KeyData[15] |= RxMessage.Data[3];
break;
case (0x501):
can1_flag |= 1<<4;
KeyData[16] |= RxMessage.Data[0];
KeyData[17] |= RxMessage.Data[1];
KeyData[18] |= RxMessage.Data[2];
KeyData[19] |= RxMessage.Data[3];
break;
default:
break;
}
}
//标志符高3位为1-5,表示模块地址;低8位为2表示数据为增益值
else if(((RxMessage.StdId & 0xFF)== 0x02)&&(RxMessage.IDE == CAN_ID_STD))
{
// if(RxMessage.DLC == 8){}
switch(RxMessage.StdId)
{
case (0x102): //模块1
for(j=0;j<8;j++)
ADGainData[j] = RxMessage.Data[j];
break;
case (0x202): //模块2
for(j=8;j<16;j++)
ADGainData[j] = RxMessage.Data[j-8];
break;
case (0x302): //模块3
for(j=16;j<24;j++)
ADGainData[j] = RxMessage.Data[j-16];
break;
case (0x402): //模块4
for(j=24;j<32;j++)
ADGainData[j] = RxMessage.Data[j-24];
break;
case (0x502): //模块5
for(j=32;j<40;j++)
ADGainData[j] = RxMessage.Data[j-32];
break;
default:
break;
}
}
//总控模块初始化远程帧
else if(((RxMessage.StdId & 0xFF)== 0x10)&&(RxMessage.IDE == CAN_ID_STD))
{
if(RxMessage.RTR == CAN_RTR_REMOTE)
{
if(RxMessage.StdId == 0x010) startmain = 1;
}
}
//总控模块(标识符高3位表示0x0模块地址,低8位为0x11表示数据为按键值)
else if(((RxMessage.StdId & 0xFF)== 0x11)&&(RxMessage.IDE == CAN_ID_STD))
{
if(((RxMessage.StdId>>8) & 0x7) == 0x0)
{
FaceKey = RxMessage.Data[0];
EfctKey = RxMessage.Data[1];
ScenKey = RxMessage.Data[2];
TalkKey |= RxMessage.Data[3];
}
}
//总控模块(标识符高3位表示0x0模块地址,低8位为0x12表示数据为增益值)
else if(((RxMessage.StdId & 0xFF)== 0x12)&&(RxMessage.IDE == CAN_ID_STD))
{
if(((RxMessage.StdId>>8) & 0x7) == 0x0)
{
ManGainData[0] = RxMessage.Data[0];
ManGainData[1] = RxMessage.Data[1];
ManGainData[2] = RxMessage.Data[2];
ManGainData[3] = RxMessage.Data[3];
}
}
else
;
}
/**
* @brief This function handles CAN2 RX0 Handler.
* @param None
* @retval None
*/
//void CAN2_RX0_IRQHandler(void)
void CAN2_RX1_IRQHandler(void)
{
u8 SlaveAddr = 0;
// GPIOE->ODR ^= GPIO_Pin_14; //LED闪烁
Init_RxMes(&RxMessage2);
CAN_Receive(CAN2, CAN_FIFO1, &RxMessage2);
// printf("RxMessage2.StdId = 0x%X\n",RxMessage2.StdId);
//输入模块初始化远程帧
if((((RxMessage2.StdId & 0xFF)== 0x01) || ((RxMessage2.StdId & 0xFF)== 0x02) ||
((RxMessage2.StdId & 0xFF)== 0x03))&& (RxMessage2.IDE == CAN_ID_STD))
{
if(RxMessage2.RTR == CAN_RTR_REMOTE) //&&(RxMessage2.DLC == 0)
{
SlaveAddr = (RxMessage2.StdId>>8) & 0x7; //根据模块地址判断
switch(SlaveAddr)
{
case (0x1):
InputFlag |= 1<<0;
InputAddr[0] = RxMessage2.StdId & 0x7FF; //地址1的ID
break;
case (0x2):
InputFlag |= 1<<1;
InputAddr[1] = RxMessage2.StdId & 0x7FF; //地址2的ID
break;
case (0x3):
InputFlag |= 1<<2;
InputAddr[2] = RxMessage2.StdId & 0x7FF; //地址3的ID
break;
case (0x4):
InputFlag |= 1<<3;
InputAddr[3] = RxMessage2.StdId & 0x7FF; //地址4的ID
break;
case (0x5):
InputFlag |= 1<<4;
InputAddr[4] = RxMessage2.StdId & 0x7FF; //地址5的ID
break;
default:
break;
}
}
}
//输出模块初始化远程帧
if((((RxMessage2.StdId & 0xFF)== 0x04)||((RxMessage2.StdId & 0xFF)== 0x05))
&&(RxMessage2.IDE == CAN_ID_STD))
{
if((RxMessage2.RTR == CAN_RTR_REMOTE)) //&&(RxMessage2.DLC == 0)
{
// Outputflag = 1;
SlaveAddr = (RxMessage2.StdId>>8) & 0x7; //根据模块地址判断
switch(SlaveAddr)
{
case (0x1):
OutputFlag |= 1<<0;
OutputAddr[0] = RxMessage2.StdId & 0x7FF; //地址1的ID
break;
case (0x2):
OutputFlag |= 1<<1;
OutputAddr[1] = RxMessage2.StdId & 0x7FF; //地址2的ID
break;
case (0x3):
OutputFlag |= 1<<2;
OutputAddr[2] = RxMessage2.StdId & 0x7FF; //地址3的ID
break;
case (0x4):
OutputFlag |= 1<<3;
OutputAddr[3] = RxMessage2.StdId & 0x7FF; //地址4的ID
break;
case (0x5):
OutputFlag |= 1<<4;
OutputAddr[4] = RxMessage2.StdId & 0x7FF; //地址5的ID
break;
default:
break;
}
}
}
}
/**
* @brief This function handles ETH interrupt request.
* @param None
* @retval None
*/
void ETH_IRQHandler(void)
{
/* Handles all the received frames */
while(ETH_GetRxPktSize() != 0)
{
LwIP_Pkt_Handle();
}
// net_flag = 1;
// GPIOD->ODR ^= GPIO_Pin_7;
// GPIOE->ODR ^= GPIO_Pin_14; //LED闪烁(表示中断进行)
/* Clear the Eth DMA Rx IT pending bits */
ETH_DMAClearITPendingBit(ETH_DMA_IT_R);
ETH_DMAClearITPendingBit(ETH_DMA_IT_NIS);
}
/******************************************************************************/
/* STM32F10x Peripherals Interrupt Handlers */
/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
/* available peripheral interrupt handler's name please refer to the startup */
/* file (startup_stm32f10x_xx.s). */
/******************************************************************************/
/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -