OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5332|回复: 1

为什么外部中断事件会影响ucosii的软件定时器

[复制链接]

20

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2015-1-22
在线时间
57 小时
发表于 2021-10-22 16:05:53 | 显示全部楼层 |阅读模式
20金钱
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中断标志位
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

889

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1468
金钱
1468
注册时间
2020-8-19
在线时间
333 小时
发表于 2021-10-22 17:08:58 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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