STM8定时器1的四种触发同步说明

10 篇文章 1 订阅

这里说明下,我这边的最小系统版的芯片型号是105K系列的,定时器部分没有TIM5\TIM6,只有TIM4,所以不讲解TIM1与TIM5/6的同步,想要了解这部分可以看官方手册。
TIM1的计数器使用三种模式与外部的触发信号同步:标准触发模式、复位触发模式和门控触发模式。
标准触发模式:
说白了就是使用外部信号触发内部计数器启动,然而如何配置呢,看手册:
在这里插入图片描述
在这里插入图片描述
下面根据官方给出的步骤配置寄存器:

void Tim1_trigger_standard_mode_Init(void){//tim1标准触发模式初始化
  
   PC_DDR_DDR2 =0;//输入
  //PD_CR1_C14  =0;//浮空输入
  PC_CR1_C12  =1;//上拉输入
  PC_CR2_C22  =0;//禁止外部中断功能

   
  TIM1_CCMR2_CC2S=0x01;//CC2通道被配置为输入, IC2映射在TI2FP2上;
  TIM1_CCMR2_OC2M=0x00;//无滤波器,以fMASTER采样
  TIM1_CCER1_CC2P=0;//捕获发生在TI2F的上升沿
  TIM1_SMCR_SMS=0x06;//触发模式:计数器在触发输入TRGI的上升沿启动(但不复位),只有计数器的启动是受控的
    TIM1_SMCR_TS=0x06;//选定TI2作为输入源
  TIM1_IER_TIE=1;//触发中断使能
  Send_String("\r\ntim1标准触发模式初始化完成\r\n");
}


#pragma vector=TIM1_OVR_TIF_vector//计数上升沿触发中断
  __interrupt void Tim1_trigger_standard_mode_IRQHandler(void){
    
    if(TIM1_SR1_TIF){
        
        TIM1_SR1_TIF=0;
         Send_String("\r\n");
        Send_String("计数触发中断\r\n");

    }
    
  }

串口输出:
在这里插入图片描述
复位触发模式:
这个模式就是使计数器清零:
在这里插入图片描述

void Tim1_Trigger_reset_mode_Init(void){//tim1复位触发模式初始化
  
   PC_DDR_DDR1 =0;//输入
  //PD_CR1_C14  =0;//浮空输入
  PC_CR1_C11  =1;//上拉输入
  PC_CR2_C21  =0;//禁止外部中断功能

   
 TIM1_CCMR1_CC1S=0x01;//CC1通道被配置为输入, IC1映射在TI1FP1上;
  TIM1_CCMR1_OC1M=0x00;//无滤波器,以fMASTER采样
  TIM1_CCER1_CC1P=0;//捕获发生在TI1F的上升沿
  TIM1_SMCR_SMS=0x04;//复位模式:
    TIM1_SMCR_TS=0x05;//选定TI1作为输入源
    TIM1_CR1_CEN=1;//使能计数器
  TIM1_IER_TIE=1;//触发中断使能
  Send_String("\r\ntim1复位触发模式初始化完成\r\n");
}


#pragma vector=TIM1_OVR_TIF_vector//计数上升沿触发中断
  __interrupt void Tim1_trigger_standard_mode_IRQHandler(void){
    
    if(TIM1_SR1_TIF){
        
        TIM1_SR1_TIF=0;
         Send_String("\r\n");
        Send_String("计数触发中断\r\n");

    }
    
  }

串口调试输出:
在这里插入图片描述
门控触发模式:
这个模式是当TI1电平保持低时,计数器才继续计数,高的时候不计数。
在这里插入图片描述
在这里插入图片描述

void Tim1_Trigger_gated_mode_Init(void){//tim1门控触发模式初始化
  
   PC_DDR_DDR1 =0;//输入
  //PD_CR1_C14  =0;//浮空输入
  PC_CR1_C11  =1;//上拉输入
  PC_CR2_C21  =0;//禁止外部中断功能

   
  TIM1_CCMR1_CC1S=0x01;//CC1通道被配置为输入, IC2映射在TI1FP1上;
  TIM1_CCMR1_OC1M=0x00;//无滤波器,以fMASTER采样
  TIM1_CCER1_CC1P=1;//捕获发生在TI1F的上升沿
  TIM1_SMCR_SMS=0x05;//门控模式
    TIM1_SMCR_TS=0x05;//选定TI1作为输入源
    TIM1_CR1_CEN=1;//使能计数器
  TIM1_IER_TIE=1;//触发中断使能
  Send_String("\r\ntim1门控触发模式初始化完成\r\n");
}


#pragma vector=TIM1_OVR_TIF_vector//计数上升沿触发中断
  __interrupt void Tim1_trigger_standard_mode_IRQHandler(void){
    
    if(TIM1_SR1_TIF){
        
        TIM1_SR1_TIF=0;
         Send_String("\r\n");
        Send_String("计数触发中断\r\n");

    }
    
  }

串口调试输出:
在这里插入图片描述
按键保持为低时计数器继续计数。
外部时钟模式2+触发模式
这个模式使用ETR作为计数器计数信号,触发模式用于控制计数器计数、复位,这里选择的出发模式为标准触发模式。
在这里插入图片描述
在这里插入图片描述

void Tim4_Init(void){//tim4初始化
  
  TIM4_CR1_ARPE=0;//预装载使能
  TIM4_CR1_OPM=0;//计数器在更新事件时不停止
  TIM4_CNTR=0;//计数器初始化
  TIM4_PSCR_PSC=0x03;//8分频,8M/8=1M
  TIM4_ARR=0xFA;//初始化自动装载值
  TIM4_EGR_UG=1;//手动产生更新事件
  TIM4_IER_UIE=1;//更新中断使能
    TIM4_CR1_CEN=1;//使能计数器
  
}
void GPIO_PE5_Init(){//PE5端口初始化
  
    PE_DDR_DDR5=1;//配置PD0为输出模式
    PE_CR1_C15=1;//配置PD0为推挽模式
    PE_CR2_C25=1;//配置PD0输出最大为10Mhz
    PE_ODR_ODR5=0;
   
}
unsigned int i=0;
#pragma vector=TIM4_OVR_UIF_vector//TIM4更新中断
  __interrupt void TIM4_OVR_UIF_IRQHandler(void){
    
    if(TIM4_SR_UIF) {
      i++;
      TIM4_SR_UIF=0;//清除更新中断标志


      if(i>=4000){
        i=0;                
        PE_ODR_ODR5=!PE_ODR_ODR5;


      }
    }

}


void Tim1_Count_mode2_Init(void){//tim1计数模式2初始化
  
  PB_DDR_DDR3 =0;//输入
  //PB_CR1_C14  =0;//浮空输入
  PB_CR1_C13  =1;//上拉输入
  PB_CR2_C23  =0;//使能外部中断功能
  
  TIM1_ETR_ETF=0x00;//无滤波器,以fMASTER采样
  TIM1_ETR_ETPS=0x00;//无分频
  TIM1_ETR_ETP=0;//ETR不反相,即高电平或上升沿有效
  TIM1_ETR_ECE=1;//使能外部时钟模式2,计数器的时钟为ETRF的有效沿
 // TIM1_IER_TIE=1;//触发中断使能
  //TIM1_CR1_CEN=1;//使能计数器

  Send_String("tim1模式2计数初始化完成\r\n");
}

void Tim1_trigger_standard_mode_Init(void){//tim1标准触发模式初始化
  
   PC_DDR_DDR1 =0;//输入
  //PD_CR1_C14  =0;//浮空输入
  PC_CR1_C11  =1;//上拉输入
  PC_CR2_C21  =0;//禁止外部中断功能

   
  TIM1_CCMR1_CC1S=0x01;//CC1通道被配置为输入, IC1映射在TI1FP1上;
  TIM1_CCMR1_OC1M=0x00;//无滤波器,以fMASTER采样
  TIM1_CCER1_CC1P=0;//捕获发生在TI2F的上升沿
  TIM1_SMCR_SMS=0x06;//触发模式:计数器在触发输入TRGI的上升沿启动(但不复位),只有计数器的启动是受控的
    TIM1_SMCR_TS=0x05;//选定TI1作为输入源
  TIM1_IER_TIE=1;//触发中断使能
  Send_String("\r\ntim1标准触发模式初始化完成\r\n");
}


在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值