• 【STM32】基本定时器


    基于stm32f103
    基于《零死角玩转STM32—F103指南者》进行学习

    定时器

    分类

    基本定时器,通用定时器,高级定时器
    在这里插入图片描述

    功能框图

    简单来说就是来自APB或者AHB的时钟,经过PSC(1到65535分频),形成时基,每经过一个时基,TIM的cnt计数有一次,根据寄存器的配置,发生更新事件,比较事件等。
    在这里插入图片描述

    时钟源(预分频不为1时,需要乘2)

    1.基本定时器时钟挂载在 APB1 总线,所以它的时钟来自于 APB1 总线
    2.不直接由 APB1 总线直接提供,而是先经过一个倍频器
      APB1 的预分频器系数为 1 时,这个倍频器系数为 1。
      当 APB1 的预分频器系数≥2 分频时,这个倍频器系数就为 2 , 即定时器的时钟频率等于 APB1总线时钟频率的两倍 。
      这里的预分频器指的是APB1的分频,而不是上图的PSC预分频器
    3.对APB1进行预分频的步骤一般在systeminit函数中,也就是启动文件中,reset_handle()函数中启动的。一般来说由库函数自动给我们设置,库函数中 APB1 预分频的系数是 2,即PCLK1=36M,所以定时器时钟 TIMxCLK=36*2=72M。

    TIM的预分频器 运行时可写,更新事件发生后启用

    1.预分频可以以系数介于1至65536之间的任意数值对计数器时钟分频。
    2.可以在运行中改变这个PSC,但是它的生效会在CNT计数器记到下一个更新事件。
    预分频系数从1变到2的计数器时序图
    在这里插入图片描述

    计数器 CNT

    1.根据分频,开始计数
    2.从0累加计数到自动重装载数值(TIMx_ARR寄存器),然后再重新开始计数并产生一个计数器溢出事件。
    3.每次计数器溢出时可以产生更新事件;(通过软件或使用从模式控制器)设置TIMx_EGR寄存器的UG位也可以产生更新事件。

    自动重装载寄存器

    自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。

    范例

    基本定时器配置

     void BASIC_TIM_Config(void)
    {
    	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    
    	// 开启定时器时钟,即内部时钟 CK_INT=72M
    	BASIC_TIM_APBxClock_FUN(BASIC_TIM_CLK, ENABLE);
    
    	// 自动重装载寄存器周的值(计数值)
    	TIM_TimeBaseStructure.TIM_Period=1000;
     
    	 // 累计 TIM_Period 个频率后产生一个更新或者中断
    	 // 时钟预分频数为 71,则驱动计数器的时钟 CK_CNT = CK_INT / (71+1)=1M
    	 TIM_TimeBaseStructure.TIM_Prescaler= 71;
    	 // 时钟分频因子 ,基本定时器没有,不用管
    	 //TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    
    	 // 计数器计数模式,基本定时器只能向上计数,没有计数模式的设置
    	 //TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
    
    	 // 重复计数器的值,基本定时器没有,不用管
    	 //TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
    
    	 // 初始化定时器
    	 TIM_TimeBaseInit(BASIC_TIM, &TIM_TimeBaseStructure);
    
    	 // 清除计数器中断标志位
    	 TIM_ClearFlag(BASIC_TIM, TIM_FLAG_Update);
    
    	 // 开启计数器中断
    	 TIM_ITConfig(BASIC_TIM, TIM_IT_Update, ENABLE);
    
    	 // 使能计数器
    	 TIM_Cmd(BASIC_TIM, ENABLE);
    
    	 // 暂时关闭定时器的时钟,等待使用
    	 BASIC_TIM_APBxClock_FUN(BASIC_TIM_CLK, DISABLE);
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    中断优先级配置

    void BASIC_TIM_NVIC_Config(void)
    {
    NVIC_InitTypeDef NVIC_InitStructure;
    // 设置中断组为 0
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    // 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannel = BASIC_TIM_IRQ ;
    // 设置主优先级为 0
     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
     // 设置抢占优先级为 3
     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
     NVIC_Init(&NVIC_InitStructure);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    【重识云原生】第六章容器6.1.10节——DockerFile解析
    数据持久化技术——MP
    【Seata源码学习 】篇四 TM事务管理器是如何开启全局事务
    软件加密系统Themida应用程序保护指南(十):高级选项
    Qt5开发及实例V2.0-第十六章-Qt汽车销售管理系统实例
    Kubernetes-23:详解如何将CPU Manager做到游刃有余
    linux驱动下半部之tasklet
    swift指针&内存管理-闭包的循环引用
    软件成本评估的6个步骤
    java计算机毕业设计-食材采购平台-源码+数据库+系统+lw文档+mybatis+运行部署
  • 原文地址:https://blog.csdn.net/apythonlearner/article/details/132829820