zoukankan      html  css  js  c++  java
  • stm32 定时器 通用定时器

    STM32F10xxx

    2个基本定时器(TIM6、TIM7)
    4个通用定时器(TIM2、 TIM3、 TIM4和TIM5)
    2个高级定时器(TIM1、TIM8)

    每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作

    TIMx主要功能

    16位向上、向下、向上/向下自动装载计数器
    16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意
    数值
    4个独立通道:
    ─ 输入捕获
    ─ 输出比较
    ─ PWM生成(边缘或中间对齐模式)
    ─ 单脉冲模式输出
    使用外部信号控制定时器和定时器互连的同步电路
    如下事件发生时产生中断/DMA:
    ─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
    ─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
    ─ 输入捕获
    ─ 输出比较
    支持针对定位的增量(正交)编码器和霍尔传感器电路
    触发输入作为外部时钟或者按周期的电流管理

    TIMx配置步骤

    1.使能定时器时钟
    2.初始化定时器参数,预分频器的值、自动重装载的值等设定
    3.设置定时器中断类型
    4.初始化NVIC外设,设置定时器中断优先级
    5.开启定时器
    6.编写定时器处理函数

    举例

    void TIM4_IRQHandler()
    {
        if(TIM_GetITStatus(TIM4, TIM_IT_Update) == 1)
        {
            delay_ms(10);
    
            led1 = ~led1;
        }
    
        TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
    } 
    
    typedef struct
    {
        uint16_t TIM_Prescaler; //预分频器的值
        uint16_t TIM_CounterMode; //计数模式
        uint16_t TIM_Period; //自动重装载的值 
        uint16_t TIM_ClockDivision; //时钟分频
        uint8_t TIM_RepetitionCounter; //重复计数器
    } TIM_TimeBaseInitTypeDef;   
    
    void TIM4_init(u16 per, u16 pre)
    {
        TIM_TimeBaseInitTypeDef tim = {0};
    
        NVIC_InitTypeDef nvic = 
        {
            TIM4_IRQn,
            2,
            2,
            ENABLE
        };
    
        tim.TIM_Prescaler = pre;
        tim.TIM_CounterMode = TIM_CounterMode_Up; //计数器向上计数,常用
        tim.TIM_Period = per;
        tim.TIM_ClockDivision = TIM_CKD_DIV1; //时钟1分频
    
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器时钟
    
        TIM_TimeBaseInit(TIM4, &tim); //初始化定时器参数
    
        TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); //设置定时器中断类型,发生哪种事件
    
        NVIC_Init(&nvic); //初始化NVIC
    
        TIM_ClearFlag(TIM4, TIM_IT_Update); //清中断
    
        TIM_Cmd(TIM4, ENABLE); //开启定时器
    }

    定时器定时时间计算

    Tout = ((Period)*(Prescaler+1))/Tclk; //mb == us
    500000 = (1000 * 36000)/72  //500000um
  • 相关阅读:
    js获取当前页面url网址等信息
    jQuery 复选框全选/取消全选/反选
    js获取日期实例之昨天今天和明天、后天
    mysql不重启修改参数变量
    php 读取功能分割大文件实例详解
    php批量删除数据库下指定前缀的表
    PHP遍历目录返回统计目录大小实例
    PHP二维数组如何根据某个字段排序
    PHP 如何获取二维数组中某个key的集合(高性能查找)
    jQuery 隐藏与显示 input 默认值
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709576.html
Copyright © 2011-2022 走看看