STM32脱坑【Day 11】

简单看了下定时器的内容,挺多的,觉得定时器就是封装的中断,因为单独的一个定时器无法完成任何事,还需要定时器(中断)函数。

截个江科大的做的图:

像之前的中断一样,定时器的配置流程如上图所示,首先是时钟单元的获取(确定用什么时钟,定时频率),然后是时基单元(定多长时间),中断输出(达到定时标志进入中断处理相关任务)

由于之前玩过DSP2812,所以对定时器的一些概念还比较熟悉,因此理解起来还算轻松,就是第一步时钟单元的配置内容多一些,需要结合手册。

代码部分,由于TIM2是内部中断,因此直接配置NVIC中断通道即可

void Timer_Init()
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	TIM_InternalClockConfig(TIM2);//¿É²»Ð´£¬ÒòΪÆô¶¯Ê±Ä¬ÈÏʹÓÃ
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStru;
	TIM_TimeBaseInitStru.TIM_ClockDivision=TIM_CKD_DIV1;//²»·ÖƵ£¬¾ÍÊÇ72MHz
	TIM_TimeBaseInitStru.TIM_CounterMode=TIM_CounterMode_Up;//ÏòÉϼÆÊýģʽ
	TIM_TimeBaseInitStru.TIM_Period=10000-1;//¼ÆÊýÖÜÆÚ1s
	TIM_TimeBaseInitStru.TIM_Prescaler=7200-1;
	TIM_TimeBaseInitStru.TIM_RepetitionCounter=0;//¸ß¼¶¶¨Ê±Æ÷²ÅÉÓÃ
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStru);
	
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
	
	TIM_Cmd(TIM2, ENABLE);
}
void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
	{
		Num ++;
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}

重点部分是实际单元的计时周期配置,公式如下:

CK_CNT_OV = CK_CNT / (ARR + 1)

         = CK_PSC / (PSC + 1) / (ARR + 1),其中,CK_PSC为时钟频率,PSC为分频值,代码中写成7200-1,也就是7200分频,ARR为自动重装载值,计数达到此值自动置0,代码中写成10000-1。也就是以10KHz计数频率计数10000次,正好是1s。

实验结果:计数周期为1s,OLED上显示数字变化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值