OpenEdv-开源电子网

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

实验8 定时器中断实验 为什么初始化定时器后会直接跑进定时器中断里?时间还没到?

[复制链接]

16

主题

89

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
316
金钱
316
注册时间
2012-10-6
在线时间
9 小时
发表于 2018-2-5 16:20:02 | 显示全部楼层 |阅读模式
5金钱
大家好请教一个问题:
D:\BaiduYunDownload\战舰V3 资料盘(A盘)\战舰V3 资料盘(A盘)\4,程序源码\2,标准例程-库函数版本\2,标准例程-库函数版本\实验8 定时器中断实验实验8 定时器中断实验  为什么初始化定时器后会直接跑进定时器中断里?时间还没到?
没有改原子哥的代码;

通过抓波形可以看得出  初始化完TIM3_Int_Init  它先去执行中断里的LED1=!LED1;  才到        LED0=!LED0;


        LED_Init();                             //LED端口初始化
        TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms  
           while(1)
        {
                LED0=!LED0;
                //delay_ms(200);                  
        }                 
===================
void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
       
        //定时器TIM3初始化
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值       
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
        //中断优先级NVIC设置
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
        TIM_Cmd(TIM3, ENABLE);  //使能TIMx                                         
}
//定时器3中断服务程序
void TIM3_IRQHandler(void)   //TIM3中断
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
                {
                        LED1=!LED1;
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志
       
        //        LED1=!LED1;
                }
}
============================




最佳答案

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

这个问题,我记得原子哥发帖子解决过这个问题。 http://www.openedv.com/forum.php?mod=viewthread&tid=97072
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

206

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-4-6
在线时间
234 小时
发表于 2018-2-5 16:20:03 | 显示全部楼层
回复

使用道具 举报

0

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
319
金钱
319
注册时间
2017-6-19
在线时间
64 小时
发表于 2018-2-7 15:10:39 | 显示全部楼层
在使能定时器更新中断前清一下中断标志位就行了,stm32的定时器就是这样。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-21 05:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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