定时器外部脉冲计数问题,求助。。。

2019-07-21 03:32发布

方案:用TIM1定时器产生周期性的脉冲,在PC.2端口输出周期性的脉冲,PA.8接LED灯,也是输出与PC.2相同的周期的脉冲,用于查看脉冲产生是否正常,再用杜邦线将PC.2脚和TIM3_CH1脚(PA.6),即将PC.2上的脉冲输入到TIM3_CH1通道上,TIM3设置成外部脉冲计数,最终控制PD.2上接的LED灯。 问题:能产生脉冲,但TIM3这部分的计数器好像没反应,没计数
主函数main() #include "sys.h"
#include "led.h"
#include "tim1ti.h"
#include "delay.h"
#include "tim2.h" int main(void)

  u16 t,j=0;
  Stm32_Clock_Init(72);
  delay_init(72);     led_init();
  
   tim1ti_init(4999,7999);
   tim2_init(1000,1);
   while(1)
   {
     t=TIM2->CNT;
     if(t>5)
  {
     j++;
  if(j>10)
  {
     PDout(2)=!PDout(2);     //led灯
     delay_ms(500);
  }
 
 
 
 
 
  }
   }   }   子程序LED.C #include "led.h" void led_init(void)
{
  RCC->APB2ENR|=1<<5;    //设置PD时钟
  RCC->APB2ENR|=1<<4;     //设置PC时钟
  RCC->APB2ENR|=1<<2;      //设置PA时钟
  GPIOC->CRL|=1<<8;              //配置PC.2为推挽输出,10M模式
  GPIOC->ODR|=1<<2;               //初始化PC.2输出为高电平   GPIOD->CRL|=1<<8;              //配置PD.2为推挽输出,10M模式
  GPIOD->ODR|=1<<2;               //初始化PD.2输出为高电平   GPIOA->CRH|=1;   //设置端口PA.8为推挽输出,10M模式
  GPIOA->ODR|=1<<8;                //初始化PA.8输出为高电平
} 上面的子程序函数LED的led.h文件 #ifndef __LED_H
  #define __LED_H
  #include "sys.h"
  void led_init(void);
#endif  
TIM1产生定时中断的子程序函数 #include "tim1ti.h"
#include "led.h"
#include "delay.h"
void tim1ti_init(u16 arr,u16 psc)
{  
  
  RCC->APB2ENR|=1<<11;           //设置TIM1定时器时钟开启
  TIM1->SMCR&=0XFFF0;    //选择定时器TIM1时钟源为内部时钟,即SMS[2:0]为000B
 
  TIM1->ARR=arr;                //设置自动重装载寄存器,16为寄存器
  TIM1->SC=psc;                 //设置TIM1 预分频器,16为寄存器
  TIM1->RCR=0;     //设置重复计数器的值为0,即REP[7:0]为0
  TIM1->CR1&=0xffef;   //设置DIR为0,即计数器向上计数
    
  TIM1->CR1|=1<<2;      //选择更新请求源,设置URS
  TIM1->DIER|=1;    //UIE=1;允许更新中断
  TIM1->CR1|=1;        // 使能计数器,CEN=1
      
  MY_NVIC_Init(1,3 ,TIM1_UP_IRQChannel,1); 
 
} TIM1定时器的中断函数 void TIM1_UP_IRQHandler(void)
{
 
  PCout(2)=!PCout(2);           //输出脉冲
  PAout(8)=!PAout(8);          //此脚接LED灯,用于查看产生的脉冲是否正常
 
  delay_ms(100);
 
  TIM1->SR|=1;       //清除更新中断标志
}
上面的TIM1子程序函数的tim1ti.h文件 #ifndef __TIM1TI_H
   #define __TIM1TI_H
   #include "sys.h"
   void tim1ti_init(u16 arr,u16 psc); #endif   TIM3定时器,外部脉冲计数子程序函数 #include "tim2.h"
 
void tim2_init(u16 arr,u16 psc)
{
  RCC->APB1ENR|=1<<1;       //设置TIM3时钟 
 
  RCC->APB2ENR|=1<<2;   //PA时钟开启
  GPIOA->CRL|=4<<24;           //设置PA.6为浮空输入模式   TIM3->SMCR&=0XFF80;
  TIM3->SMCR|=0X0057;   //设置TS[2:0]为101B,即:选择用于同步计数器的触发输入为滤波后的定时器输入1(TI1FP1).
    //SMS[2:0]为111B,即:从模式选择,为外部时钟模式1,选择触发输入TRGI的上升沿驱动计数器
    TIM3->CCMR1&=0XFFFC;
  TIM3->CCMR1|=1;           //CC1S[1:0]=10,设置CC1通道配置为输入,IC1映射在TI1上 ,无滤波器
 
  TIM3->CCER&=0XFFFD;   //设置CC1P=0,即不反相,上升沿有效   TIM3->ARR=arr;              //设置自动装载寄存器值
  TIM3->RCR=0;                //重复寄存器值为0
  TIM3->SC=psc;
  TIM3->CR1&=0xFFEF;  //设置计数器方向为向上计数,即DIR=0
  TIM3->CR1|=1;             //启动计数器,CEN=1
}  
上面的TIM3定时器的子函数的tim2.h文件
#ifndef __TIM2_H
  #define __TIM2_H
  #include "sys.h"
  void tim2_init(u16 arr,u16 psc);
#endif    
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
40条回答
18246193969
2019-07-24 00:08
//请问一下我这么配置 TIM4哪里有问题 ,计不了数啊。。。大神请指教。

void TIM4_Excnt_Init(u16 arr,u16 psc)  
{   

RCC->APB1ENR|=1<<2;    //TIM4 ????   
RCC->APB2ENR|=1<<3;     //??PORTB??    


// RCC->APB1ENR|=1<<3;   
// RCC->APB2ENR|=1<<2;    

GPIOB->CRL&=0XFFFFFFF0;
GPIOB->CRL|=0X00000008;
GPIOB->ODR|=0<<6;       

TIM4->ARR=arr;          
TIM4->SC=psc;          

TIM4->CCMR1|=1<<0; //CC1S=01  ????? IC1???TI1?  
TIM4->CCMR1|=0<<4;  //IC1F=0000 ??????? ???  

TIM4->CCER|=0<<1;  //CC1P=0 ?????  
TIM4->SMCR|=5<<4;    //????:?????????1(TI1FP1)  
TIM4->SMCR|=7<<0;    //??????1  
TIM4->CR1|=1<<0;       //?????,CEN=1  
}

一周热门 更多>