⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stm32f10x_it.c

📁 LWIP在STM32裸机上的移植
💻 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 + -