📄 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_SystemClock (volatile unsigned int *)0x7013
#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]; //保存测四次测量结果的缓存区
extern void US_Send200us(void); //启动模组发送40KHz信号
//=============================================================
// 函数名称: 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;
}
}
//=============================================================
// 函数名称: void IRQ4(void)
// 功能描述: IRQ4的中断服务程序,利用1KHZ作为后台延时程序的
// 计数
// 语法格式: void IRQ4(void)
// 入口参数: 无
// 出口参数: 无
// 注意事项: 仅为用户模型
//=============================================================
extern void Show_Flag(void);
extern unsigned int Counter_1KHz;
void IRQ4(void)__attribute__((ISR));
void IRQ4(void)
{
Counter_1KHz++;
Show_Flag(); //调用显示刷新程序
*P_INT_Clear=0x0020;
}
//=============================================================
// 函数名称: void IRQ5(void)
// 功能描述: IRQ5的中断服务程序,利用2Hz中断,作为语音播放的
// 控制程序的一部分,以避免语音播报过于频繁
// 语法格式: void IRQ5(void)
// 入口参数: 无
// 出口参数: 无
// 注意事项: 仅为用户模型
//=============================================================
extern unsigned int Counter_2Hz; //在Speech.c中定义
void IRQ5(void)__attribute__((ISR));
void IRQ5(void)
{
Counter_2Hz++;
if(Counter_2Hz>6)
*P_INT_Ctrl = *P_INT_Ctrl_New&0xfff7; //如果超过3秒了,则关闭IRQ5的2HZ中断
*P_INT_Clear=0x0008; //清中断标志位
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -