完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
通用定时器
STM32F1 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器(CNT)构成。 STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长 度和波形周期可以在几个微秒到几个毫秒间调整。 STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。 STM3F1 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能包括:
控制寄存器 1(TIMx_CR1) TIMx_CR1 的最低位,也就是计数器使能位,该位必须置 1,才能让定时器开始计数。 第 4 位 DIR 可以看出默认的计数方式是向上计数,同时也可以向下计数, 第 5,6位是设置计数对齐方式的。 从第 8 和第 9 位可以看出,我们还可以设置定时器的时钟分频因子为 1,2,4。 DMA/中断使能寄存器(TIMx_DIER) 该寄存器是一个 16 位的寄存器,第 0 位是更新中断允许位,该位要设置为 1才能允许由于更新事件所产生的中断。 预分频寄存器(TIMx_PSC) 该寄存器用设置对时钟进行分频,然后提供给计数器,作为计数器的时钟。 定时器的时钟来源有 4 个: 1)内部时钟(CK_INT) 2)外部时钟模式 1:外部输入脚(TIx) 3)外部时钟模式 2:外部触发输入(ETR) 4)内部触发输入(ITRx):使用 A 定时器作为 B 定时器的预分频器(A 为 B 提供时钟)。 TIMx_SMCR 这些时钟,具体选择哪个可以通过 TIMx_SMCR 寄存器的相关位来设置。这里的 CK_INT时钟是从 APB1 倍频的来的,除非 APB1 的时钟分频数设置为 1,否则通用定时器 TIMx 的时钟是 APB1 时钟的 2 倍,当 APB1 的时钟不分频的时候,通用定时器 TIMx 的时钟就等于 APB1的时钟。 高级定时器的时钟不是来自 APB1,而是来自 APB2 的。 TIMx_CNT 寄存器 该寄存器是定时器的计数器,该寄存器存储了当前定时器的计数值。 重装载寄存器(TIMx_ARR) 该寄存器在物理上实际对应着 2 个寄存器。一个是程序员可以直接操作的,另外一个是程序员看不到的,这个看不到的寄存器在《STM32参考手册》里面被叫做影子寄存器。事实上真正起作用的是影子寄存器。根据 TIMx_CR1 寄存器中 APRE 位的设置:APRE=0 时,预装载寄存器的内容可以随时传送到影子寄存器,此时 2者是连通的;而 APRE=1 时,在每一次更新事件(UEV)时,才把预装在寄存器的内容传送到影子寄存器。 状态寄存器(TIMx_SR) 该寄存器用来标记当前与定时器相关的各种事件/中断是否发生。 TIM2_Init程序流程 1.结构体初始化 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseInitTypeDef 在库函数中的定义 typedef struct{ uint16_t TIM_Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock. This parameter can be a number between 0x0000 and 0xFFFF */ uint16_t TIM_CounterMode; /*!< Specifies the counter mode. This parameter can be a value of @ref TIM_Counter_Mode */ uint32_t TIM_Period; /*!< Specifies the period value to be loaded into the active Auto-Reload Register at the next update event. This parameter must be a number between 0x0000 and 0xFFFF. */ uint16_t TIM_ClockDivision; /*!< Specifies the clock division. This parameter can be a value of @ref TIM_Clock_Division_CKD */} TIM_TimeBaseInitTypeDef; 2.TIM3 时钟使能 TIM3 是挂载在 APB1 之下,所以我们通过 APB1 总线下的使能使能函数来使能 TIM3。调用的函数是: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 3.初始化定时器参数,设置自动重装值,分频系数,计数方式等。 TIM_TimeBaseStructure.TIM_Period = arr;//Tout= ((arr+1)*(psc+1))/Tclk;TIM_TimeBaseStructure.TIM_Prescaler = psc;TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 第一个参数 TIM_Prescaler 是用来设置分频系数的。 第二个参数 TIM_CounterMode 是用来设置计数方式,上面讲解过,可以设置为向上计数,向下计数方式还有中央对齐计数方式,比较常用的是向上计数模式 TIM_CounterMode_Up 和向下计数模式 TIM_CounterMode_Down。 第三个参数是设置自动重载计数周期值。 第四个参数是用来设置时钟分频因子。 4.接下来初始化 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); 5.设置 TIM3_DIER 允许更新中断。 TIM_ClearITPendingBit(TIM2, TIM_IT_Update);/* TIM IT enable */TIM_ITConfig(TIM2,TIM_IT_Update, ENABLE); 5.TIM3 中断优先级设置 在定时器中断使能之后,因为要产生中断,必不可少的要设置 NVIC 相关寄存器,设置中断优先级。 6.使能 TIM3 TIM_Cmd(TIM2, ENABLE); 编写中断服务函数 在中断产生后,通过状态寄存器的值来判断此次产生的中断属于什么类型。然后执行相关的操作,我们这里使用的是更新(溢出)中断,所以在状态寄存器 SR 的最低位。在处理完中断之后应该向TIM3_SR的最低位写 0,来清除该中断标志。 判断定时器 TIMx 的中断类型 TIM_IT 是否发生中断。 if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) 清除定时器 TIMx 的中断 TIM_IT 标志位。 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); 固件库还提供了两个函数用来判断定时器状态以及清除定时器状态标志位的函数 TIM_GetFlagStatus 和 TIM_ClearFlag,他们的作用和前面两个函数的作用类似。只是在 TIM_GetITStatus 函数中会先判断这种中断是否使能,使能了才去判断中断标志位,而TIM_GetFlagStatus 直接用来判断状态标志位。 定时器时间计算 系统初始化的时候在默认的系统初始化函数 SystemInit 函数里面已经初始化 APB1 的时钟为 2 分频,所以 APB1 的时钟为 36M。 而从 STM32 的内部时钟树图得知:当 APB1 的时钟分频数为 1 的时候,TIM2-7 的时钟为 APB1 的时钟,而如果 APB1 的时钟分频数不为 1,那么 TIM2~7 的时钟频率将为 APB1 时钟的两倍。因此,TIM3 的时钟为 72M。 再根据我们设计的 arr 和 psc 的值,就可以计算中断时间了。计算公式如下: Tout= ((arr+1)*(psc+1))/Tclk; Tclk:TIM3 的输入时钟频率(单位为 Mhz)。 Tout:TIM3 溢出时间(单位为 us)。 举例如下: Tout= ((4999+1)*( 7199+1))/72=500000us=500ms。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1777 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1080 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1678 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
731浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
595浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
554浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 08:52 , Processed in 1.031255 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号