OpenEdv-开源电子网

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

求助,定时器中断实验的问题

[复制链接]

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-12-6
在线时间
0 小时
发表于 2014-2-25 21:37:51 | 显示全部楼层 |阅读模式
//========主函数================================
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单步调试时实现的正常功能。
新手好困惑啊。。。。




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

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-12-6
在线时间
0 小时
 楼主| 发表于 2014-2-25 21:45:23 | 显示全部楼层
我把定时时间调成3s,结果现象是LED1亮了3s然后熄灭了。而正常的现象应该是熄灭3秒后常亮吧...彻底懵了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-2-26 15:47:21 | 显示全部楼层
图3的时候,你点击那把X,把仿真停下来看看.看看程序死在哪里?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-12-6
在线时间
0 小时
 楼主| 发表于 2014-2-26 16:16:32 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥,我用软件仿真的逻辑仿真仪看了下。
初始化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的电平翻转呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-2-27 10:42:22 | 显示全部楼层
回复【4楼】beifengabc:
---------------------------------
肯定是哪里修改了IO状态,你单步跟踪,肯定不会出现突变才对的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-12-6
在线时间
0 小时
 楼主| 发表于 2014-3-2 10:09:29 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
我知道了,是库函数TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)中有一句TIMx->EGR = TIM_PSCReloadMode_Immediate;而让UG位置1了,所以产生一个更新时间,导致UIF位置1了,所以定时器还没使能,CPU就响应中断了,导致IO口电平翻转了一次。把这句注销刚开始IO口就不翻转了。实现正常功能。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-2 10:11:05 | 显示全部楼层
回复【6楼】beifengabc:
---------------------------------
谢谢分享。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-12-6
在线时间
0 小时
 楼主| 发表于 2014-3-2 17:00:32 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子哥,为什么我用软件仿真,完全正确,程序下到硬件上却不行。还有,用JTAG仿真,也得不行?为什么啊,就这个定时器让灯亮3秒,然后再中断里灯灭,关中断的东西。搞了一下午了..........软件怎么仿真都正确,一到硬件上就不行。崩溃了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-2 17:15:36 | 显示全部楼层
那你可以硬件仿真不?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-12-6
在线时间
0 小时
 楼主| 发表于 2014-3-2 17:27:46 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
Jlink仿真也和软件仿真结果不一样。
我发现问题是出现在TIMx->EGR = TIM_PSCReloadMode_Immediate;上。
这句如果注销了,软件仿真结果是正常的,但是硬件上电后,灯不是亮3秒,而是上来就是肉眼仔细瞅灯微闪了下,然后一直熄灭。
如果这句不注销,软件仿真结果是,最开始IO电平跳变,就是上面我说的,定时器还没开始就进入中断了。硬件结果是:小灯灭3秒,然后一直亮.....
JILINK仿真直接跑死...........
回复 支持 反对

使用道具 举报

15926218273 该用户已被删除
发表于 2017-2-25 11:00:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

15926218273 该用户已被删除
发表于 2017-2-25 11:27:19 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 21:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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