• 【STM32学习(4)】STM32简述定时器


    一、什么是定时器

    有计时和定时功能的仪器组件——对于芯片来说,定时器含有计时和定时功能,片内模块——TIM

    二、STM32F4xx系列定时器分类

    片内外设定时器(14个)

    • 高级定时器:TIM1、TIM8
    • 通用定时器:TIM2——TIM5 TIM9——TIM14
    • 基本定时器:TIM6、TIM7(基本的计时和定时功能)

    内核定时器(1个)

    • 系统定时器(SysTisk 滴答定时器)

    三、芯片内定时器的基本结构

    在这里插入图片描述

    四、基本定时器只有基本时基单元功能

    1、时基单元

    • 计数器寄存器(TIMx_CNT):16位(0~65535)

    在这里插入图片描述

    • 预分频寄存器(TIMx_PSC)

    在这里插入图片描述

    • 自动重载寄存器(TIMx_ARR)
      你想定时多久,全靠设置这个ARR
      你设置ARR的值是脉冲的个数单位
      怎么设置ARR要自己算:
      如:根据已知提供CNT的脉冲频率f
      已知你要定时多久t
      ARR=t/(1/f)

    2、例子
    实现定时器6 TIM6,使其定时0.5s,让LED0翻转
    ①先使能TIM6时钟
    RCC->APB1ENR
    RCC_APB1PeriphClockCmd()
    ②先配置定时器TIM6模块
    相关主要寄存器如下:
    在这里插入图片描述
    代码:
    定时器6初始化

    void TIM6_Init(void)
    {
    	TIM_TimeBaseInitTypeDef TIMInitStruct;
    	NVIC_InitTypeDef NVIC_InitStructure;//用来初始化NVIC指定中断的结构体
    	
    	
    	//1-使能时钟
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
    
    	//2-初始化TIM6时基单元  ARR  PSC
    	TIMInitStruct.TIM_Prescaler = 840-1;// 84Mhz/840 = 100Khz   10us/脉冲
    	TIMInitStruct.TIM_Period    = 50000-1;//0.5s = 500ms  = 500000us
    	TIM_TimeBaseInit(TIM6,&TIMInitStruct);
    	
    	//3-开启定时器TIm6 更新中断
    	TIM6->DIER |= 0x01;
    	//TIM_ITConfig()
    	
    	//4-将TIM6更新中断注册进NVIC
    	NVIC_InitStructure.NVIC_IRQChannel = TIM6_DAC_IRQn;//54号和 DAC共用
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    	NVIC_Init(&NVIC_InitStructure);
    	
    	//5-开启定时器6计数器
    	TIM6->CR1 |= 0x01;
    	//TIM_Cmd()
    
    }
    
    • 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

    中断服务函数

    void TIM6_DAC_IRQHandler(void)
    {
    	//因为这个TIM6中断号和中断函数和DAC共用
    	//为了区分是谁触发中断进来的,可以在中断函数判断标志位
    	//if(TIM_GetITStatus(TIM6,TIM_IT_Update);) == 1)
    	if(TIM6->SR & 0x01)
    	{
    		//如果能进来  表示上面SR第0位  更新中断标志位置位了
    		GPIO_ToggleBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);
    		
    		TIM6->SR &= ~0x01;//写0清零中断标志位
    		//TIM_ClearITPendingBit(TIM6,TIM_IT_Update);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    等保测评 —— 安全控制点
    Java面试八股文宝典:初识数据结构-数组的应用扩展之HashTable
    诊断Android系统原生代码Native崩溃问题
    SpringSecurity (六) --------- 杂项
    子组件给父组件传递数据(vue2)
    这些ChatGPT旗下的AI工具你都认识吗?
    PHP isset()和empty()区别
    SQL练习 2022/7/2
    QT:QSS自定义QFrame实例
    系统架构师2022年案例分析考前
  • 原文地址:https://blog.csdn.net/qq_43533553/article/details/128189655