打印
[其他ST产品]

STM32M103

[复制链接]
1547|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
FightingBoy|  楼主 | 2016-12-2 21:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我32新手,定时器中断基本配置都配置过了,为什么没有进入中断啊。灯都没亮过.
void Tim3_Init(void)
{       
        TIM_TimeBaseInitTypeDef Tim_InitStruct;
        NVIC_InitTypeDef NVIC_InitStruct;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
       
        NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStruct.NVIC_IRQChannelCmd =ENABLE;
        NVIC_Init(&NVIC_InitStruct);

        Tim_InitStruct.TIM_ClockDivision = 0;
        Tim_InitStruct.TIM_CounterMode = TIM_CounterMode_Down; //想上计数
        Tim_InitStruct.TIM_Prescaler = 7200-1;  //预分频
        Tim_InitStruct.TIM_Period = 10000;        //重装载寄存器的值
        TIM_TimeBaseInit(TIM3,&Tim_InitStruct);
       
        printf("Counter = %d  Prescaler = %d\n",TIM_GetCounter(TIM3),TIM_GetPrescaler(TIM3));
       
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);  //设置定时器更新时间为中断源
        TIM_Cmd(TIM3,ENABLE);
}

void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3,TIM_IT_Update))
        {
                TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
                LED1(1);  //点亮LED灯
                DelayMs(1000);
                LED1(0);  //熄灯
        }
}

沙发
湛只为无双| | 2016-12-2 21:22 | 只看该作者
TIM_CounterMode_Up

使用特权

评论回复
板凳
mintspring| | 2016-12-2 21:24 | 只看该作者
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
//STM32开发板实验8
//定时器中断实验  
       
int main(void)
{               

        delay_init();                     //延时函数初始化          
        NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
//        uart_init(9600);         //串口初始化为9600
        LED_Init();                             //LED端口初始化
        TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms  
           while(1)
        {
                LED0=!LED0;
                delay_ms(200);                  
        }         
}         

重点分析:        TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms  

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更新中断发生与否
                {
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志
                LED1=!LED1;
                }
}

使用特权

评论回复
地板
mintspring| | 2016-12-2 21:26 | 只看该作者
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

使用特权

评论回复
5
FightingBoy|  楼主 | 2016-12-2 21:33 | 只看该作者

向上向下计数我都试过了,我还试了读预分频的值,预分频计数器也都在递增或者递减的计数。计数器都已经在计数,说明定时器都正常工作。就是最后没进入中断点亮灯。LED灯的函数也肯定对,我也都测试过了。

使用特权

评论回复
6
FightingBoy|  楼主 | 2016-12-2 21:58 | 只看该作者
mintspring 发表于 2016-12-2 21:24
#include "led.h"
#include "delay.h"
#include "key.h"

对比着你的我该有的都有啊,就是没进中断。
中断优先级分组,LED初始化我都在主函数里初始化过了,中断该使能的我也都使能了。
计数模式我也改成向上计数模式,但还是没反应。看了两天了,就是没看出问题出在哪
对了,系统滴答不是用到延时直接调用对应的函数就行。我从来没有初始化系统滴答。
定时器的预分频和重装载也都懂,就是想配置成1秒计时时间,都不错啊。

使用特权

评论回复
7
yklstudent| | 2016-12-2 22:20 | 只看该作者
TIM的时钟开启了吗?

使用特权

评论回复
8
FightingBoy|  楼主 | 2016-12-2 23:09 | 只看该作者
yklstudent 发表于 2016-12-2 22:20
TIM的时钟开启了吗?

AHB的时钟开了,外设APB1也开了。时钟是没问题的,读预分频计数器的值都是在不停的变化的.说明时钟是肯定没问题。

使用特权

评论回复
9
FightingBoy|  楼主 | 2016-12-2 23:12 | 只看该作者
问题已经解决了,请问怎么结贴啊?

使用特权

评论回复
10
mintspring| | 2016-12-2 23:54 | 只看该作者
最后你发现了什么问题啊。

使用特权

评论回复
11
皈依| | 2016-12-3 08:48 | 只看该作者
我猜测是不是没做初始化

使用特权

评论回复
12
FightingBoy|  楼主 | 2016-12-3 09:59 | 只看该作者
mintspring 发表于 2016-12-2 23:54
最后你发现了什么问题啊。

主函数里面没有加while循环,程序跑飞了...
这里的配置都对。没问题,加个while直接就好了

使用特权

评论回复
13
yu515301489| | 2016-12-3 11:39 | 只看该作者
FightingBoy 发表于 2016-12-3 09:59
主函数里面没有加while循环,程序跑飞了...
这里的配置都对。没问题,加个while直接就好了 ...

使用特权

评论回复
14
mintspring| | 2016-12-3 12:23 | 只看该作者
FightingBoy 发表于 2016-12-3 09:59
主函数里面没有加while循环,程序跑飞了...
这里的配置都对。没问题,加个while直接就好了 ...

人才,哈哈,你下次贴完整的代码大家就可以一眼看出来了。

使用特权

评论回复
15
FightingBoy|  楼主 | 2016-12-3 21:31 | 只看该作者
mintspring 发表于 2016-12-3 12:23
人才,哈哈,你下次贴完整的代码大家就可以一眼看出来了。

嘿嘿,我也怕贴的太多了你们看着也头疼,所有就只贴了自认为关键的一点。还是自己技术太渣了
不过还是要感谢大家的指教啊0.0

使用特权

评论回复
16
mintspring| | 2016-12-4 10:43 | 只看该作者
楼主加油。

使用特权

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

本版积分规则

6

主题

18

帖子

1

粉丝