stm32定时器tim6tim7,对定时时间的设置与哪些寄存器有关
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32定时器tim6tim7,对定时时间的设置与哪些寄存器有关相关的知识,希望对你有一定的参考价值。
STM32F10XXX系列包含TIM6、TIM7两个基本定时器,计数器为16位,其功能比较简单,仅支持向上计数,且只能计时,没有外部I/O口。一、基本定时器的功能框图
1、时钟源TIMxCLK:定时器的时钟源来自系统内部时钟,准确来说由APB1预分频器分频提供,因为TIM6、7都是挂载在APB1上的外设。如果APB1的预分频系数等于1,则频率不变,其他情况,频率乘以2,库函数中APB1的分频系数为2,故定时器的时钟TIMxCLK=36*2=72MHz。
2、计数器时钟CK_CNT:CK_PSC可看成直接由CK_INT经触发控制器引入,PSC预分频器为16位寄存器,可对TIMxCLK进行1~65536分频,计算公式为:CK_CNT=TIMxCLK/(PSC+1)。
3、计数器CNT:计数器CNT为16位寄存器,只能向上计数,最大值为65535,当计数器有0加到65535并溢出时,可以产生一个更新中断/更新事件。
4、自动重装寄存器ARR:16位寄存器,里面的数值为计数器能达到的最大数值。
5、产生一次中断的时间计算:time=(ARR+1)/(TIMxCLK/(PSC+1))
在实际中,预分频器起分频作用的是其影子寄存器或称为缓冲器。由下图的时序图可见:
ARR的值为FC-1,最开始预分频控制寄存器的值为0,此时预分频系数为1,即计数器时钟为72MHz。当计数器计数到F8时,我们将预分频控制寄存器的值写为1,此时,预分频器缓冲寄存器的值并没有立即更新为1,定时器的时钟依然为72MHz,计数器计数到FC,产生一个更新事件后,才将预分频器缓冲器的值更新为1,此时定时器的时钟变为原来的一半,即36MHz,保证了计数的准确性。
二、时基单元
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 */
uint16_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 */
uint8_t TIM_RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter
reaches zero, an update event is generated and counting restarts
from the RCR value (N).
This means in PWM mode that (N+1) corresponds to:
- the number of PWM periods in edge-aligned mode
- the number of half PWM period in center-aligned mode
This parameter must be a number between 0x00 and 0xFF.
@note This parameter is valid only for TIM1 and TIM8. */
TIM_TimeBaseInitTypeDef;
1、TIM_Prescaler:定时器预分频器设置
2 、TIM_CounterMode:计数器有向上计数、向下计数、中心对齐计数3中模式,基本定时器仅支持向上计算,这里不用设置
3、TIM_Period:定时器周期,实际就是设置自动重装寄存器ARR的值
4 、TIM_ClockDivision:时钟分频,设置定时器时钟CK_INT频率与数字滤波器采样时钟频率的分频比,基本定时器不用设置
5 、TIM_RepetitionCounter:重复计数器,属于高级定时器的功能,不用设置
三、代码
使用定时器实现1S定时,因为STM32F103C8T6只有TIM1、TIM2、TIM3、TIM4这几个定时器,这里使用TIM2代替TIM6。
Timer.c文件
#include "stm32f10x.h" // Device header
void Timer_Init(void)
//第一步:开启APB1上的TIM2外设时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
//第二步:时钟源选择内部时钟
TIM_InternalClockConfig(TIM2);
//第三步:初始化TIM2时基单元
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;
TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
//第四步:手动清除计数器中断标志位
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
//第五步:开启计数器中断
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
//第六步:配置NVIC
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);
main.c文件
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"
uint16_t Num;
int main(void)
OLED_Init();
Timer_Init();
OLED_ShowString(1, 1, "Num:");
while (1)
OLED_ShowNum(1, 5, Num, 5);
/*TIM2中断处理程序*/
void TIM2_IRQHandler(void)
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
Num ++;
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
参考技术A 1. TIM6 和TIM7 控制寄存器 1(TIMx_CR1) 功能是使能定时器,让它有计算的功能。对应设置的函数是TIM_ITConfig(TIM3,TIM_IT_Update
2. TIM6 和TIM7 计数器(TIMx_CNT),TIM6 和TIM7
以上是关于stm32定时器tim6tim7,对定时时间的设置与哪些寄存器有关的主要内容,如果未能解决你的问题,请参考以下文章