打印
[STM32F4]

一个菜鸟关于定时器中断的问题

[复制链接]
730|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
99——99|  楼主 | 2017-3-3 21:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定时器中断选择溢出中断,但是还没有溢出,就进入了中断服务函数。
所以我想问,溢出中断是先延时直到溢出,再进入中断服务函数,还是先进入中断服务函数,再进行延时直到溢出??????????????
沙发
99——99|  楼主 | 2017-3-3 21:44 | 只看该作者
void TIM5_Int_Init(u32 psc,u32 arr)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstruct;
        NVIC_InitTypeDef NVIC_Initstruct;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);                //使能TIM5时钟

        TIM_TimeBaseInitstruct.TIM_Prescaler=psc;                //时钟预分频
        TIM_TimeBaseInitstruct.TIM_Period=arr;                //设置自动重装载值
        TIM_TimeBaseInitstruct.TIM_CounterMode=TIM_CounterMode_Up;                //向上计数模式
        TIM_TimeBaseInitstruct.TIM_ClockDivision=TIM_CKD_DIV1;                //不太清除这个的作用
        TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitstruct);
        TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);                //定时器中断使能
       
        NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority=2;                //设置抢占优先级为2
        NVIC_Initstruct.NVIC_IRQChannelSubPriority=2;                //设置副优先级为2
        NVIC_Initstruct.NVIC_IRQChannel=TIM5_IRQn;                //TIM5中断通道
        NVIC_Initstruct.NVIC_IRQChannelCmd=ENABLE;                //TIM5中断通道使能
        NVIC_Init(&NVIC_Initstruct);
       
        TIM_Cmd(TIM5,ENABLE);                //TIM5时钟使能
}
这是我的定时器中断初始化的函数

使用特权

评论回复
板凳
99——99|  楼主 | 2017-3-3 21:45 | 只看该作者
void TIM5_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM5,TIM_IT_Update)==SET) //溢出中断
        {
                D2=!D2;
        }
        TIM_ClearITPendingBit(TIM5,TIM_IT_Update); //清除中断标志位
}

中断服务函数

使用特权

评论回复
地板
99——99|  楼主 | 2017-3-3 21:45 | 只看该作者
int main(void)
{
        delay_init(168);
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        GPIO_SetBits(GPIOA,GPIO_Pin_6 | GPIO_Pin_7);
        TIM3_Int_Init(8400,10000);
        while(1)
        {
               
        }
}
主函数

使用特权

评论回复
5
99——99|  楼主 | 2017-3-3 21:46 | 只看该作者
程序下进板子里,灯直接就会亮,而不是延时后才亮
为什么呢???

使用特权

评论回复
6
皈依| | 2017-3-4 08:38 | 只看该作者
IO初始化没有?
另外你这个判断进中断不能根据灯,要实际仿真打断点试一下

使用特权

评论回复
7
llh1979| | 2017-3-4 09:10 | 只看该作者
TIM_IT_Update 应该是更新中断吧,是和重载值比较的

使用特权

评论回复
8
99——99|  楼主 | 2017-3-4 10:06 | 只看该作者
皈依 发表于 2017-3-4 08:38
IO初始化没有?
另外你这个判断进中断不能根据灯,要实际仿真打断点试一下 ...

io已经初始化了,在初始化定时器中断之前就已经把灯的IO口的电平置1了

我也用了printf,在中断服务函数里打印东西,的确是一按复位键就打印出来东西了

使用特权

评论回复
9
99——99|  楼主 | 2017-3-4 10:08 | 只看该作者
llh1979 发表于 2017-3-4 09:10
TIM_IT_Update 应该是更新中断吧,是和重载值比较的

就是是CNT中的数值根据时钟的频率一直往上加,超过自动重装载值就会产生更新,进入中断。
但是我这里的现象是没等数据溢出就已经进入中断函数里了

使用特权

评论回复
10
犹豫的大三| | 2017-3-4 11:57 | 只看该作者
在开定时器之前,看中断标志有没有置1。如果置1了,清楚中断标志后再开定时器

使用特权

评论回复
11
xmshao| | 2017-3-6 16:00 | 只看该作者
你代码稍微调整下,按下面时序配置。

  TIM_Cmd(TIM5,ENABLE);                //TIM5时钟使能

  TIM_ClearITPendingBit(TIM5,TIM_IT_Update); //清除中断标志位

TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);                //定时器中断使能

使用特权

评论回复
12
99——99|  楼主 | 2017-3-6 19:22 | 只看该作者
xmshao 发表于 2017-3-6 16:00
你代码稍微调整下,按下面时序配置。

  TIM_Cmd(TIM5,ENABLE);                //TIM5时钟使能

可是我的这几句是分在不同的函数里的啊。。怎么调换呢,,,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

0

粉丝