Java教程

STM32——TIM定时器

本文主要是介绍STM32——TIM定时器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

STM32共有16个定时器,定时器分类:2个高级控制定时器、

                   10个通用定时器、

                    2个基本定时器、

                  2个看门狗定时器、

定时器特性:

 

 最大定时器时钟配置专用定时器:RCC_DCKCFGR   ----->>>>RCC dedicated clock configuration register

               TIMPRE位:主要用于定时器预分频选择,个人认为这称作为倍频选择更合适。TIMxCLK =  ? xPCLKx。
重装载定时器:TIMx_ARR,存储内容为要装载到实际重装载寄存器的值。

计数寄存器:TIMx_CNT,当前计数值

 

基本定时器框图:

 

 方框中的阴影部分为影子寄存器:既有两个定时器。

基本定时器主要注意:

          1、时钟源   ,RCC_DCKCFGR 控制

          2、控制器    ,

          3、计数器    , 计数器寄存器(TIMx_CNT) 、预分频器寄存器(TIMx_PSC)、自动重载寄存器(TIMx_ARR),
          4、定时器周期计算

标准库初始化结构体:

TIM_TimeBaseInitTypeDef 

TIM_TimeBaseInit

 

入门实验,使用定时器产生0.5秒的中断,使LED实现亮灭反转循环,

宏定义

复制代码

#ifndef __BSP_BASIC_TIME_H#define __BSP_BASIC_TIME_H#include "stm32f4xx.h"// 定时器源选择#define BASIC_TIM                TIM6#define BASIC_TIM_CLK        RCC_APB1Periph_TIM6//中断#define BASIC_TIM_IRQn                    TIM6_DAC_IRQn#define BASIC_TIM_IRQHandler        TIM6_DAC_IRQHandlervoid TIMx_Configuration();#endif //__BSP_BASIC_TIME_H

复制代码

 

中断配置,基本定时器模式配置

复制代码

#include "./tim/bsp_basic_time.h"/*编程要点:
初始化 RGB 灯的 GPIO
开启基本定时器时钟
设置定时器周期和预分频器
启动定时器更新中断,并开启定时器
定时器中断服务函数实现 RGB 灯的反转*/// 中断函数static void TIMx_NVIC_Configuretion()
{
        NVIC_InitTypeDef NVIC_InitStructure;        //设置中断组        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);        //设置中断来源
        NVIC_InitStructure.NVIC_IRQChannel = BASIC_TIM_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //设置抢占优先级
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
    
        NVIC_Init(&NVIC_InitStructure);
}//定时器基本模式设置static void TIM_Mode_Config(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;    // 开启 TIM_CLK ,X(6,7)    RCC_APB1PeriphClockCmd(BASIC_TIM_CLK,ENABLE);    // 累计 TIM_Period 个后产生新的中断或者更新    // 当定时器从0计数到4999,即为5000次,为一个定时周期
    TIM_TimeBaseStructure.TIM_Period = 5000-1;    // 设置定时频率 
    TIM_TimeBaseStructureTIM_Prescaler = 9000-1;    // 初始化定时器
    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);
}void TIMx_Configuration()
{
    TIMx_NVIC_Configuretion();
    TIM_Mode_Config();
}

复制代码

 

主函数调用

复制代码

int main(void)
{    /* LED 端口初始化 */
    LED_GPIO_Config();     
  
  /*初始化按键*/
  Key_GPIO_Config();
    TIMx_Configuration(); 
    /* 轮询按键状态,若按键按下则反转LED */ 
    while(1)                            
    {       
 
    }
}

复制代码

 

中断函数

复制代码

void BASIC_TIM_IRQHandler(void)
{    if( TIM_GetITStatus( BASIC_TIM, TIM_IT_Update) != RESET )
    {
        LED1_TOGGLE;
        TIM_ClearITPendingBit(BASIC_TIM , TIM_IT_Update);
    }
    
}

复制代码

 

 

 

主要引用的函数:TIM_ClearFlag  影响TIMx_SR 寄存器的 UIF 位
        TIM_ITConfig  在发生上溢时产生中断。
        TIM_ClearITPendingBit   清除中断标志位

点击查看更多内容
这篇关于STM32——TIM定时器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!