打印
[STM32F1]

定时器TIM4 进不了中断

[复制链接]
3050|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linpeng1200|  楼主 | 2016-10-10 10:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大神帮帮忙,定时器TIM4 进不了中断。还有哪儿配置错了,或者忘记配置的
void TIM4_Init(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, ENABLE);//36MHZ
       
        TIM_TimeBaseStructure.TIM_Period = (10000-1);
        TIM_TimeBaseStructure.TIM_Prescaler =(3599);        
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

        TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
        //TIM_SetCounter(TIM4,0);
        TIM_Cmd(TIM4, ENABLE);
       
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x00);
        NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;       
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);        
        TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
}

void TIM4_IRQHandler(void)
{  
        TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
        if(TIM_GetITStatus(TIM4, TIM_IT_Update) == SET)  
        {  
                led2_flash ^= LED2FLAH;
                GPIOC->BSRR = led2_flash;
        }   
}
沙发
mmuuss586| | 2016-10-10 11:54 | 只看该作者
定时器的初值赋值一个看看;
另外分频系数设低点,看能否进入中断;

另外定时器中断模式是啥?

使用特权

评论回复
板凳
wahahaheihei| | 2016-10-10 11:58 | 只看该作者
//通用定时器 3 中断初始化
//这里时钟选择为 APB1 的 2 倍,而 APB1 为 36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器 3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //①时钟 TIM3 使能
//定时器 TIM3 初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割
199
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);  //②初始化 TIM3
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );  //③允许更新中断
//中断优先级 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);  //⑤使能 TIM3
}
//定时器 3 中断服务程序⑥
void TIM3_IRQHandler(void) //TIM3 中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查 TIM3 更新中断发生与否
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除 TIM3 更新中断标志
LED1=!LED1;
}
}
————————————————————————————
我这有个3的例子,直接改成4就能用吧。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
linpeng1200 + 1 很给力!
地板
wahahaheihei| | 2016-10-10 12:02 | 只看该作者
不知道4和3有什么硬件方面的区别没。

使用特权

评论回复
5
linpeng1200|  楼主 | 2016-10-10 16:00 | 只看该作者
mmuuss586 发表于 2016-10-10 11:54
定时器的初值赋值一个看看;
另外分频系数设低点,看能否进入中断;

不是这些导致的问题,问题找到了 ,我是粗心了时钟没开。

使用特权

评论回复
6
linpeng1200|  楼主 | 2016-10-10 16:03 | 只看该作者
wahahaheihei 发表于 2016-10-10 11:58
//通用定时器 3 中断初始化
//这里时钟选择为 APB1 的 2 倍,而 APB1 为 36M
//arr:自动重装值。

谢谢,已经解决,你的直接能进中断 ,通过你的函数,我找到错误了。是我的狗眼已瞎,看错了,导致我的时钟没开。RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);         RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, ENABLE)。

使用特权

评论回复
7
wahahaheihei| | 2016-10-10 16:13 | 只看该作者
linpeng1200 发表于 2016-10-10 16:03
谢谢,已经解决,你的直接能进中断 ,通过你的函数,我找到错误了。是我的狗眼已瞎,看错了,导致我的时 ...

不要自责,竟然忘了一个环节这种错误也是很常见的。在写出来的代码中实在找不到错误了就该考虑这个问题了。

使用特权

评论回复
8
cowboy2014| | 2016-10-10 21:31 | 只看该作者
先看看如果不用中断,能不能正常使用定时器

使用特权

评论回复
9
Stannis| | 2016-10-13 18:57 | 只看该作者
定时器中断模式是什么,中断条件是什么

使用特权

评论回复
10
huangcunxiake| | 2016-10-13 22:13 | 只看该作者
收藏一下那个例程,估计什么时候就用到了。

使用特权

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

本版积分规则

1

主题

6

帖子

1

粉丝