完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本篇重点记录的是STM32F1的通用定时器。
STM32F103ZE有8个定时器,其中2个高级定时器(TIM1、TIM8),4个通用定时器(TIM2、TIM3、TIM4、TIM5),2个基本定时器(TIM6、TIM7)。下表是对这8个定时器的详细描述。 [tr]定时器种类位数计数器模式产生DMA请求捕获/比较通道互补输出特殊应用场景[/tr]
在此对计数模式做一个解释1、通用计时器概述 通用计数器TIMx(TIM2~TIM5)定时器的特点包括:
从图中我们可以看到通用计时器由时钟、时基单元、输入电路、输出电路构成,下面将会对这四块分别做介绍。 2、通用计数器 时钟的选择 上图总结为计数器的时钟有8种选择:
计数器时钟可以由下列时钟源提供(该内容意思同上):3、时基单元 从上图中我们可看到定时器的构成: 1)计数寄存器(TIMx_CNT) 该寄存器计数模式为3种,向上计数、向下计数和对齐计数 2)预分频器寄存器(TIMx_PSC) 可将时钟频率按1到65536之间的任意值进行分频,可在运行时改变其设置值 3)自动装载寄存器(TIMx_ARR) 如果TIMx_CR1寄存器中的ARPE位为0,ARR寄存器的内容将直接写入影子寄存器;如果ARPE为1,ARR寄存器的内容将再每次的更新事件UEV发生时,传送到影子寄存器; 如果TIMx_CR1中的UDIS位为0,当计数器产生溢出条件时,产生更新事件; 4)控制寄存器1(TIMx_CR1) 5)DMA中断使能寄存器(TIMx_DIER) 6)定时器中断实现步骤 时基单元为我们提供了定时的功能,我们利用该功能实现如下示例程序的编写: 通过定时器中断配置,实现每500ms中断一次,通过定时中断实现LED灯闪烁。 ① 使能定时器时钟。 RCC_APB1PeriphClockCmd(); ② 初始化定时器,配置ARR,PSC(即配置自动装载寄存器TIMx_ARR和预分频寄存器值TIMx_PSC) TIM_TimeBaseInit(TIM_TypeDef* TIMx, IM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); ARR、PSC如何确定根据上面导出的Tout的公式,结合本小节开头的需求,中断时间设置为500ms,我们可使用默认的系统频率,则Fck_psc=CK_INT=72MHz,则 500(ms)=(ARR+1)∗T=(ARR+1)∗(PSC[15:0]+1)72000500(ms)=(ARR+1)∗T=(ARR+1)∗(PSC[15:0]+1)72000 设PSC=7199,则ARR=4999,该需求的ARR,PSC我们将会以此值去配置。 ③ 开启定时器中断,配置NVIC。 void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState); NVIC_Init(); ④ 使能定时器。 TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState); ⑤ 编写中断服务函数。 TIMx_IRQHandler(); 7)程序编写 //通用定时器3中断初始化 //这里时钟选择为APB1的2倍,而APB1为36M //arr:自动重装值。 //psc:时钟预分频数 //这里使用的是定时器3! void TIM3_Int_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能 //定时器TIM3初始化 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断 //中断优先级NVIC设置 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器 TIM_Cmd(TIM3, ENABLE); //使能TIMx } //定时器3中断服务程序 void TIM3_IRQHandler(void) //TIM3中断 { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否 { TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志 LED1=!LED1; } } //LED1闪烁的周期为500ms,LED0闪烁的周期为200ms,看到的现象为LED1闪烁慢,LED0闪烁快 int main(void) { delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 LED_Init(); //LED端口初始化 TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms while(1) { LED0=!LED0; delay_ms(200); } } STM32通用定时器在此篇仅记录了 定时器基本的概念和时基单元的功能编程,由于篇幅的限制,通用定时器的输入和输出的功能将再下篇介绍。 |
||||||
|
||||||
只有小组成员才能发言,加入小组>>
2605 浏览 0 评论
801浏览 1评论
244浏览 1评论
572浏览 0评论
309浏览 0评论
524浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-31 22:41 , Processed in 0.946534 second(s), Total 46, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号