华大HC芯片实现定时器计数

HC32L130E8PA实现定时器计数功能

在芯片资源紧缺的情况下,尝试了使用华大国产芯片,
对于该芯片来说,有些功能确实不完善,但还是能够满足基本需求的。

我在这使用的时HC32L130E8PA的芯片,采用定时器3实现计时器计数功能。

代码如下:

/*
	定时器3初始化 用于计数

	u16Period * (1/4M) * 16
	12500 * (1 / 4 M) * 16 = 50000us = 50ms
*/
void Time3Init(u16 u16Period)
{
	uint16_t u16Value;
	stc_tim3_mode0_cfg_t stcTim3BaseCfg;
	//结构体初始化清零
	DDL_ZERO_STRUCT(stcTim3BaseCfg);

	stcTim3BaseCfg.enWorkMode = Tim3WorkMode0;//定时器模式
	stcTim3BaseCfg.enCT = Tim3Timer;//定时器功能,计数时钟为内部PCLK
	stcTim3BaseCfg.enPRS = Tim3PCLKDiv64;//16分频
	stcTim3BaseCfg.enCntMode = Tim316bitArrMode;//自动重装载16位计数器
	stcTim3BaseCfg.bEnGate = FALSE;
	stcTim3BaseCfg.bEnTog = FALSE;
	stcTim3BaseCfg.enGateP = Tim3GatePositive;
	//TIM3 的模式0功能初始化
	Tim3_Mode0_Init(&stcTim3BaseCfg);
	u16Value = 0x10000 - u16Period;
	//设置重装载值
	Tim3_M0_ARRSet(u16Value);
	//设置计数值
	Tim3_M0_Cnt16Set(u16Value);
	Tim3_ClearIntFlag(Tim3UevIrq);//清楚中断标志
	Tim3_Mode0_EnableIrq();//使能TIM3中断
	
	EnableNvic(TIM3_IRQn,IrqLevel1,TRUE);
}

以上程序只是进行初始化 但没有启动,启动如下:

/*
	开始定时器计数
*/
void TimeCntStart(void)
{
	Tim3_M0_Run();
}

中断如下:

/*
	定时器中断
*/
void TIM3_IRQHandler(void)
{
	//计时溢出
	if(TRUE == Tim3_GetIntFlag(Tim3UevIrq))
	{
		RepCnt++;
		if(RepCnt >= 1200 * DevInfo.RepCycle)
		{
			RepCnt = 0;
		}
		//清除中断标志位
		Tim3_ClearIntFlag(Tim3UevIrq);
	}
}

在实际操作中,按公式去计算重装载值 实现定时计数,貌似时间不准确,我是不断的更改重装载值,才找到计时的那个标准,这个不知道时硬件原因还是芯片原因,具体情况还是得在使用时,进行调试,定时要久一点,值就要设大,要小,值就设小。

你可能感兴趣的:(HC32,单片机,嵌入式,c语言,stm32,芯片)