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口外部中断的原因
先关注一下你芯片的版本,,B版似乎没有IO中断功能 _奶咖君_ 发表于 2024-8-6 15:05
先关注一下你芯片的版本,,B版似乎没有IO中断功能
1
从0开始的STC 发表于 2024-8-6 17:07
1
得看你芯片上最后一行的最后一个字母,,,,
不过看你之前的帖子,,似乎用起来是存在的,,,反正最好看看吧,,别让大家分析一通,最后是硬件没有这个东西就尴尬了 上电之后有一段时间可以触发,但是过一段时间之后就触发不了了,不知道死在哪里了 从0开始的STC 发表于 2024-8-6 17:33
上电之后有一段时间可以触发,但是过一段时间之后就触发不了了,不知道死在哪里了 ...
可以使用uart定时发送触发数据。 最后一行最后一个字母是B,但确实是触发外部中断了
上面波形是P46的,上升沿触发外部中断,开定时器,
下面波形是P32的,定时器里给P32强制拉高拉低 最后一行最后一个字母是B,但确实是触发外部中断了
上面波形是P46的,上升沿触发外部中断,开定时器,
下面波形是P32的,定时器里给P32强制拉高拉低 有时候引脚电平没变化,但是外部中断触发了,P32也走了一个时序
引脚电平连续变化,需要连续触发外部中断的时候,P32反而拉不低了
找不到原因 从0开始的STC 发表于 2024-8-7 10:43
有时候引脚电平没变化,但是外部中断触发了,P32也走了一个时序
引脚电平连续变化,需要连续触发外部中断的 ...
1.引脚电平没变化,但是外部中断触发了,P32也走了一个时序
---P46端口尝试改成高阻输入+上拉,程序里检测到中断直接取反一个IO试一下,看看是不是有错误进入中断的问题。
2.引脚电平连续变化,需要连续触发外部中断的时候,P32反而拉不低了
---感觉像是定时器处理那部分没写好,连续触发拉不低的话先用IO反馈看下中段是否能正常进入,
页:
[1]
2