OpenEdv-开源电子网

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

stm32能否从通用定时器中断服务函数进入停止模式

[复制链接]

4

主题

23

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2015-8-28
在线时间
11 小时
发表于 2016-5-8 23:35:07 | 显示全部楼层 |阅读模式
1金钱
如题,希望能实现初始化后定时器开始计时,到达设定得值后触发中断,从中断函数中进入停止模式。就相当于手机的屏幕自动灭屏
void TIM3_IRQHandler(void)   //TIM3中断
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
                {
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  //清除TIMx的中断待处理位:TIM 中断源
                //PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
                }
}
但不注释掉上面的那行函数就会卡在定时器初始化函数里面出不来,注释掉后写上其他语句(比如LED取反)初始化,功能都正常,不知道是这样本来就不行还是我设置哪有问题。。。



最佳答案

查看完整内容[请看2#楼]

定时器中断在使能的一瞬间会自动进入一次?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-5-8 23:35:08 | 显示全部楼层
定时器中断在使能的一瞬间会自动进入一次?
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

4

主题

23

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2015-8-28
在线时间
11 小时
 楼主| 发表于 2016-5-8 23:40:24 | 显示全部楼层
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级0级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级3级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        LED0=!LED0;
        NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

用LED0测试就会卡在最后那个语句处
回复

使用道具 举报

4

主题

23

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2015-8-28
在线时间
11 小时
 楼主| 发表于 2016-5-9 01:19:01 来自手机 | 显示全部楼层
目前这个问题还没解决,不过我想到用另外一种方法替代,就是不用定时器中断,直接在主函数里检测更新标志位一旦set就进入停止模式
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2016-5-9 09:39:59 | 显示全部楼层
会不会频繁进入中断,你溢出一次设置的多久
我有故事,你有酒吗
回复

使用道具 举报

4

主题

23

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2015-8-28
在线时间
11 小时
 楼主| 发表于 2016-5-9 15:26:51 | 显示全部楼层
来俩不甜的 发表于 2016-5-9 09:39
会不会频繁进入中断,你溢出一次设置的多久

不会,我设置的时间是5s,足够观察了,关键是他根本就没完成初始化
回复

使用道具 举报

4

主题

23

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2015-8-28
在线时间
11 小时
 楼主| 发表于 2016-5-9 15:46:04 | 显示全部楼层
xkwy 发表于 2016-5-9 13:44
定时器中断在使能的一瞬间会自动进入一次?

好像是存在这个问题,,请问应该怎么解决呢?
回复

使用道具 举报

4

主题

23

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2015-8-28
在线时间
11 小时
 楼主| 发表于 2016-5-9 16:14:17 | 显示全部楼层
xkwy 发表于 2016-5-8 23:35
定时器中断在使能的一瞬间会自动进入一次?

刚测试了下 确实是这个原因,我在初始化的时候把TIM_IT_Update这个标志位清除一下,初始化就正常了,实验结果也符合,就是每隔5s没有按键按下就自动进入停止模式,但现在进入停止模式后我不能通过外部中断唤醒了,,中断优先级我设置的是外部中断大于定时器中断的,按理说就算停止时是在定时器中断中也能唤醒啊。。,
回复

使用道具 举报

4

主题

23

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2015-8-28
在线时间
11 小时
 楼主| 发表于 2016-5-9 16:42:52 | 显示全部楼层
xkwy 发表于 2016-5-8 23:35
定时器中断在使能的一瞬间会自动进入一次?

大神 貌似我现在遇到的问题就和这个帖子的一样 能劳驾看看嘛。。。http://www.openedv.com/posts/list/16111.htm
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-5-9 16:43:06 | 显示全部楼层
想个名字0 发表于 2016-5-9 15:46
好像是存在这个问题,,请问应该怎么解决呢?

我之前的回帖里解决过此问题,你翻翻,我懒得找了,

不过最简单的办法是设置个标志位,
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-5-9 16:47:24 | 显示全部楼层
想个名字0 发表于 2016-5-9 16:14
刚测试了下 确实是这个原因,我在初始化的时候把TIM_IT_Update这个标志位清除一下,初始化就正常了,实验 ...

停止模式下,只能使用外部中断或外部事件来唤醒,跟定时器无关,跟优先级也无关,
更多描述在手册第五章:Power Control
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

4

主题

23

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2015-8-28
在线时间
11 小时
 楼主| 发表于 2016-5-9 16:58:33 | 显示全部楼层
xkwy 发表于 2016-5-9 16:47
停止模式下,只能使用外部中断或外部事件来唤醒,跟定时器无关,跟优先级也无关,
更多描述在手册第五章 ...

恩,如果不使用定时器中断我配置的外部中断唤醒是可以正常唤醒的,我程序的整体是这样的:初始化时进入停止模式(此时程序还没运行到定时器初始化)等待按键唤醒,按下按键屏幕点亮成功唤醒,然后进行其他初始化,初始化完成后进入一个主循环,如果5s没有按键按下通过定时器中断进入停止模式,此时再按下按键就没反应了,刚试了下此时按下按键时没有进入外部中断函数(配置的优先级也是外部中断大于定时器中断)不知道为啥,。。求大神解释下
回复

使用道具 举报

4

主题

23

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2015-8-28
在线时间
11 小时
 楼主| 发表于 2016-5-9 17:37:03 | 显示全部楼层
xkwy 发表于 2016-5-9 16:47
停止模式下,只能使用外部中断或外部事件来唤醒,跟定时器无关,跟优先级也无关,
更多描述在手册第五章 ...

试了半天还是感觉应该是在定时器中断函数中进入停止模式有点问题,,是不是不能这么做?
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-5-9 17:44:41 | 显示全部楼层
想个名字0 发表于 2016-5-9 16:42
大神 貌似我现在遇到的问题就和这个帖子的一样 能劳驾看看嘛。。。http://www.openedv.com/posts/list/16 ...

优先级嵌套失败,肯定是中断优先级没有配置好造成,

我测试了一下,定时器中断和串口中断,嵌套没问题

code.png


xx.png


代码中23行将优先级分组,bit[7:6]为抢占式,bit[5:4]为响应式,

25,26行设置优先级分组,28-31行将优先级分组设置的结果读取出来,并解码打印,
可以看到实验结果,是没有问题的,
你要是想检查优先级分组有没有问题可以用这段代码测试一下,

然后u定时器中断里等待了将近2秒。在定时器等待时串口中断是可以响应的,
说明嵌套成功。

另外,在内核中有一个寄存器用于设置退出中断后再休眠(SLEEPONEXIT),在RM0008的5.3.3有介绍,

希望你看手册更加认真一些,还有ARM Cortex-M3的手册,都得看
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-9 08:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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