以下基于STM32F103C8T6芯片;
定时1S的代码如下:
定时计算公式:
Tout=(ARR+1)(PSC+1)/TclkTout
定时时间=(计数值+1)(预分频值+1)/时钟频率
计数值与预分频值,两种取值范围0~65535即2^16-1
TclkTout:TIM3 的输入时钟频率(单位为 Mhz)。
Tout:TIM3 溢出时间(单位为 us)。
1MHZ---1US==>定时时间的单位为us,根据你要定时的时间,对微秒(us)进行换算
STM32F103C8T6时钟频率=72MHZ
我要定时1s
1s=1hz ,1MHZ=1,000 ,000HZ,1s=1,000ms=1,000,000us
1000 000=(计数值+1)(预分频值+1)/72MHZ
=》计数值+1=7200,预分频值+1=10000
定时时间=7200*10000/72=100*100000=1000 000=>1S
所以计数值=7199,预分频值=9999
注:为啥这么取,一个字,凑就完事
/*******************************************************************
* Function : TIM3定时器初始化
* Parameter : arr=计数值,psc=预分频值
* Return : void
* Comment : 总线APB1
********************************************************************/
void TIM3_Ms(u16 arr,u16 psc)
{
/*第一步--开时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/*第二步--TIM初始化配置*/
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseStructInit (&TIM_TimeBaseInitStruct);
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; //不分频
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up ; //向上计数
TIM_TimeBaseInitStruct.TIM_Period = arr; //计数值
TIM_TimeBaseInitStruct.TIM_Prescaler = psc; //预分频值
//TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; //高级定时器用的
TIM_TimeBaseInit (TIM3, &TIM_TimeBaseInitStruct);
/*第三步--手动更新事件*/
TIM_GenerateEvent(TIM3,TIM_EventSource_Update);
TIM_ClearFlag(TIM3,TIM_FLAG_Update); //防止一开始就进中断
/*第四步--使能定时器中断*/
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
/*第五步--NVIC配置*/
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn; //通道
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // 使能该通道请求
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 5; // 抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; // 响应优先级
NVIC_Init(&NVIC_InitStruct); //初始化NIVC
/*第六步--打开计数器*/
TIM_Cmd(TIM3, ENABLE);
}
/*******************************************************************
* Function : TIM3中断服务函数
* Parameter : void
* Return : void
* Comment :
********************************************************************/
void TIM3_IRQHandler(void)
{
//检测终端表示,检测到则执行中断
if(TIM_GetITStatus(TIM3, TIM_IT_Update)!=RESET)
{
//清除中断标志位
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
LED3_FZ(); //LED3翻转
}
}
---------------------------------------------------------------------------------------------------------------------------------TIM定时器的介绍