OpenEdv-开源电子网

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

原子哥delay函数和通用定时器冲突

[复制链接]

4

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-6-6
在线时间
17 小时
发表于 2017-5-6 12:30:50 | 显示全部楼层 |阅读模式
1金钱
今天用通用定时器写了个定时,定时时间为500ms,在溢出中断里加了一个gpio翻转,讲道理应该是输出方波的。但是,我在main函数里还加了一个原子哥写的delay函数,delay_ms(5000)。
奇怪的事情来了。
如果通用定时器溢出中断中只有gpio翻转,可以偶尔输出正常方波,但是正常的周期数不会超过5个。剩下的时间要么全高要么全低。
如果通用定时器溢出中断里加上别的东西,比如定义一个变量,则完全冲突,方波周期完全变成由delay函数控制,也就是说delay的过程中,定时器中断是等待的。

经过测试,TIM3可以和delay一起用,但是TIM4和TIM5都不行。TIM3和TIM4、TIM5的中断优先级都一样。
求问这是怎么一回事?

最佳答案

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

在定时器的中断里加了判断 if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET) 就可以正常工作了。 问题解决了,但是不知道这个判断和delay有什么关系。 不加这个判断,方波周期就是delay的时间*2。我感觉不是巧合,有大神能解一下惑吗
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-6-6
在线时间
17 小时
 楼主| 发表于 2017-5-6 12:30:51 | 显示全部楼层
在定时器的中断里加了判断
if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET)
就可以正常工作了。
问题解决了,但是不知道这个判断和delay有什么关系。
不加这个判断,方波周期就是delay的时间*2。我感觉不是巧合,有大神能解一下惑吗
回复

使用道具 举报

4

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-6-6
在线时间
17 小时
 楼主| 发表于 2017-5-6 14:00:58 | 显示全部楼层
自顶一下
回复

使用道具 举报

4

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-6-6
在线时间
17 小时
 楼主| 发表于 2017-5-6 14:12:06 | 显示全部楼层
另外,如果在定时器中断里加一个断点,然后按住f5一直执行,是可以输出正常的方波的。
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4036
金钱
4036
注册时间
2015-11-14
在线时间
545 小时
发表于 2017-5-6 14:15:26 | 显示全部楼层
把代码贴出来看看
回复

使用道具 举报

4

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-6-6
在线时间
17 小时
 楼主| 发表于 2017-5-6 14:25:33 | 显示全部楼层
本帖最后由 lkposible4 于 2017-5-6 14:27 编辑
Electronic 发表于 2017-5-6 14:15
把代码贴出来看看

定时器4中断程序
[mw_shl_code=c,true]void TIM4_IRQHandler(void){
        GPIOC_2=!GPIOC_2;
        TIM_ClearITPendingBit(TIM4,TIM_IT_Update);  
}[/mw_shl_code]
主函数
[mw_shl_code=c,true]int main(void){
Init();
TIM_Cmd(TIM4,ENABLE);
while(1){
delay_ms(5000);
}
}[/mw_shl_code]

定时器初始化:
[mw_shl_code=c,true]        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);  ///ê1ÄüTIM4ê±Öó
        
  TIM_TimeBaseInitStructure.TIM_Period = 5000-1;         //×Ô¶ˉÖØ×°ÔØÖμ
        TIM_TimeBaseInitStructure.TIM_Prescaler=8400-1;  //¶¨ê±Æ÷·ÖÆμ£¨òÑμ÷êÔ£¬¶¨ê±Æ÷ê±ÖóÎa84M£©//¶¨ê±Æ÷ê±Öó84M£¬·ÖÆμÏμêy8400£¬ËùòÔ84M/8400=10KhzμļÆêyÆμÂ꣬¼Æêy5000′ÎÎa0.5s     
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //ÏòéϼÆêyÄ£ê½
        TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
        
        TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);//3õê¼»ˉTIM4
        TIM_ClearITPendingBit(TIM4,TIM_IT_Update);//Çå3yÖD¶Ï±êÖ¾
        TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //ÔêDí¶¨ê±Æ÷4¸üDÂÖD¶Ï
        //TIM_Cmd(TIM4,ENABLE); //ê1Äü¶¨ê±Æ÷4
        
        NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn; //¶¨ê±Æ÷4ÖD¶Ï
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //ÇàÕ¼óÅÏè¼¶1
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //×óóÅÏè¼¶3
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);[/mw_shl_code]
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4036
金钱
4036
注册时间
2015-11-14
在线时间
545 小时
发表于 2017-5-6 14:27:29 | 显示全部楼层
delay_init();//需要添加这句,实在还不行,可以吧代码上传过来
回复

使用道具 举报

4

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-6-6
在线时间
17 小时
 楼主| 发表于 2017-5-6 14:29:10 | 显示全部楼层
Electronic 发表于 2017-5-6 14:27
delay_init();//需要添加这句,实在还不行,可以吧代码上传过来

delay_init(168);
写了的
回复

使用道具 举报

4

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-6-6
在线时间
17 小时
 楼主| 发表于 2017-5-6 15:20:48 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 04:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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