OpenEdv-开源电子网

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

使用定时器延时一段程序的执行产生问题,特来求助!

[复制链接]

7

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-3-4
在线时间
0 小时
发表于 2013-8-4 15:13:23 | 显示全部楼层 |阅读模式
做法是这样的:用定时器2,定时1s,上电后延时1s然后点灯。为什么这样无法实现呢?每次总是上电后灯就被点亮了,因为放在while循环里,间隔一秒一亮一灭是没有错的,但是为何一上电灯就亮了?现贴出部分代码:

//定时器3中断服务程序
u8  T2_Flag=0;  
void TIM2_IRQHandler(void)
{          
if(TIM2->SR&0X0001)//溢出中断
{
LED1=!LED1;
T2_Flag = 1;              
}   
TIM2->SR&=~(1<<0);//清除中断标志位
TIM2->CR1&=0x00;    
}

void Timer2_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<0;//TIM3时钟使能    
  TIM2->ARR=arr;  //设定计数器自动重装值//刚好1ms    
TIM2->SC=psc;  //预分频器7200,得到10Khz的计数时钟
TIM2->DIER|=1<<0;   //允许更新中断
// TIM3->DIER|=1<<6;   //允许触发中断 
TIM2->CR1&=0x00;    //禁止定时器2
  MY_NVIC_Init(1,3,TIM2_IRQChannel,2);//抢占1,子优先级3,组2  
}

//主程序
extern u8 T2_Flag;
int main(void)
{
        Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,115200);
LED_Init();
        LED0 = 1; //灭灯
LED1 = 1; //灭灯
Timer2_Init(9999,7199); //10Khz的计数频率,计数1s  
    while(1)
{
TIM2->CR1 |= 0X01;
while(0 == T2_Flag);
T2_Flag = 0;
LED0=!LED0;
delay_ms(200);   
}
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-4 15:29:59 | 显示全部楼层
回复【楼主位】绘梦之卷:
---------------------------------
定时器初始化完成后,第一次开启就会进入一次中断.
是不是这个引起的?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-3-4
在线时间
0 小时
 楼主| 发表于 2013-8-4 15:44:46 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢原子哥!根据原子哥说的原因,已经解决了。
使用了一个变量记录第几次进入中断。
请问原子哥,后边还要用到输入捕获,第一次使能输入捕获是不是也会产生一个中断?
回复 支持 反对

使用道具 举报

7

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-3-4
在线时间
0 小时
 楼主| 发表于 2013-8-4 17:35:21 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,现在还有一个问题:
定时器作延时使用,也就是说需要延时的时候打开定时器,计数溢出中断到来时就关闭计时器。
现在有很多任务在while循环中,只有“任务1”用到延时,例如:
while(1)
{
     任务1();
     开定时器;
     while(等待定时溢出);//定时中断中关定时器
     任务2();
     任务3();
     ……
}
第一次进定时器中断还好,等while(1)循环一遍再次到任务1的时候定时器就不准了,为什么啊?难道是每次关闭定时器再开启都会立即产生一次中断?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-4 18:23:54 | 显示全部楼层
回复【3楼】绘梦之卷:
---------------------------------
第一次使能定时器都会进入中断的...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-3-4
在线时间
0 小时
 楼主| 发表于 2013-8-4 19:09:55 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
谢谢原子哥,我知道要做相应处理了。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-15 16:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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