CW32F030x6/x8 微控制器内部集成多达四个通用定时器、三个基本定时器和一个高级控制定时器。
各个不同定时器的功能差异如下表所示:
在一般的项目中,特别是裸机程序中会经常用到定时器来计时。因此,定时器的应用也是必不可少的。作为
初探讨(不做深入研究),我们来了解它的通用定时器的使用。
依照官方给的代码,在前面串口的例子里面,我们新建GtiM.C和CTIM.H文件。移植官方的代码。我们要CW32
定时输出一串信息,同时LED2不断切换状态。如下:
打开串口助手,配置好串口信息,然后打开串口开关。按下小蓝板上面的复位键,然后,就可以看到LED2一秒切换
一次状态,同时,串口助手输出了一串信息。如下所示:
仔细看,时间好像不是很准。当然,要想精确测量时间,得上个示波器来测量LED2的状态。也要将LED2的状态切换
放到定时器终端里面去。
GTIM的初始化如下:
void GTIM_Configuration( void )
{
GTIM_InitTypeDef GTIM_InitStruct;
BTIM_TimeBaseInitTypeDef BTIM_InitStruct;
__RCC_BTIM_CLK_ENABLE();
__RCC_GTIM1_CLK_ENABLE();
/* NVIC Configuration */
NVIC_Configuration();
GTIM_InitStruct.Mode = GTIM_MODE_COUNTER;
GTIM_InitStruct.OneShotMode = GTIM_COUNT_CONTINUE;
GTIM_InitStruct.Prescaler = GTIM_PRESCALER_DIV1;
GTIM_InitStruct.ReloadValue = 1000-1; // 1S 1次 1000-1;
GTIM_InitStruct.ToggleOutState = DISABLE;
GTIM_TimeBaseInit( CW_GTIM1, >IM_InitStruct );
GTIM1_ITRConfig( ITR_SOURCE_BTIM1 );
BTIM_InitStruct.BTIM_Mode = BTIM_Mode_TIMER;
BTIM_InitStruct.BTIM_OPMode = BTIM_OPMode_Repetitive;
BTIM_InitStruct.BTIM_Period = 63999; // 1MS 1次 47999
BTIM_InitStruct.BTIM_Prescaler = BTIM_PRS_DIV1;
BTIM_TimeBaseInit( CW_BTIM1, &BTIM_InitStruct );
GTIM_ITConfig( CW_GTIM1, GTIM_IT_OV, ENABLE );
BTIM_ITConfig( CW_BTIM1, BTIM_IT_TI, ENABLE );
GTIM_Cmd( CW_GTIM1, ENABLE );
BTIM_Cmd( CW_BTIM1, ENABLE );
}
中断代码如下:
void GTIM1_IRQHandlerCallBack( void )
{
if ( GTIM_GetITStatus( CW_GTIM1, GTIM_IT_OV ) )
{
GTIM_ClearITPendingBit( CW_GTIM1, GTIM_IT_OV );
gtim1Flag = 1;
}
}
/**
*
@Brief This funcation handles GTIM1
*/
void GTIM1_IRQHandler( void )
{
/* USER CODE BEGIN */
GTIM1_IRQHandlerCallBack();
/* USER CODE END */
}
定时器的实现,将有助我们后面程序功能的实现。本次定时器操作初探讨在这里就结束了,有兴趣的小伙伴或者
想深入研究的小伙伴,可以多看看官方的参考代码,实际动手去调试。发现问题,然后解决问题,如此,才能进步。