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

📄 vectors08.c

📁 项目是为日本瑞萨工作所做的BAKE炉温控系统 整个文件夹包括设计文档
💻 C
字号:
//-------------------------------------------------------------------------*
//文件名:vectors08.c                                                       *
//功  能:用于定义中断矢量表                                                *
//-------------------------------------------------------------------------*
//头文件
#include "GP32C.H"          //包含头文件
#include "Type.h"           //类型别名定义
#include "EnDisInt.h"       //开放或禁止MCU各模块中断头文件
#include "LCD.h"            //包含LCD驱动头文件
#include "Show.h"           //包含LCD显示头文件
#include "SCI.h"         //包含SCI发送接收头文件
#include "Flash.h"          //擦写Flash函数声明
//定时器相应寄存器定义  
#define TOFBit     7        //定时器溢出标志位
#define CH0FBit    7        //定时器通道标志位

//全局变量声明
extern INT16U ADValue[11];      //11路A/D采集数据

extern INT8U LcdShowBuff[64];  //外部定义64个字节的LCD显示缓冲区
extern INT16U Temper;          //设定温度
extern INT16U CurtTmp;         //当前温度
extern INT16U CurtTime;        //当前时间
extern INT16U Time;            //定时时间
extern INT8U ScdTim;           //中断秒数
extern INT16U MntTim;          //中断分数
extern const INT16U BigNumCode[10][32];  //32*16点阵数字编码首地址
extern const INT8U  MCUno;     //MCU号
extern INT8U SendFlag;         //是否需要向PC发送参数的标志
extern INT8U FlashFlag1;       //因为校准值要写Flash的标志
extern INT8U FlashFlag2;       //因为改MCU号要写Flash的标志
extern INT16U TmaxAdjust;      //PC发来的当前温度校准值
extern INT8U NewMCUno;         //PC发来的新MCU号
extern INT8U CaptureTime;      //捕捉中断用来记上次中断发生时间防"抖动"
extern INT8U BakeFlag;         //Bake炉电源重启按钮是否按下的标志
extern INT8U ResetFlag;        //复位按钮是否按下的标志

extern INT8U  N;     //写入数据的个数
extern INT8U  FlashData[111]; //写入的数据


//=======================中断处理函数函数===================================

//isrSCIRe:串行接收中断处理函数--------------------------------------------*
//功  能:接收PC发来的数据,根据帧中不同的命令置相应标志                    *
//       命令要求的具体操作在主循环中进行,中断处理函数应尽量简单          *
//帧格式: 1字节MCU号+1字节命令+2字节数据(若只有1字节数据,"后对齐")        *
//说  明:                                                                  *
//       修改的全局变量:TmaxAdjust、NewMCUno                               *
//       修改的标志:SendFlag、FlashFlag1、FlashFlag2                       *
//-------------------------------------------------------------------------*
#pragma interrupt_handler isrSCIRe
void isrSCIRe(void)
{
   INT8U data[4],i;
   INT8U tmp[12];
   
   DisableMCUInterrupt();  //禁止总中断
   
   //接收4字节数据,根据帧头的MCU号判断是否作进一步处理
   SCIReN(1,data); 
   if(data[0]==MCUno)
   {
      SCIReN(4,data);
      if(data[3]=='E')  //帧头:MCU号;帧尾:'E'
        switch(data[0])
        {
          case 'R'://读数据命令
                 SendFlag=1; 
                 break;
                 
          case 'T'://校准当前温度值命令
                 SCISend1(0x56);    //反馈给PC表示接收成功
                 TmaxAdjust=data[1]*256 +data[2];   //当前温度的校准值
                 FlashFlag1=1;
                 break;
                 
          case 'M'://更改MCU号命令
                 SCISend1(0x56);    //反馈给PC表示接收成功
                 NewMCUno=data[2];  //新的MCU号
                 FlashFlag2=1;
                 break;
       }//switch
   }
   else if(data[0]==MCUno+10) 
   {
       SCIReN(111,FlashData);
       N=110;
/*       SCISendN(110,FlashData);
       
        EraseFlash(0x8080); //擦除0x8000为始址的一个页
        WriteFlash(0x8080); //将FlashData[8]数组的8个数据写入0x8000为始址的一个页
        

for(i=0;i<11;i++) 
   FlashData[i]=i;      
N=11;
    FLBPR=0b11111111;     //不保护FLASH区域
        EraseFlash(0x8080); //擦除0x8000为始址的一个页
    FLBPR=0b11111111;   //不保护FLASH区域
        WriteFlash(0x8080); //将FlashData[8]数组的8个数据写入0x8000为始址的一个页
SCISendN(110,(INT8U *)0x8080);          
*/   
       FlashFlag1=1;
   }   
   EnableMCUInterrupt();  //开放总中断
}

 
//isrTIMER1:定时器1溢出中断处理函数----------------------------------------*
//功  能:每1秒计时秒数加1,加到60(不含)就清0,并分数加1                    *
//       LCD显示刷新间隔:1秒                                              *
//说  明:                                                                  *
//       修改的全局变量:ScdTim、MntTim                                     *
//       使用的全局变量:CurtTmp,Temper,CurtTime,Time,LcdShowBuff[64]       *
//       使用的常量:BigNumCode                                             *
//       修改的标志:无                                                     *
//-------------------------------------------------------------------------*
#pragma interrupt_handler isrTIMER1
void isrTIMER1(void)
{
    DisableMCUInterrupt();   //禁止总中断
    
    //1 计时加热时间
    if(ScdTim<59)
       ScdTim++;             //秒计数
    else 
    {
       MntTim++;             //分计数
       ScdTim=0;
    } 
       
    //3 清除定时器溢出标志位
    T1SC&=~(1<<TOFBit);
    
    EnableMCUInterrupt();    //开放总中断
}

//isrTim2Ch0I:定时器2通道0下降沿输入捕捉中断处理程序-----------------------*
//功  能: 复位按钮按下触发此中断,置标志                                   *
//说  明:                                                                  *
//       修改的全局变量:CaptureTime(防"抖动")                              *
//       使用的全局变量:ScdTim                                             *
//       修改的标志:ResetFlag                                              *
//-------------------------------------------------------------------------*
#pragma interrupt_handler isrTim2Ch0I
void isrTim2Ch0I(void)
{
    DisableMCUInterrupt();     //禁止总中断
    
    
    //防"抖动",1秒内最多只算一次中断
    if(CaptureTime !=ScdTim)   //好像有1/60的概率将正常中断防掉诶?!
    {
        ResetFlag=1;
    }   
    CaptureTime=ScdTim;        //更新"上次"中断时间
    
   	//清除定时器溢出标志位 
	T2SC0&=~(1<<CH0FBit);	  
	
    EnableMCUInterrupt();      //开放总中断
}
//isrTim2Ch1I:定时器2通道1下降沿输入捕捉中断处理程序-----------------------*
//功  能: Bake炉电源重启按钮按下触发此中断,置标志                         *
//说  明:                                                                  *
//       修改的全局变量:CaptureTime(防"抖动")                              *
//       使用的全局变量:ScdTim                                             *
//       修改的标志:BakeFlag                                               *
//-------------------------------------------------------------------------*
#pragma interrupt_handler isrTim2Ch1I
void isrTim2Ch1I(void)
{
    DisableMCUInterrupt();     //禁止总中断
    
    //防"抖动",1秒内最多只算一次中断
    if(CaptureTime !=ScdTim)   //好像有1/60的概率将正常中断防掉诶?!
    {
        BakeFlag=1;
    }   
    CaptureTime=ScdTim;           //更新"上次"中断时间
    
    //清除定时器溢出标志位
	T2SC1&=~(1<<CH0FBit);	  
    EnableMCUInterrupt();     //开放总中断
}

/**/
//未定义的中断处理函数,本函数不能删除
#pragma interrupt_handler isrDummy  
void isrDummy(void) 
  {
  }

//=============================中断向量表===================================
//中断矢量表,需定义中断函数,可修改下表中的相应项目
//(interrupt service routine,isr 中断处理程序)
#pragma abs_address:0xffdc    //中断向量表起始地址
void (* const _vectab[])(void) = {            
	isrDummy,		//时基中断 
	isrDummy,		//AD转换中断      
	isrDummy, 	    //键盘中断    
	isrDummy,		//SCI TC/TE 
	isrSCIRe,	    //SCI RF/IDLE 
	isrDummy,		//SCI PE/FE/NF/OR
	isrDummy,		//SPI TE  
	isrDummy,		//SPI MOD/OVR/RF
	isrDummy,		//TIM2溢出中断 
	isrTim2Ch1I,		//TIM2通道1
	isrTim2Ch0I,		//TIM2通道0
   	isrTIMER1,		//TIM1溢出中断      
	isrDummy,		//TIM1通道1
	isrDummy,		//TIM1通道0
	isrDummy,		//CGM     
	isrDummy,		//IRQ     
	isrDummy		//SWI       
    //RESET也是中断,定义在 crt08.o中 
   };
#pragma end_abs_address      

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -