发新帖本帖赏金 2.00元(功能说明)我要提问
12下一页
返回列表
打印
[STM32F1]

关于stm32 f103 无法进去中断的问题,求大神

[复制链接]
6099|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
如标题所示,遇到奇葩的事情了,看了一晚上了,stm32的定时器就是没法进入中断,哪位大神能给看看啊,
如上图所示,写的中断服务函数入口和定时器配置,我试了tim8和tim2都是没法进入中断,nvic也是配置了如图,tim2和tim8我是单独用的,没有一起使用,就是我试了用tim8来操作,进不去中断,用了tim2来操作,进不去中断,但是两者输出pwm都非常好使,没有出问题



打赏榜单

21ic小管家 打赏了 2.00 元 2015-12-07

沙发
摩天轮1111|  楼主 | 2015-12-6 23:35 | 只看该作者
查了寄存器看,发现,配置了中断那句话之后,DIER寄存器的值没有被改变,好奇怪,这也解释了为什么我即使不写中断服务函数,还是能输出pwm,程序不死掉,原因是我虽然配置了中断,但是单片机中断根本没有开起来导致的,可问题是为什么单片机中断开不起来呢?

使用特权

评论回复
板凳
摩天轮1111|  楼主 | 2015-12-7 00:01 | 只看该作者
哎,找到原因了,这个细节还会带来这么大的影响,以前没有注意到,是关于nvic函数我没有加载导致的,虽然配置了nvic但是却没有加载,所以就错了,但是没有加载nvic直接导致的居然是中断开启不了,切记切记,

使用特权

评论回复
地板
摩天轮1111|  楼主 | 2015-12-7 00:13 | 只看该作者
总结一下就是,在对于外设的中断,不首先设置好中断优先级的话,对于中断的一切操作都会无效,估计是stm32的内部保护机制吧,同理可以联想到nvic函数的加载要放在tim配置加载之前,这点也要切记切记

使用特权

评论回复
5
diweo| | 2015-12-7 08:16 | 只看该作者
摩天轮1111 发表于 2015-12-7 00:13
总结一下就是,在对于外设的中断,不首先设置好中断优先级的话,对于中断的一切操作都会无效,估计是stm32 ...

不敢苟同

使用特权

评论回复
6
crystal1987| | 2015-12-7 09:24 | 只看该作者
本帖最后由 crystal1987 于 2015-12-7 09:25 编辑
摩天轮1111 发表于 2015-12-7 00:13
总结一下就是,在对于外设的中断,不首先设置好中断优先级的话,对于中断的一切操作都会无效,估计是stm32 ...

兄弟,你这总结好像有问题,你即使把中断的优先级配置错误(只是配置错误,没有说不配置啊),中断也可以跑起来的。还有就是那个联想,你可以自己做试验试试,联想的东西不能作为结论,否则很容易坑到人。

使用特权

评论回复
7
huaiqiao| | 2015-12-7 10:49 | 只看该作者
摩天轮1111 发表于 2015-12-7 00:13
总结一下就是,在对于外设的中断,不首先设置好中断优先级的话,对于中断的一切操作都会无效,估计是stm32 ...

你没有设置中断优先级分组吧

使用特权

评论回复
8
maiweiqi| | 2015-12-7 10:55 | 只看该作者
nvic设置在前在后没啥区别,有设置就行了

使用特权

评论回复
9
21ic小管家| | 2015-12-7 17:05 | 只看该作者
此打赏为十大热门打赏哦~

使用特权

评论回复
评论
hnrenyongqiang 2015-12-8 10:57 回复TA
我相信你是手滑了 
10
摩天轮1111|  楼主 | 2015-12-8 01:05 | 只看该作者
crystal1987 发表于 2015-12-7 09:24
兄弟,你这总结好像有问题,你即使把中断的优先级配置错误(只是配置错误,没有说不配置啊),中断也可以 ...

兄弟,不是我联想,您自己尝试下,在没有配置中断优先级的情况下,外设中断,中断你是开不了的明白吗,所以你加载nvic函数需要在开启中断函数之前加载,就如同你要开启gpio时钟你才能配置gpio寄存器道理一样,有些东西有先后顺序的,最近忙,没有来得及看论坛,

使用特权

评论回复
11
摩天轮1111|  楼主 | 2015-12-8 01:12 | 只看该作者

欢迎质疑,请举出反例,也请注意我这里说的是外设中断,要用nvic配置的中断,

使用特权

评论回复
12
摩天轮1111|  楼主 | 2015-12-8 01:17 | 只看该作者
crystal1987 发表于 2015-12-7 09:24
兄弟,你这总结好像有问题,你即使把中断的优先级配置错误(只是配置错误,没有说不配置啊),中断也可以 ...

此外,配置错误也是配置了,stm32之会管是否有配置,不会检查是否错误,在没有配置的情况下,即使强制写开中断的寄存器,也改变不了其值,这是我实验的结果,如果配置定时器函数在前,配置函数中有开中断,而此时优先级并没有设定,那么这个配置函数将无法开启中断,虽然你后面再设置了优先级,但是配置定时器函数已经配置过去了,就如要开时钟才能改寄存器值道理一样,先配置寄存器值,再开时钟,你去看看能不能成功,这特别的管中断的寄存器要先开配置优先级才能改变其值,好了就说这么多,小细节,忽略容易遇到意想不到的问题,或者不稳定的问题

使用特权

评论回复
13
diweo| | 2015-12-8 08:13 | 只看该作者
摩天轮1111 发表于 2015-12-8 01:12
欢迎质疑,请举出反例,也请注意我这里说的是外设中断,要用nvic配置的中断, ...

可能是我们对“优先级设置”的理解有差别。

根据我的经验:
优先级完全可以不设置,因为有默认的优先级设置,除非应用有特殊需求。要让中断工作只需使能即可。
就是说
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);      //可以省略
nvic_struct.NVIC_IRQChannel = USART2_IRQn;
nvic_struct.NVIC_IRQChannelPreemptionPriority = 0;  //可以省略
nvic_struct.NVIC_IRQChannelSubPriority =0;            //可以省略
nvic_struct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Config(&nvic_struct);

另外,外设的中断使能TIM_ITConfig(TimerName, TIM_IT, NewState);可以在NVIC_Config(&nvic_struct);前也可以在后(当然了,不要离得太远了)。我的理解是:当外设满足中断触发条件时,它会首先判断中断允许位是否已经置位,然后采取相应动作。而这个中断允许位只要时钟开了,就可以置位,不管NVIC中对应的设置是怎样的。

使用特权

评论回复
14
jjjkkk00| | 2015-12-8 08:14 | 只看该作者
/**
  * <b>NVIC中断控制器。</b>
  * <p>功能:中断优先级、使能。  
  * @param  NVIC_PriorityGroup  中断分组
  * @param  NVIC_IRQn           中断处理程序
  * @param  NVIC_Priority       中断优先级
  * [url=home.php?mod=space&uid=895143]@version[/url]            1.0.2014.0228
  * <p>移植!
  * [url=home.php?mod=space&uid=187600]@author[/url]             Dylan
  * [url=home.php?mod=space&uid=8537]@see[/url]                Javadoc注释/Eclipse编辑
  */
void NVIC_GroupSet(uint32_t NVIC_PriorityGroup, int16_t NVIC_IRQn, uint16_t NVIC_Priority)
{
#if  defined (STM32F100) || defined (STM32F101) || defined (STM32F103) || defined (STM32F10X_HD)
        assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));//检测分组有效性

        SCB->AIRCR = (uint32_t)0x05FA0000 | NVIC_PriorityGroup;//先键入钥匙(uint32_t)0x05FA0000,然后设置分组

        NVIC->ISER[((NVIC_IRQn)>>5)] = (1<<((NVIC_IRQn)&0x1F));//使能中断

        //每组只能存4个,得到组地址(NVIC_IRQn>>2)
        //在组内的偏移(NVIC_IRQn&0x3),得到偏移的确切位置*8+4
        if(NVIC_IRQn < 0) /* set Priority for Cortex-M3 System Interrupts */
        {
        SCB->SHP[((NVIC_IRQn)&0xF)-4] = ((NVIC_Priority<<4)&0xFF);
        }
        else//配置外设中断优先级,优先级高->低(0-0xFF)
        {
        NVIC->IP[(NVIC_IRQn)] = ((NVIC_Priority<<4)&0xFF);//设置响应优先级和抢断优先级,格式为0x?0(?=0~F)
        }
#else
        #warning "Make sure needn't define STM32F10X etc. ?"
#endif
}

使用特权

评论回复
15
jjjkkk00| | 2015-12-8 08:20 | 只看该作者
从上面贴的那个void NVIC_GroupSet(uint32_t NVIC_PriorityGroup, int16_t NVIC_IRQn, uint16_t NVIC_Priority)()函数来说,
中断优先级分组只是与寄存器 SCB->AIRCR相关,即时不配置,也会存在复位的初始值。
从函数中看到,最关键的是 Interrupt Number。

使用特权

评论回复
16
crystal1987| | 2015-12-8 08:48 | 只看该作者
摩天轮1111 发表于 2015-12-8 01:05
兄弟,不是我联想,您自己尝试下,在没有配置中断优先级的情况下,外设中断,中断你是开不了的明白吗,所 ...

兄弟,看清楚,我没有说不配,我是说优先级配置错误,程序也是可以运行的,我已经试过啦,所以提出疑问。

使用特权

评论回复
17
crystal1987| | 2015-12-8 08:53 | 只看该作者
摩天轮1111 发表于 2015-12-8 01:17
此外,配置错误也是配置了,stm32之会管是否有配置,不会检查是否错误,在没有配置的情况下,即使强制写 ...

“总结一下就是,在对于外设的中断,不首先设置好中断优先级的话,对于中断的一切操作都会无效,估计是stm32的内部保护机制吧,”
兄弟这是你的原话,我只是质疑这句话,没人说不配置。

使用特权

评论回复
18
摩天轮1111|  楼主 | 2015-12-8 09:09 | 只看该作者
本帖最后由 摩天轮1111 于 2015-12-8 09:10 编辑
crystal1987 发表于 2015-12-8 08:48
兄弟,看清楚,我没有说不配,我是说优先级配置错误,程序也是可以运行的,我已经试过啦,所以提出疑问。 ...

那你看清楚我说的话了吗,我说的是什么含义,呵呵,你是质疑我的结论?我的结论和你说的情况有什么关系,我说了不配置优先级无法开启中断,没说配置错了不可以开启中断,关键点在要配置

使用特权

评论回复
19
摩天轮1111|  楼主 | 2015-12-8 09:19 | 只看该作者
本帖最后由 摩天轮1111 于 2015-12-8 09:30 编辑
diweo 发表于 2015-12-8 08:13
可能是我们对“优先级设置”的理解有差别。

根据我的经验:

其实,你说的情况不还是没能脱开我总结的结论,为什么放在后面不能离开远了,因为触发中断的时候,你的优先级设置的函数已经跑过了,毕竟是几个指令的时间,所以中断能开,这也就是为什么很多人在使用tim中断的时候,出现乱进中断的原因,我的感官就是不稳定,如果我定时器中断很快就到来,ARR值很小,而此时中断优先级还没配置,就是你的那个ENABLE还没有,中断就进不去了,最保险的操作就是在开中断之前,已经把那些该设的都设置了,不过我的实验结论是,没有在配置好优先级的情况下,开中断的那个寄存器位没法设置的,改变不了其值,你运行了一句改其值的命令,但是命令走完,寄存器值没变,不知道是我的特例呢还是都是这样就是我那里ti config那一句函数,我直接改成timx->dier |= XXXX,结论是发现dier寄存器值没变(前提是如果我没有加载nvic配置函数的话)

使用特权

评论回复
20
diweo| | 2015-12-8 10:36 | 只看该作者
本帖最后由 diweo 于 2015-12-8 10:46 编辑
摩天轮1111 发表于 2015-12-8 09:19
其实,你说的情况不还是没能脱开我总结的结论,为什么放在后面不能离开远了,因为触发中断的时候,你的优 ...

我用开发板实际单步跑了一下。DIER寄存器可以变呀。
当然,你说的也有道理。保险起见,还是先把NVIC设置好了再使能外设中断。

捕获.JPG (508.46 KB )

捕获.JPG

使用特权

评论回复
发新帖 本帖赏金 2.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

224

帖子

15

粉丝