打印

TIM基本定时器程序无法进入中断时怎么回事啊求帮忙看下谢谢

[复制链接]
283|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
roucun|  楼主 | 2020-4-25 10:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//这段程序编译没有错误,


//我用的是Keil 5 自带的创建工程模板这样减少了一些麻烦,模板没有问题毕竟前面的实验都没有问题的



/*头文件*/
#include"stm32f10x.h"
#ifndef _BSP_BASCTIM_H  //如果没有定义_bsp_BaseTim_h_
#define _BSP_BASCTIM_H  //那么就定义_bsp_BaseTim_h_
void All_Init(void);
#endif                  //定义完毕



/*.c文件*/
#include"bsp_BaseTim.h"
extern   uint16_t   time;   //全局变量用来作为计数器使用



//基本定时器配置
void BaseTim_Config(void)   
{
      TIM_TimeBaseInitTypeDef  TIM_I;
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
      TIM_I.TIM_Prescaler=71; //PSC+1                              //时钟预分频器    时钟源经过该预分频器才是定时器时钟(0x0000~0xFFFF之间的分频)
//      TIM_I.TIM_CounterMode=TIM_CounterMode_Up;      //模式选择        向上 向下 中心对齐模式(基本定时器不需要设置)
      TIM_I.TIM_Period=999;                                            //定时器周期值(到达这个值的时候产生中断)      自动重载寄存器的值0x0000~0xFFFF之间
//      TIM_I.TIM_ClockDivision=TIM_CKD_DIV1;               //时钟分频        (基本定时器不需要设置)   
//      TIM_I.TIM_RepetitionCounter=0x00;                       //重复计数器      (基本定时器不需要设置)     
      

      TIM_TimeBaseInit(TIM6,&TIM_I);                             //初始化TIM6
      TIM_ClearFlag(TIM6,TIM_FLAG_Update);                   //清除定时器中断标志位
      TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);            //开启定时器中断
      TIM_Cmd(TIM6,ENABLE);     //使能定时器
}



//GPIO配置

void GPIO_Config(void)  

{
   
     GPIO_InitTypeDef gpio_i;
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);  //打开PB
   

    //输出模式
     gpio_i.GPIO_Pin=GPIO_Pin_5;                     //配置引脚
     gpio_i.GPIO_Mode=GPIO_Mode_Out_PP;     //配置模式
     gpio_i.GPIO_Speed=GPIO_Speed_50MHz;    //配置输出速率
     GPIO_Init(GPIOB,&gpio_i);                          //初始化GPIO配置
}
//嵌套向量中断配置
void NVIC_Config(void)
{
    NVIC_InitTypeDef nvic;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);    //中断优先级分组
    nvic.NVIC_IRQChannel=TIM6_IRQn;                       //中断通道
    nvic.NVIC_IRQChannelPreemptionPriority=0x01;      //中断抢占优先级
    nvic.NVIC_IRQChannelSubPriority=0x02;                //中断响应优先级
    nvic.NVIC_IRQChannelCmd=ENABLE;                     //中断使能
    NVIC_Init(&nvic);                                                 //中断初始化
}

//中断服务函数
void TIM6_IRQHandler(void)
{

    if(TIM_GetITStatus(TIM6,TIM_IT_Update)!=RESET)       //判断是否真的进入了中断
    {
        time++;
        GPIO_ResetBits(GPIOB,GPIO_Pin_5);                        //LED常亮(主函数里面每秒让LED灭一次)
        TIM_ClearITPendingBit(TIM6,TIM_IT_Update);          //清除中断标志位
    }
}
//这个函数时用来调用其他配置函数的目的是为了在main函数里面更美观

void All_Init(void)
{
    NVIC_Config();
    BaseTim_Config();   //定时器配置
    GPIO_Config();  //GPIO配置  
}



/*main函数*/
#include"bsp_BaseTim.h"
uint16_t   time=0;  //用来记录中断次数的全局变量
int main()
{
    All_Init();  //所有的初始化都在这个函数里面完成了
    while(1)
    {   
   
    //    GPIO_ResetBits(GPIOB,GPIO_Pin_5); //LED常亮(放置于中断函数内部用来验证是否进入了中断函数)
        if(time==1000)  //如果1s到了LED就灭掉
        {
            time=0;  //对time清零
            GPIO_SetBits(GPIOB,GPIO_Pin_5); //LED灭
        }
    }
}

使用特权

评论回复

相关帖子

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

本版积分规则

421

主题

446

帖子

0

粉丝