STM32F1系列------TIM定时器1s定时以及计算详解

以下基于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定时器的介绍

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值