定时器0配置初始化代码
void App_Timer0Cfg(uint16_t u16Period)
{
uint16_t u16ArrValue;
uint16_t u16CntValue;
stc_bt_mode0_cfg_t stcBtBaseCfg;
DDL_ZERO_STRUCT(stcBtBaseCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralBaseTim, TRUE); //Base Timer外设时钟使能
stcBtBaseCfg.enWorkMode = BtWorkMode0; //定时器模式
stcBtBaseCfg.enCT = BtTimer; //定时器功能,计数时钟为内部PCLK
stcBtBaseCfg.enPRS = BtPCLKDiv256; //PCLK/256
stcBtBaseCfg.enCntMode = Bt16bitArrMode; //自动重载16位计数器/定时器
stcBtBaseCfg.bEnTog = FALSE; //禁止翻转输出
stcBtBaseCfg.bEnGate = FALSE; //不使能门控
stcBtBaseCfg.enGateP = BtGatePositive;
Bt_Mode0_Init(TIM0, &stcBtBaseCfg); //TIM0 的模式0功能初始化
u16ArrValue = 0x10000 - u16Period;
Bt_M0_ARRSet(TIM0, u16ArrValue); //设置重载值(ARR = 0x10000 - 周期)
u16CntValue = 0x10000 - u16Period;
Bt_M0_Cnt16Set(TIM0, u16CntValue); //设置计数初值
Bt_ClearIntFlag(TIM0,BtUevIrq); //清中断标志
Bt_Mode0_EnableIrq(TIM0); //使能TIM0中断(模式0时只有一个中断)
EnableNvic(TIM0_IRQn, IrqLevel3, TRUE); //TIM0中断使能
}
定时器0中断服务函数
void Tim0_IRQHandler(void)
{
//Timer0 模式0 溢出中断
if(TRUE == Bt_GetIntFlag(TIM0, BtUevIrq))
{
//............
//用户程序
//............
Bt_ClearIntFlag(TIM0,BtUevIrq); //中断标志清零
}
}
主程序中调用调用定时器0并运行
App_Timer0Cfg(9375); //Timer0配置初始化(周期 = 9375*(1/4M)*256 = 0.6s)
//上电后系统初始时钟为4M
Bt_M0_Run(TIM0); //TIM0 运行。
简便计算
需要计数个数 = 目标时间 * 系统时钟 / HCLK分频 / PCLK分频 / 定时器分频
写入的CNT值 = 定时器溢出时间 - 需要计数个数
|