找回密码
 立即注册
查看: 152|回复: 3

关于8G1K08A的INT1外部双边沿中断的服务使用的想法,

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-06-13 10:07:51
已绑定手机

2

主题

3

回帖

62

积分

注册会员

积分
62
发表于 2025-6-1 13:40:31 | 显示全部楼层 |阅读模式
近期在使用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;
                }
}





回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-06-13 10:07:51
已绑定手机

2

主题

3

回帖

62

积分

注册会员

积分
62
发表于 2025-6-1 13:43:35 | 显示全部楼层
如果是第二种的话。关于先从走下降沿好一些。如果是从上升沿的话。就无法实现或更麻烦些。。。但第一种只有触发,IE1就会被置高。。。感觉更好用。。。我是这么理解的。。
还请大神解惑。。。。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:500
  • 最近打卡:2025-06-17 17:14:03
已绑定手机
已实名认证

112

主题

2394

回帖

6026

积分

版主

积分
6026
发表于 2025-6-1 16:11:31 | 显示全部楼层

截图202506011608321053.jpg

这个写明了硬件自动清零,就不要使用软件进行操作了
如果是没有打开中断的情况下,才可以通过判断标志位来实现操作IE1这个状态(查询方式)
所以你说的这个在中断里IE=0这条语句是不能使用的
如果想要判断上升沿还是下降沿,只需要进入中断后判断当前I/O口的电平即可
如果当前I/O的状态为高电平,则说明本次进入中断的是上升沿,以此类推
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-06-13 10:07:51
已绑定手机

2

主题

3

回帖

62

积分

注册会员

积分
62
发表于 2025-6-2 21:04:50 | 显示全部楼层
王*** 发表于 2025-6-1 16:11
这个写明了硬件自动清零,就不要使用软件进行操作了
如果是没有打开中断的情况下,才可以通过判断标志位 ...

多谢赐教。。。在数据表里看到了。。只是觉得理解上来说判断标志位更顺些。。。
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-17 23:30 , Processed in 0.120352 second(s), 68 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表