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
  • 相关阅读:
    BZOJ 3506 机械排序臂 splay
    BZOJ 2843 LCT
    BZOJ 3669 魔法森林
    BZOJ 2049 LCT
    BZOJ 3223 文艺平衡树 splay
    BZOJ 1433 假期的宿舍 二分图匹配
    BZOJ 1051 受欢迎的牛 强连通块
    BZOJ 1503 郁闷的出纳员 treap
    BZOJ 1096 ZJOI2007 仓库设计 斜率优化dp
    BZOJ 1396: 识别子串( 后缀数组 + 线段树 )
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709576.html
Copyright © 2011-2022 走看看