• 【STM32】学习笔记(TIM定时器)


    TIM(Timer)定时器

    定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断

    16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时

    不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能。

    根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型

    定时器类型

    在这里插入图片描述

    高级、通用、基本定时器

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    定时器初始化函数

    #include "stm32f10x.h"                  // Device header
    //初始化定时器
    void Timer_Init(void)
    {
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//开启时钟
    	
    	TIM_InternalClockConfig(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_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)//中断标志位
    //	{
    //		
    //		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    //	}
    //}
    
    
    
    • 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
    • 38
    • 39
    • 40
    • 41
    • 42

    主函数

    #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);
    	}
    }
    
    void TIM2_IRQHandler(void)
    {
    	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
    	{
    		Num ++;
    		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    	}
    }
    
    
    • 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

    输出比较功能(智能车、机器人等)

    OC(Output Compare)输出比较
    输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形
    每个高级定时器和通用定时器都拥有4个输出比较通道
    高级定时器的前3个通道额外拥有死区生成和互补输出的功能
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    直流电机是一种将电能转换为机械能的装置,有两个电极,当电极正接时,电机正转,当电极反接时,电机反转
    直流电机属于大功率器件,GPIO口无法直接驱动,需要配合电机驱动电路来操作
    TB6612是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速和方向
    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    动态规划 贪心算法
    前端面试题集锦(6)
    What Makes Pre-trained Language Models Better Zero-shot Learners?
    Java SE 容易忘记的点记录
    多线程下的时间处理
    事务的隔离级别与MVCC
    【OpenVINO™】在C#中使用 OpenVINO™ 部署 YOLOv10 模型实现目标
    【小沐学C++】git和github常见问题汇总
    Spring Boot:利用JPA进行数据库的查删
    vue插件的使用方法
  • 原文地址:https://blog.csdn.net/qq_25743167/article/details/132578716