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

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条回答
正点原子
1楼-- · 2019-07-21 08:41
//TIM5,外部计数模式
void TIM5_Excnt_Init(u16 arr,u16 psc)


RCC->APB1ENR|=1<<3;    //TIM5 时钟使能 
RCC->APB2ENR|=1<<2;     //使能PORTA时钟  
 
GPIOA->CRL&=0XFFFFFFF0; //PA0 清除之前设置  
GPIOA->CRL|=0X00000008; //PA0 输入   
GPIOA->ODR|=0<<0; //PA0 下拉
  
  TIM5->ARR=arr;   //设定计数器自动重装值   
TIM5->SC=psc;   //预分频器 

TIM5->CCMR1|=1<<0; //CC1S=01  选择输入端 IC1映射到TI1上
  TIM5->CCMR1|=0<<4;  //IC1F=0000 配置输入滤波器 不滤波

TIM5->CCER|=0<<1;  //CC1P=0 上升沿计数
   TIM5->SMCR|=5<<4;    //触发选择:滤波后的定时器输入1(TI1FP1)
   TIM5->SMCR|=7<<0;    //外部时钟模式1
  TIM5->CR1|=1<<0;       //启动计数器,CEN=1
}
int main(void)
{
u32 oldcnt=0;  
  Stm32_Clock_Init(9); //系统时钟设置
uart_init(72,9600);   //串口初始化为9600
delay_init(72);       //延时初始化 
    TIM5_Excnt_Init(0XFFFF,0); //外部计数,最大值0xffff
    while(1)
{
  delay_ms(10);
if(oldcnt!=TIM5->CNT)
{
oldcnt=TIM5->CNT;
printf("cnt:%d ",oldcnt);
}

}
}

以上代码,在战舰板实测OK.
正点原子
2楼-- · 2019-07-21 13:08
 精彩回答 2  元偷偷看……
正点原子
3楼-- · 2019-07-21 14:49


happy
4楼-- · 2019-07-21 20:47
回复【楼主位】ximilenfu:
----------------------------
楼主主函数没写对啊   用的是tim3  而你用的是T=TIM2->CNT
ximilenfu
5楼-- · 2019-07-22 02:34
回复【5楼】happy:
---------------------------------
是额。没注意呵呵,谢那,不过还是不行
ximilenfu
6楼-- · 2019-07-22 05:39
回复【4楼】正点原子:
---------------------------------
灰常感谢,太给力了。。。

一周热门 更多>