关于8G1K08A的INT1外部双边沿中断的服务使用的想法,
近期在使用8G1K08A MCU时发现。在实际的使用过程中。刚开始的,使用INT1中断服务。使用双边沿触发的情况。当时的思路是这样的。
可以通在void int1_isr中,通过判断IE1的中断标志位就可以了。
但在使用过程中,发现只要触发一次。不管是后面是否触发。IE1都不能清除,且也清除不了。。。
按说这个过程应该是很顺且效率是比较高的。因为是双边沿触发功能启后,只检测下升沿或下降沿。。。
直到现在还是不能理解。。
后来,使用了ISP中的if else语句才实现判断双边沿触发。但这样的话。算是要先读取P3.3脚的当前状态。再断判和比较,效率要低一点点。。。
如果有输入和输出随动情况出现的话。if里要加一次,在else里也要加一次。。。
C句如下。。。。
可能是我理解的不够。。还请多赐教。。谢谢。
我的疑惑是,如果判断IE1标志位能不能实现。。想要答案。。
除中断服务内不同外。其他语句都相同。(没有完全发出语句其他语句没有问题。因为通过第二种方案,功能已实现。其他的不太重要。重要的是为啥直接检测IE1,不能实现双边触发检测功能)
第一种C句
// INT1中断服务函数
void INT1_Isr() interrupt 2 //INT1中断入口
{
// 检测上升沿或下降沿是否发生
if(IE1) {
IE1 = 0;
// 首次下降沿检测执行
if(first_edge_flag && (P33 == 0)) { // 确认当前为低电平
first_edge_flag = 0;
flag_p32_delay = 1;
timer_p32 = 0;
}
// 所有边沿触发
flag_p55_delay = 1;
timer_p55 = 0;
}
}
第二种C句
void main(void)
{
GPIO_Init(); // 初始化GPIO
Timer0_Init(); // 定时器配置
IT1 = 0; // 配置INT1为双边沿触发
EX1 = 1; //使能INT1中断(根据手册调整)
EA = 1; // 开启总中断
while(1)
{
// 处理P3.2的200ms延时
if(flag_p32_delay && timer_p32 >= 200)
{
P32 = 1; // 永久保持高电平
flag_p32_delay = 0; // 关闭标志
}
// 处理P5.5的100ms延时
if(flag_p55_delay && timer_p55 >= 100)
{
P55 = ~P33; // 同步取反输入状态
flag_p55_delay = 0;
}
}
}
// GPIO初始化函数
void GPIO_Init(void)
{
// P3.3配置为输入(准双向模式)
P3M0 &= ~0x08; P3M1 &= ~0x08;
P3PU |= 0x08; // 弱上拉至高电平
// P3.2配置为推挽输出
P3M0 |= 0x04; P3M1 &= ~0x04;
P3 &= ~(1 << 2); //P32 = 0; 初始化低电平
// P5.5配置为推挽输出
P5M0 |= 0x20; P5M1 &= ~0x20;
P5 &= ~(1 << 2); //P55 = 0; 初始化低电平
}
// INT1中断服务函数
void INT1_Isr() interrupt 2 //INT1中断入口
{
// 检测上升沿或下降沿是否发生
if(!P33) { //发生下降沿执行
// 首次下降沿检测执行
if(first_edge_flag && (P33 == 0)) { // 确认当前为低电平
first_edge_flag = 0;
flag_p32_delay = 1;
timer_p32 = 0;
}
// 所有边沿触发
flag_p55_delay = 1;
timer_p55 = 0;
}
else //如果是上升沿,只执行P55模块。
{
flag_p55_delay = 1;
timer_p55 = 0;
}
}
如果是第二种的话。关于先从走下降沿好一些。如果是从上升沿的话。就无法实现或更麻烦些。。。但第一种只有触发,IE1就会被置高。。。感觉更好用。。。我是这么理解的。。
还请大神解惑。。。。
这个写明了硬件自动清零,就不要使用软件进行操作了
如果是没有打开中断的情况下,才可以通过判断标志位来实现操作IE1这个状态(查询方式)
所以你说的这个在中断里IE=0这条语句是不能使用的
如果想要判断上升沿还是下降沿,只需要进入中断后判断当前I/O口的电平即可
如果当前I/O的状态为高电平,则说明本次进入中断的是上升沿,以此类推
王昱顺 发表于 2025-6-1 16:11
这个写明了硬件自动清零,就不要使用软件进行操作了
如果是没有打开中断的情况下,才可以通过判断标志位 ...
多谢赐教。。。在数据表里看到了。。只是觉得理解上来说判断标志位更顺些。。。
页:
[1]