📄 intdocument.c
字号:
//=============================================================
// 文件名称: IntDocument.c
// 实现功能: 各中断服务程序
// 完成日期: 2004,7,20
//==============================================================
#define P_INT_Ctrl (volatile unsigned int *)0x7010
#define P_INT_Clear (volatile unsigned int *)0x7011
#define P_INT_Ctrl_New (volatile unsigned int *)0x702d
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
#define P_TimerB_Data (volatile unsigned int *)0x700C
#define P_TimerB_Ctrl (volatile unsigned int *)0x700D
#define M_TIMERA_EN 0x0001 //使能TimerA的配置,计数频率为96KHz
#define M_TIMERA_STOP 0x0006 //停止TimerA的配置,计数器停止工作
extern unsigned int uiIOB_20Hz_flag; //IOB01口(即20Hz方波输出口)的状态标识
extern unsigned int uiEXT_EN_flag; //外部中断使能标识位
extern unsigned int uiMeasure_Index; //当前测量的次数
extern unsigned int uiResult[4]; //保存测四次测量结果的缓存区
//=============================================================
// 函数名称: IRQ6()
// 功能描述: TMB1/2中断服务程序 程序中设TMB1为16Hz
// 每62.5ms进行一次测量 每次查询共进行四次测量
// 语法格式: void IRQ6(void)
// 入口参数: 无
// 出口参数: 无
// 注意事项: 仅为用户模型
//=============================================================
void IRQ6(void)__attribute__((ISR));
void IRQ6(void)
{
int iTemp; //中量变量
iTemp = *P_INT_Ctrl;
if(iTemp&0x0002)
{
*P_INT_Clear=0x0002;
if(uiEXT_EN_flag)
{//假如上次测量还没有接收到回波信号 出错管理
*P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0100); //关掉外部中断
uiEXT_EN_flag = 0; //标识位清零
*P_TimerB_Ctrl = M_TIMERA_STOP; //同时计数器停止工作
}
uiMeasure_Index++; //自加一
if(uiMeasure_Index>4)
{//单次查询已测够四次,可以进行数据处理了
*P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0100); //关掉外部中断
*P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0002); //关掉TMB1的时基中断
uiEXT_EN_flag = 0; //标识位清零
uiIOB_20Hz_flag = 0;
*P_TimerB_Ctrl = M_TIMERA_STOP; //同时计数器停止工作
}
else
{
US_Send200us(); //符合条件,可以进行查询
}
}
}
//=============================================================
// 函数名称: IRQ3()
// 功能描述: 外部中断服务程序
// 得到结果(时间差)并进行初步处理
// 语法格式: void IRQ3(void)
// 入口参数: 无
// 出口参数: 无
// 注意事项: 仅为用户模型
//=============================================================
void IRQ3(void)__attribute__((ISR));
void IRQ3(void)
{
unsigned int uiTemp;
unsigned int uiResult1; //结果的暂存
unsigned int i;
uiTemp=*P_INT_Ctrl;
if(uiTemp&0x0100)
{
if(uiEXT_EN_flag)
{
*P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0100); //关掉外部中断
uiEXT_EN_flag = 0;
uiResult1 = *P_TimerB_Data; //读取结果
*P_TimerB_Ctrl = M_TIMERA_STOP; //同时计数器停止工作
//对测得的时间差进行初步处理.......
if(uiMeasure_Index == 1)
{
uiResult[0] = uiResult1;
}
else
{
i = uiMeasure_Index-1;
while(i)
{
if(uiResult1>uiResult[i-1])
{
uiResult[i] = uiResult[i-1];
uiResult[i-1] = uiResult1;
}
else
{
uiResult[i] = uiResult1;
}
i--;
}
}//end.......
}
*P_INT_Clear = 0x0100;
}
}
//============================================================================================================//
//Program: IRQ45 2Hz中断入口程序 用来清WatchDog
//InPut:
//OutPut:
//Date: 2004年6月4日
//
//============================================================================================================//
void IRQ5(void)__attribute__((ISR));
void IRQ5(void)
{
unsigned int Int_Temp;
Int_Temp=*P_INT_Ctrl;
if((Int_Temp&0x0008)==0x0008)
{
*P_Watchdog_Clear=0x0001;
*P_INT_Clear=0x0008;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -