📄 vectors08.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 + -