//========主函数================================
int main(void)
{
delay_init();
//延时函数初始化
NVIC_Configuration();
//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600);
//串口初始化为9600
LED_Init();
//LED端口初始化
TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms
while(1)
{
}
}
//=============中断函数========================
//定时器3中断服务程序
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
LED1=!LED1;
}
TIM_Cmd(TIM3, DISABLE); //关闭定时器
}
如上,正常实现的功能应该是:初始化时,LED1灭,定时器定时500ms,在中断函数中LED1状态反转为亮,然后定时器关闭,LED1一直处于亮的状态中。
而现实的现象却是:上电后,LED1亮了下,然后就熄灭了,一直处于灭的状态。
我用单步调试了下,如图1,初始化时,PE5(LED1)是高电平。
接着到图2中,用step into,一直下去,就到了图3的while(1),然后调试就跑死了,没反应了。这期间PE5一直是高电平。
而如果运行在图2的时候,用step over跳过使能TIM3库函数,就跳到图4的关闭定时器函数处了,此时PE5为低电平,LED1一直亮下去。
所以我的疑问是,用图4的方法单步调试,LED1实现了应该正常的实验现象。
而用图3的方法调试,程序怎么跑飞了?
如果不单步调试,上电后的现象是LED1亮一下,然后一直熄灭,达不到图4单步调试时实现的正常功能。
新手好困惑啊。。。。
---------------------------------
原子哥,我用软件仿真的逻辑仿真仪看了下。
初始化LED时,PE5接的LED1是高电平。然后
TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms
在这个定时器初始化函数中,执行到NVIC_Init(&NVIC_InitStructure);时,PE5的电平被翻转了,变成了低电平。
然后定时器定时500ms,在中断函数里执行LED1=!LED1,电平又重新翻转成了高电平。接着关闭定时器。所以造成了实现现象是LED1亮500ms,然后熄灭。
而正常理解应该是初始化时,LED1灭,中断函数中LED翻转亮,接着定时器关闭,一直亮下去。
我现在不理解,为什么在NVIC_Init(&NVIC_InitStructure);时,造成了PE5的电平翻转呢?
---------------------------------
我知道了,是库函数TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)中有一句TIMx->EGR = TIM_PSCReloadMode_Immediate;而让UG位置1了,所以产生一个更新时间,导致UIF位置1了,所以定时器还没使能,CPU就响应中断了,导致IO口电平翻转了一次。把这句注销刚开始IO口就不翻转了。实现正常功能。
---------------------------------
谢谢分享。
一周热门 更多>