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

    xiaoxiao2025-10-19  10

    这里说明下,我这边的最小系统版的芯片型号是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)