OpenEdv-开源电子网

标题: 为什么外部中断事件会影响ucosii的软件定时器 [打印本页]

作者: leozzd    时间: 2021-10-22 16:05
标题: 为什么外部中断事件会影响ucosii的软件定时器
PB4上拉输入的下降沿外部中断触发后,其他任务也能工作,但软件定时器一直在疯狂执行(时基不准了?),原1S进入软件定时器的回调函数执行led翻转和累计10秒串口输出,现在62ms就执行led翻转,打印输出的条件一下就累计溢出成立,OS_TICKS_PER_SEC和OS_TMR_CFG_TICKS_PER_SEC都是200u,OS_TASK_TMR_PRIO设置最高级0。改成普通定时器作为1S参数中断就不会受外部中断影响。请教各路大神,这是什么原因。

sys_tmr=OSTmrCreate(0,200,OS_TMR_OPT_PERIODIC,(OS_TMR_CALLBACK)SysTmr_callback,0,"sys_tmr",&err);OSTmrStart(sys_tmr, &err);                        //启动软件定时器
//软件定时器的回调函数
void SysTmr_callback(OS_TMR *ptmr,void *p_arg)
{
        static u8 i = 0,m = 0;
        m = !m;
        Led_Disp( Run, !m);     //LED翻转,外部触发后Led翻转变为62ms左右
        if(i >= 10)                         //外部中断触发后,软件定时器跑得更快,原10S一次的if一下子就执行。
        {
                i = 0;
                u2_printf("System running…\r\n");
                IWDG_Feed();
        }
        i++;       
}

//GPIO初始化
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0 | GPIO_Pin_1 |  GPIO_Pin_12 | GPIO_Pin_15;                //PA0\PA1\PA2\PA3\PA12\PA15   
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         //设置成上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);                                        //初始化GPIOA

//GPIOB.4 中断线以及中断初始化配置
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource4);
EXTI_InitStructure.EXTI_Line=EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

//中断表
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;                        //使能外部IO所在的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;    //抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;                //子优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //使能外部中断通道
NVIC_Init(&NVIC_InitStructure);                                                   //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器       

//中断线
void EXTI4_IRQHandler(void)
{
  delay_ms(10);    //消抖
  if(IN4 == 0)
{          
        u2_printf("IN4  远方摇入触发\r\n");
}
EXTI_ClearITPendingBit(EXTI_Line4);  //清除EXTI0中断标志位
}


作者: bin133    时间: 2021-10-22 17:08
帮顶  




欢迎光临 OpenEdv-开源电子网 (http://47.111.11.73/) Powered by Discuz! X3.4