从0开始的STC 发表于 2024-8-6 13:54:42

STC8H3K32S2单片机P口中断触发问题

void Exti_config()
{
        P_SW2 |=0x80;        // 配置P4.6为外部中断下降沿触发
        P4M1 = 0x00;        // 设置P4M1寄存器,准双向口
        P4M0 = 0x00;        // 设置P4M0寄存器
       
        P4IM1 = 0x00;         //上升沿触发
        P4IM0 = 0x40;         //上升沿触发
       
       
        PINIPH = 0x40;
        PINIPL = 0x00;         //中断优先级配置HL:10优先级为2
       
        P4INTE = 0x40;         // 置位P4INTE寄存器的第6位,P4端口中断使能
        P4INTF = 0x40;         // 置位P4INTF寄存器的第6位,P4端口中断标志位

}

void        Timer2_config(void)
{
        TIM_InitTypeDef                TIM_InitStructure;                  //结构定义
        TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;//指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
        TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;         //指定时钟源,   TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
        TIM_InitStructure.TIM_ClkOut    = DISABLE;            //是否输出高速脉冲, ENABLE或DISABLE
        TIM_InitStructure.TIM_Value   = 65536UL- (MAIN_Fosc / 2500UL);        //65536UL - (MAIN_Fosc / 1005UL);   //初值,
        TIM_InitStructure.TIM_Run       = DISABLE;               //是否初始化后启动定时器, ENABLE或DISABLE
        Timer_Inilize(Timer2,&TIM_InitStructure);               //初始化Timer0          Timer0,Timer1,Timer2,Timer3,Timer4
        NVIC_Timer2_Init(ENABLE,Priority_3);    //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
}


void Timer2_ISR_Handler (void) interrupt TMR2_VECTOR                //进中断时已经清除标志
{
        de = P46;        //读取P46电平状态
        bit_data <<= 1;
        bit_data |= de;        //存到bit_data里
        bit_index++;                                        //移位
        P32 = 1;
        if(bit_index == 3)
        {        //接收正常
                if(bit_data == 0x0e)           //是否符合1110,对应1
                {       
                        byte_data <<= 1;
                        byte_data |= 0x01;
                        byte_index++;
                       
                        bit_data = 0x01;
                        bit_index = 0;        //重置
                }
                else if(bit_data == 0x08)//是否符合1000,对应0
                {
                        byte_data <<= 1;
                        byte_data |= 0x00;
                        byte_index++;
                       
                        bit_data = 0x01;
                        bit_index = 0;        //重置
                }
                else
                {        //接收不正常,舍弃这一组data
                        err_flag = 1;
                        bit_data = 0x01;
                        bit_index = 0;
                       
                        byte_data = 0x00;
                        byte_index = 0;
                       
                        OOK_Rev_Buffer = OOK_Rev_Buffer = OOK_Rev_Buffer = 0x00;
                        buf_index = 0;
                       
                        Timer2_Stop();
                }
       
                if(byte_index == 8 )                        //一字节码接收完毕********************
                {       
                        OOK_Rev_Buffer = byte_data;
                        buf_index++;
                       
                        byte_data = 0x00;
                        byte_index = 0;       
                        test_flag = 0xff;
//                                test_flag1 = 0xee;
                }
                Timer2_Stop();
        }
        else
        {
                P32 =0;
        }
}



void P4_ISR (void) interrupt 13                //进中断时已经清除标志
{       
        Timer2_Run(1);        //开启定时器
        test_flag = 0xff;
        P4INTF = 0x00;        //软件清除中断标志位       
}

求助,上电后一段时间就触发不了P4口外部中断的原因
       

_奶咖君_ 发表于 2024-8-6 15:05:40

先关注一下你芯片的版本,,B版似乎没有IO中断功能

从0开始的STC 发表于 2024-8-6 17:07:29

_奶咖君_ 发表于 2024-8-6 15:05
先关注一下你芯片的版本,,B版似乎没有IO中断功能

1

_奶咖君_ 发表于 2024-8-6 17:17:37

从0开始的STC 发表于 2024-8-6 17:07
1

得看你芯片上最后一行的最后一个字母,,,,
不过看你之前的帖子,,似乎用起来是存在的,,,反正最好看看吧,,别让大家分析一通,最后是硬件没有这个东西就尴尬了

从0开始的STC 发表于 2024-8-6 17:33:16

上电之后有一段时间可以触发,但是过一段时间之后就触发不了了,不知道死在哪里了

soma 发表于 2024-8-6 17:41:52

从0开始的STC 发表于 2024-8-6 17:33
上电之后有一段时间可以触发,但是过一段时间之后就触发不了了,不知道死在哪里了 ...

可以使用uart定时发送触发数据。

从0开始的STC 发表于 2024-8-7 08:50:45

最后一行最后一个字母是B,但确实是触发外部中断了
上面波形是P46的,上升沿触发外部中断,开定时器,
下面波形是P32的,定时器里给P32强制拉高拉低

从0开始的STC 发表于 2024-8-7 08:50:46

最后一行最后一个字母是B,但确实是触发外部中断了
上面波形是P46的,上升沿触发外部中断,开定时器,
下面波形是P32的,定时器里给P32强制拉高拉低

从0开始的STC 发表于 2024-8-7 10:43:42

有时候引脚电平没变化,但是外部中断触发了,P32也走了一个时序
引脚电平连续变化,需要连续触发外部中断的时候,P32反而拉不低了
找不到原因

电子DIY小家 发表于 2024-8-7 13:24:45

从0开始的STC 发表于 2024-8-7 10:43
有时候引脚电平没变化,但是外部中断触发了,P32也走了一个时序
引脚电平连续变化,需要连续触发外部中断的 ...

1.引脚电平没变化,但是外部中断触发了,P32也走了一个时序
---P46端口尝试改成高阻输入+上拉,程序里检测到中断直接取反一个IO试一下,看看是不是有错误进入中断的问题。

2.引脚电平连续变化,需要连续触发外部中断的时候,P32反而拉不低了
---感觉像是定时器处理那部分没写好,连续触发拉不低的话先用IO反馈看下中段是否能正常进入,
页: [1] 2
查看完整版本: STC8H3K32S2单片机P口中断触发问题