[其他ST产品] STM32M103

[复制链接]
1787|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向上计数模式
 楼主| FightingBoy 发表于 2016-12-2 21:33 | 显示全部楼层

向上向下计数我都试过了,我还试了读预分频的值,预分频计数器也都在递增或者递减的计数。计数器都已经在计数,说明定时器都正常工作。就是最后没进入中断点亮灯。LED灯的函数也肯定对,我也都测试过了。
 楼主| FightingBoy 发表于 2016-12-2 21:58 | 显示全部楼层
mintspring 发表于 2016-12-2 21:24
#include "led.h"
#include "delay.h"
#include "key.h"

对比着你的我该有的都有啊,就是没进中断。
中断优先级分组,LED初始化我都在主函数里初始化过了,中断该使能的我也都使能了。
计数模式我也改成向上计数模式,但还是没反应。看了两天了,就是没看出问题出在哪
对了,系统滴答不是用到延时直接调用对应的函数就行。我从来没有初始化系统滴答。
定时器的预分频和重装载也都懂,就是想配置成1秒计时时间,都不错啊。
yklstudent 发表于 2016-12-2 22:20 | 显示全部楼层
TIM的时钟开启了吗?
 楼主| FightingBoy 发表于 2016-12-2 23:09 | 显示全部楼层
yklstudent 发表于 2016-12-2 22:20
TIM的时钟开启了吗?

AHB的时钟开了,外设APB1也开了。时钟是没问题的,读预分频计数器的值都是在不停的变化的.说明时钟是肯定没问题。
 楼主| FightingBoy 发表于 2016-12-2 23:12 | 显示全部楼层
问题已经解决了,请问怎么结贴啊?
mintspring 发表于 2016-12-2 23:54 | 显示全部楼层
最后你发现了什么问题啊。
皈依 发表于 2016-12-3 08:48 | 显示全部楼层
我猜测是不是没做初始化
 楼主| FightingBoy 发表于 2016-12-3 09:59 | 显示全部楼层
mintspring 发表于 2016-12-2 23:54
最后你发现了什么问题啊。

主函数里面没有加while循环,程序跑飞了...
这里的配置都对。没问题,加个while直接就好了
yu515301489 发表于 2016-12-3 11:39 | 显示全部楼层
FightingBoy 发表于 2016-12-3 09:59
主函数里面没有加while循环,程序跑飞了...
这里的配置都对。没问题,加个while直接就好了 ...

mintspring 发表于 2016-12-3 12:23 | 显示全部楼层
FightingBoy 发表于 2016-12-3 09:59
主函数里面没有加while循环,程序跑飞了...
这里的配置都对。没问题,加个while直接就好了 ...

人才,哈哈,你下次贴完整的代码大家就可以一眼看出来了。
 楼主| FightingBoy 发表于 2016-12-3 21:31 | 显示全部楼层
mintspring 发表于 2016-12-3 12:23
人才,哈哈,你下次贴完整的代码大家就可以一眼看出来了。

嘿嘿,我也怕贴的太多了你们看着也头疼,所有就只贴了自认为关键的一点。还是自己技术太渣了
不过还是要感谢大家的指教啊0.0
mintspring 发表于 2016-12-4 10:43 | 显示全部楼层
楼主加油。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

18

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部