FM33G0xx定时器实现10us倍数精确延时

时钟24MHz,实现10us倍数延时

void Test_Etimx(ETIMx_Type* ETIMx, uint32_t xus)
{
    
    
	ETIM_InitTypeDef init_para;
	volatile uint8_t EtimNum;

	EtimNum = (uint8_t)(((uint32_t)ETIMx - ETIMER1_BASE)>>5);
	

	//信号源参数
	init_para.sig_src_para.SIG1SEL = ETIMx_ETxINSEL_SIG1SEL_GROUP1;		/* 内部信号1源选择GROUP1 */
	
	switch(EtimNum)
	{
    
    
		case 0:
			//信号源参数
			init_para.sig_src_para.GRP1SEL = ETIMx_ETxINSEL_GRP1SEL_ET1_APBCLK;		/* GROUP1 信号选择APBCLK */
	
			//ET1时钟使能	
			RCC_PERCLK_SetableEx( ET1CLK, ENABLE );		
			//NVIC中断配置
			NVIC_DisableIRQ(ETIM1_IRQn);
			NVIC_SetPriority(ETIM1_IRQn,2);//中断优先级配置
			NVIC_EnableIRQ(ETIM1_IRQn);		
			break;

		case 1:
			//信号源参数
			init_para.sig_src_para.GRP1SEL = ETIMx_ETxINSEL_GRP1SEL_ET2_APBCLK;		/* GROUP1 信号选择APBCLK */
	
			//ET2时钟使能	
			RCC_PERCLK_SetableEx( ET2CLK, ENABLE );	
			//NVIC中断配置
			NVIC_DisableIRQ(ETIM2_IRQn);
			NVIC_SetPriority(ETIM2_IRQn,3);//中断优先级配置
			NVIC_EnableIRQ(ETIM2_IRQn);			
			break;

		case 2:
			//信号源参数
			init_para.sig_src_para.GRP1SEL = ETIMx_ETxINSEL_GRP1SEL_ET3_APBCLK;		/* GROUP1 信号选择APBCLK */
	
			//ET3时钟使能
			RCC_PERCLK_SetableEx( ET3CLK, ENABLE );	
			//NVIC中断配置
			NVIC_DisableIRQ(ETIM3_IRQn);
			NVIC_SetPriority(ETIM3_IRQn,1);//中断优先级配置
			NVIC_EnableIRQ(ETIM3_IRQn);			
			break;

		case 3:
			//信号源参数
			init_para.sig_src_para.GRP1SEL = ETIMx_ETxINSEL_GRP1SEL_ET4_APBCLK;		/* GROUP1 信号选择APBCLK */

			//ET4时钟使能
			RCC_PERCLK_SetableEx( ET4CLK, ENABLE );		
			//NVIC中断配置
			NVIC_DisableIRQ(ETIM4_IRQn);
			NVIC_SetPriority(ETIM4_IRQn,2);//中断优先级配置
			NVIC_EnableIRQ(ETIM4_IRQn);	
			break;
		
		default:
			break;
	}
	init_para.sig_src_para.PRESCALE1 = 239;    //240分频	/* ETx预分频寄存器1 */ 00表示1分频,FF表示256分频  24M, 100k
	init_para.sig_src_para.PRESCALE2 = clkmode - 1;    		//1分频		/* ETx预分频寄存器2 */ 00表示1分频,FF表示256分频
	
	
	//控制类参数
	init_para.ctrl_para.EXFLT = ENABLE;								/* 引脚输入数字滤波使能打开 */
	init_para.ctrl_para.MOD = ETIMx_ETxCR_MOD_COUNTER;				/* 工作模式选择计数模式 */
	init_para.ctrl_para.CASEN = DISABLE;							/* 扩展定时器级联关闭 */
	init_para.ctrl_para.EDGESEL = ETIMx_ETxCR_EDGESEL_RISING;		/* 计数模式采沿方式选择(计数时钟选择mcu_clk时该位无效,总是采用mcu_clk时钟上升沿计数) */
	init_para.ctrl_para.CAPCLR = DISABLE;							/* 带清零捕捉模式控制 */

	init_para.ctrl_para.CMPIE = DISABLE;		/* 扩展定时器比较中断使能 */
	init_para.ctrl_para.CAPIE = DISABLE;		/* 扩展定时器捕捉中断使能 */
	init_para.ctrl_para.OVIE = DISABLE;			/* 扩展定时器溢出中断使能 */		

	xus /= 10;
	if(xus == 0)
	{
    
    
		xus = 1;
	}
	init_para.ctrl_para.INITVALUE = 0xffff - xus + 1; //计数初值,24000000/240/10 = 100us ;		/* ETx初值寄存器 */

	init_para.ctrl_para.CEN = DISABLE;		/* 启动控制 */

	//初始化ETIM
	ETIMx_Init(ETIMx, &init_para);
	
}

void ETIM3_IRQHandler(void)
{
    
     
	if(SET == ETIMx_ETxIF_OVIF_Chk(ETIM3))
	{
    
    
		
		ETIMx_ETxIF_OVIF_Clr(ETIM3);
	}
}

Void Timer_Start(void)
{
    
    
	ETIMx_ETxCR_CEN_Setable(ETIM3, ENABLE);	//启动定时3定时功能
	ETIMx_ETxIE_OVIE_Setable(ETIM3, ENABLE);	//使能定时3溢出中断
}

猜你喜欢

转载自blog.csdn.net/lljss1980/article/details/115384778