打印
[STM32F1]

500us 中断溢出的定时器

[复制链接]
1180|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huanghuac|  楼主 | 2016-1-27 19:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
   NVIC_InitTypeDef NVIC_InitStructure;  
    //  TIM_OCInitTypeDef  TIM_OCInitStructure ;

      /*下面是配置定时器1的时钟*/
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE );  //最先要配置时钟,有了时钟才可以配置外设

   /*下面是配置定时器2的工作模式即使能*/
   TIM_DeInit(TIM1);                              //复位TIM1定时器
   /* TIM4 configuration */
   TIM_TimeBaseStructure.TIM_Period = 100;        //TIM4最大计数值100      
   TIM_TimeBaseStructure.TIM_Prescaler = 359;    // 分频359+1      
   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  // 时钟分割,这里为0的话那么TIM_Period 就为2500;
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //计数方向向上计数
   TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

   /* Clear TIM1 update pending flag[清除TIM4溢出中断标志] */
   TIM_ClearFlag(TIM1, TIM_FLAG_Update);
   /* Enable TIM1 Update interrupt [TIM4溢出中断允许]*/
   TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);   
   /* TIM1enable counter [允许tim4计数]*/
   TIM_Cmd(TIM1, ENABLE);

   /*下面是配置定时器2的中断向量*/
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
   NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);

这样配置的目的是想得到一个500us 中断溢出的定时器,但是结果却不尽人意
中断里  将某个IO高低高低输出,示波器测试频率是1HZ,也就是500MS 定时器溢出
同样的参数,设置到TIM2,3,4都是正确的
沙发
happy_10| | 2016-1-27 19:03 | 只看该作者
//TIM1 分频
#define TIM1_DIV1          (1-1)
#define        TIM1_DIV2          (2-1)
#define        TIM1_DIV4          (4-1)
#define        TIM1_DIV8          (8-1)
#define        TIM1_DIV9          (9-1)
#define        TIM1_DIV18          (18-1)
#define        TIM1_DIV72          (72-1)

//*************************************
// 函数名:TIM1_NVIC_Configuration
// 描述  :TIM1中断优先级配置
// 输入  :无
// 输出  :无        
//***************************************
void TIM1_NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;  
                          
    NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn ;         //TIM1更新中断
//        NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn ; //TIM1比较中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}
//*************************************
// 函数名称:TIM1_BASEInitSys
// 函数功能:TIM1基本初始化          用作定时器
// 入口参数:计数个数 分频数
// 出口参数:无
// 返回值  :无
//***************************************
void TIM1_BASEInitSys(int16_t Tcon,uint16_t psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
    TIM_DeInit(TIM1);            //复位定时器
    TIM_TimeBaseStructure.TIM_Period = Tcon;  //定时器初始值
    TIM_TimeBaseStructure.TIM_Prescaler = psc ;         //时钟预分频
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  // 时钟分割
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
    TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);   //初始化定时器的值

    TIM_ClearFlag(TIM1,TIM_FLAG_Update);     //清除定时器中断标志
//    TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);  //使能中断

//        通道1 2 3 配置为PWM1模式
  TIM1->CCMR1 = 0X6C6C ; //
  TIM1->CCMR2 = 0X006C ;
// 使能比较通道1 2 3 且1电平为有效电平
  TIM1->CCER  = 0X0011 ;
//
  TIM1->CCR1 = 0 ;
  TIM1->CCR2 = 0 ;
  TIM1->CCR3 = 0 ;
  TIM1->CCR4 = 0 ;
     
    TIM_Cmd(TIM1,ENABLE);            //开启时钟

}

//----实例应用-----

  TIM1_NVIC_Configuration() ; //开启更新中断
  TIM1_BASEInitSys(125,TIM1_DIV72) ; //72M/72=1M  定时125U

使用特权

评论回复
板凳
wenfen| | 2016-1-27 19:04 | 只看该作者
STM32F1有CUBEMX没,那个玩意儿我在F4上用过。

使用特权

评论回复
地板
冰清玉洁| | 2016-1-27 19:04 | 只看该作者
是不是计数方式什么的设置的不对

使用特权

评论回复
5
zhuhuis| | 2016-1-27 19:04 | 只看该作者
stm32f1的TIM1 很正常,用得极其普遍。
从你的配置看,的确应该是500US翻转一次。至少单从定时器配置看没啥问题。

使用特权

评论回复
6
tian111| | 2016-1-27 19:04 | 只看该作者
检查下输出管脚的配置、还有启动文件跟你所选芯片是否一致。。。。。。原因一定很简单,或许哪里疏忽而已。

使用特权

评论回复
7
宋倩2010| | 2016-1-27 19:05 | 只看该作者
从程序的定时器配置没看出错误

使用特权

评论回复
8
chenho| | 2016-1-27 19:05 | 只看该作者
你的这个情况确实是有些蹊跷啊难道是中断设置的不对

使用特权

评论回复
9
huanghuac|  楼主 | 2016-1-27 19:06 | 只看该作者
嗯,我知道了,多谢啊

使用特权

评论回复
10
Soraka| | 2016-1-27 20:15 | 只看该作者
从程序的配置看好像是对的呀

使用特权

评论回复
11
奥德赛| | 2016-1-28 20:58 | 只看该作者
我也在用tim1啊,没什么问题啊

使用特权

评论回复
12
secretuniverse| | 2016-1-29 15:11 | 只看该作者
zhuhuis 发表于 2016-1-27 19:04
stm32f1的TIM1 很正常,用得极其普遍。
从你的配置看,的确应该是500US翻转一次。至少单从定时器配置看没啥 ...

我觉得首先应该看看定时器中断有没有进入

使用特权

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

本版积分规则

772

主题

8473

帖子

6

粉丝