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