zoukankan      html  css  js  c++  java
  • 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_IRQHandler
    
    void 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_TimeBaseStructure.TIM_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   清除中断标志位

     

            

            

  • 相关阅读:
    centos通过yum安装php
    CentOS6 用yum安装mysql详解,简单实用
    启用CentOS6.5 64位安装时自带的MySQL数据库服务器
    Python三方库:Pandas(数据分析)
    Python三方库:Numpy(数组处理)
    Java笔记:反射,注解
    Java笔记:多线程
    Java笔记:IO流
    Java笔记:集合
    Java笔记:数组,异常,泛型
  • 原文地址:https://www.cnblogs.com/xwtstudio/p/12482647.html
Copyright © 2011-2022 走看看