OpenEdv-开源电子网

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

关于【定时器使能】和【中断优先级配置】的顺序问题

[复制链接]

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2016-8-26
在线时间
13 小时
发表于 2016-8-26 13:21:34 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 xiaofang 于 2016-8-26 13:32 编辑

探索者F4开发板。
输入捕获实验,寄存器版。
实验要将定时器5设置为输入捕获模式,在初始化定时器5的时候,程序的最后两步是
使能定时器(TIM5->CR1|=0x01)和配置定时器的中断优先级(MY_NVIC_Init(2,0,TIM5_IRQn,2))。
经过多次实验发现:
1.如果在使能定时器之前先配置优先级,那么SR寄存器显示能捕获到外部的上升沿,
但是定时器从始至终不计数,CNT寄存器一直都是0x0.
2.如果在使能定时器之后再配置优先级,定时器就能完全正常工作。

那么,我想问一下:
1.定时器的使能和优先级配置有确定的先后关系吗?
2.究竟是什么原因造成了这种现象?
3.按照正常思维,应该是先完成对定时器的所有有关配置(包括配置优先级),最后使能定时器才对啊?

如图:第19和20行(图示的情况下是不能正常工作的)。
QQ截图20160826132809.png

最佳答案

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

你这寄存器版本写的很原子,不是个好习惯,有些地方还有严重问题(&=0PSC = 84 - 1; TIM5->ARR = TIM_ARR_ARR; TIM5->CCMR1 |= TIM_CCMR1_CC1S_0; TIM5->CCER &= ~TIM_CCER_CC1P; TIM5->CCER |= TIM_CCER_CC1E; TIM5->EGR |= TIM_EGR_UG; TIM5->DIER |= (TIM_DIER_CC1IE|TIM_DIER_UIE); NVIC_EnableIRQ(TIM5_IRQn); TIM5->CR1 |= TIM_CR1_CEN;[/mw_shl_code] 我个人习惯定时器模块全部 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-8-26 13:21:35 | 显示全部楼层
你这寄存器版本写的很原子,不是个好习惯,有些地方还有严重问题(&=0<<1是什么意思?)
给你个参考:

[mw_shl_code=c,true]
    RCC->APB1ENR |= RCC_APB1ENR_TIM5EN;
    TIM5->PSC = 84 - 1;
    TIM5->ARR = TIM_ARR_ARR;
    TIM5->CCMR1 |= TIM_CCMR1_CC1S_0;
    TIM5->CCER &= ~TIM_CCER_CC1P;
    TIM5->CCER |= TIM_CCER_CC1E;
    TIM5->EGR |= TIM_EGR_UG;
    TIM5->DIER |= (TIM_DIER_CC1IE|TIM_DIER_UIE);
    NVIC_EnableIRQ(TIM5_IRQn);
    TIM5->CR1 |= TIM_CR1_CEN;[/mw_shl_code]

我个人习惯定时器模块全部初始化完了,再打开中断。
不过这两行代码谁先谁后肯定没什么影响的,
我不知道你的中断里都干了些什么,你程序上应该是有问题的,
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2016-8-26
在线时间
13 小时
 楼主| 发表于 2016-8-26 16:00:56 | 显示全部楼层
xkwy 发表于 2016-8-26 15:03
你这寄存器版本写的很原子,不是个好习惯,有些地方还有严重问题(&=0PSC = 84 - 1;
    TIM5->ARR = TIM_ ...

能具体说说“很原子”是指啥吗?
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-8-27 07:04:07 | 显示全部楼层
xiaofang 发表于 2016-8-26 16:00
能具体说说“很原子”是指啥吗?

reg |= (0<<x);      这行代码没任何意义
reg &= (0<<x);    这样写是会出严重问题的

以及从来都是手动计算左移位数,这样的代码既不可读又容易计算错误。

其他一些等等吧,

这只是个人意见,每个人都有他的代码特色,勿怪。
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 06:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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