初级会员
- 积分
- 186
- 金钱
- 186
- 注册时间
- 2015-1-22
- 在线时间
- 57 小时
|
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中断标志位
}
|
|