STM32 第20讲 通用定时器(简介/框图/时钟源)

2023-05-16

通用定时器

  • 简介
  • 定时器框图
  • 时钟源
    • 计数器时钟源寄存器设置方法
    • 内部时钟(CK_INT)
    • 外部时钟模式1(TI1\TI2)
    • 外部时钟模式2(ETR)
    • 内部触发输入(ITRx)
  • 基本定时器中断实验

简介

对于STM32F407有10个通用定时器,TIM2 ~ TIM5 和 TIM9 ~ TIM14。
主要特性:

  1. 16位递增、递减、中心对齐计数器(计数值:0~65535)
  2. 16位预分频器(分频系数:1~65536)
  3. 可用于触发DAC、ADC
  4. 在更新事件、触发事件、输入捕获、输出比较时,会产生中断/DMA请求
  5. 4个独立通道,可用于:输入捕获、输出比较、输出PWM、单脉冲模式
  6. 使用外部信号控制定时器且可实现多个定时器互连的同步电路
  7. 支持编码器和霍尔传感器电路等

定时器框图

在这里插入图片描述

  1. 时钟源
    通用定时器有4种时钟源
    ①内部时钟(CK_INT)
    ②外部时钟模式1:外部输入引脚(TIx),x=1,2(即只能来自于通道 1 或者通道 2)
    ③外部时钟模式2:外部触发输入(ETR)
    ④内部触发时钟:使用一个定时器作为另一定时器的预分频器
  2. 控制器
    控制器包括:从模式控制器、编码器接口和触发控制器(TRGO)。从模式控制器可以控制计数器复位、启动、递增/递减、计数。编码器接口针对编码器计数。触发控制器用来提供触发信号给别的外设,比如为其它定时器提供时钟或者为 DAC/ADC 的触发转换提供信号。
  3. 时基单元
    时基单元包括:计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动重载寄存器(TIMx_ARR)。这部分内容和基本定时器基本一样的。
    不同点是:通用定时器的计数模式有三种:递增计数模式、递减计数模式和中心对齐模式
  4. 输入捕获
    一般应用是要和第⑤部分一起完成测量功能。
    TIMx_CH1~ TIMx_CH4 表示定时器的 4 个通道,这 4 个通道都是可以独立工作的。IO 端口通过复用功能与这些通道相连。配置好 IO 端口的复用功能后,将需要测量的信号输入到相应的IO 端口,输入捕获部分可以对输入的信号的上升沿,下降沿或者双边沿进行捕获,常见的测量有:测量输入信号的脉冲宽度、测量 PWM 输入信号的频率和占空比等。
  5. 输入捕获和输出比较公用部分
    该部分需要结合第④部分或者第⑥部分共同完成相应功能。
  6. 输出比较
    一般应用是要和第⑤部分一起完成定时器输出功能。
    TIMx_CH1~ TIMx_CH4 表示定时器的 4 个通道,这 4 个通道都是可以独立工作的。IO 端口通过复用功能与这些通道相连。

时钟源

计数器时钟源寄存器设置方法

在这里插入图片描述

内部时钟(CK_INT)

STM32F4 系列的定时器 TIM2/TIM3/TIM4/TIM5/ TIM6/TIM7/ TIM12/ TIM13/ TIM14 都是挂载在 APB1 总线上,当预分频系数≥2时,时钟频率为84Mhz,APB2 总线上挂载的通用定时器 TIM9/TIM10/TIM11,以及高级定时器 TIM1 和 TIM8,同理一般为168Mhz。

外部时钟模式1(TI1\TI2)

在这里插入图片描述
TI1F_ED 表示来自于 CH1,并且没有经过边沿检测器过滤的信号,所以它是 CH1 的双边沿信号,即上升沿或者下降沿都是有效的。TI1FP1 表示来自 CH1 并经过边沿检测器后的信号,可以是上升沿或者下降沿。TI2FP2 表示来自 CH2 并经过边沿检测器后的信号,可以是上升沿或者下降沿。

外部时钟模式2(ETR)

在这里插入图片描述
定时器时钟信号首先从 ETR 引脚进来。
接着经过外部触发极性选择器,由 ETP 位来设置上升沿有效还是下降沿有效,选择下降沿有效的话,信号会经过反相器。
然后经过外部触发预分频器,由 ETPS[1:0]位来设置预分频系数,系数范围:1、2、4、8。
紧接着经过滤波器器,由 ETF[3:0]位来设置滤波方式,也可以设置不使用滤波器。fDTS 由TIMx_CR1 寄存器的 CKD 位设置。

内部触发输入(ITRx)

在这里插入图片描述
内部触发输入是使用一个定时器作为另一个定时器的预分频器,即实现定时器的级联。上图中表示的是TIM1作为TIM2的预分频器。
需要完成以下配置:

  1. TIM1_CR2 寄存器的 MMS[2:0]位设置为 010,即 TIM1 的主模式选择为更新(选择更新事件作为触发输出 (TRGO))。
  2. TIM2_SMCR 寄存器的 TS[2:0]位设置为 000,即使用 ITR1 作为内部触发。TS[2:0]位用于配置触发选择,除了 ITR1,还有其他的选择。
  3. TIM2_SMCR 寄存器的 SMS[2:0]位设置为 111,即从模式控制器选择外部时钟模式 1。
  4. TIM1 和 TIM2 的 CEN 位都要置 1,即启动计数器。
    在这里插入图片描述

基本定时器中断实验

实验采用通用计时器TIM3,LE0红灯200ms翻转表示程序正在进行,定时器中断中500ms翻转一次。

  • gtim.h
#define GTIM_TIMX_INT                       TIM3
#define GTIM_TIMX_INT_IRQn                  TIM3_IRQn
#define GTIM_TIMX_INT_IRQHandler            TIM3_IRQHandler
#define GTIM_TIMX_INT_CLK_ENABLE()          do{ __HAL_RCC_TIM3_CLK_ENABLE(); }while(0)  /* TIM3 时钟使能 */

/****************************************************************************************************/

void gtim_timx_int_init(uint16_t arr, uint16_t psc);        /* 通用定时器 定时中断初始化函数 */
  • gtim.c
/* 定时器配置句柄 定义 */
TIM_HandleTypeDef g_timx_handle; /* 定时器x句柄 */

/**
 * @brief       通用定时器TIMX定时中断初始化函数
 * @note
 *              通用定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候
 *              通用定时器的时钟为APB1时钟的2倍, 而APB1为42M, 所以定时器时钟 = 84Mhz
 *              定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.
 *              Ft=定时器工作频率,单位:Mhz
 *
 * @param       arr: 自动重装值
 * @param       psc: 预分频系数
 * @retval      无
 */
void gtim_timx_int_init(uint16_t arr, uint16_t psc)
{
    GTIM_TIMX_INT_CLK_ENABLE();                             /* 使能TIMx时钟 */

    g_timx_handle.Instance = GTIM_TIMX_INT;                 /* 通用定时器x */
    g_timx_handle.Init.Prescaler = psc;                     /* 预分频系数 */
    g_timx_handle.Init.CounterMode = TIM_COUNTERMODE_UP;    /* 递增计数模式 */
    g_timx_handle.Init.Period = arr;                        /* 自动装载值 */
    HAL_TIM_Base_Init(&g_timx_handle);
    
    HAL_NVIC_SetPriority(GTIM_TIMX_INT_IRQn, 1, 3);         /* 设置中断优先级,抢占优先级1,子优先级3 */
    HAL_NVIC_EnableIRQ(GTIM_TIMX_INT_IRQn);                 /* 开启ITMx中断 */

    HAL_TIM_Base_Start_IT(&g_timx_handle);                  /* 使能定时器x和定时器x更新中断 */
}

/**
 * @brief       定时器中断服务函数
 * @param       无
 * @retval      无
 */
void GTIM_TIMX_INT_IRQHandler(void)
{
    /* 以下代码没有使用定时器HAL库共用处理函数来处理,而是直接通过判断中断标志位的方式 */
    if(__HAL_TIM_GET_FLAG(&g_timx_handle, TIM_FLAG_UPDATE) != RESET)
    {
        LED1_TOGGLE();
        __HAL_TIM_CLEAR_IT(&g_timx_handle, TIM_IT_UPDATE);  /* 清除定时器溢出中断标志位 */
    }
}

  • main.c
int main(void)
{    
    HAL_Init();                             /* 初始化HAL库 */
    sys_stm32_clock_init(336, 8, 2, 7);     /* 设置时钟,168Mhz */
    delay_init(168);                        /* 延时初始化 */
    usart_init(115200);                     /* 串口初始化为115200 */
    led_init();                             /* 初始化LED */
    gtim_timx_int_init(5000 - 1, 8400 - 1); /* 84 000 000 / 84 00 = 10 000 10Khz的计数频率,计数5K次为500ms */
    
    while(1)
    {
        LED0_TOGGLE();                      /* LED0(红灯) 翻转 */
        delay_ms(200);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 第20讲 通用定时器(简介/框图/时钟源) 的相关文章

  • 串口通信printf函数重定向

    串口通信printf函数重定向 printf函数重定向在51单片机的串口通讯也使用过 xff0c 但51重写的时putchar函数 xff0c 这次STM32重写的是fputc函数和fgetc函数 xff0c 至于为什么51和STM32重写

随机推荐

  • GPS NMEA数据包解析

    GPS NMEA数据包解析 NMEA 0183是美国国家海洋电子协会为海用电子设备制定的标准格式 它包含了定位时间 xff0c 纬度 xff0c 经度 xff0c 高度 xff0c 定位所用的卫星数 xff0c DOP值 xff0c 差分状
  • CAN通信

    CAN的通信速率按照电调的手册要求的1Mbps配置 xff0c 71 42854142857473ns xff08 9 43 4 43 1 xff09 61 1000ns 61 1us 61 1Mbps CAN总线的一个数据帧中所需要传输的
  • 网络传输:linux下的网络请求和下载(ping wget curl)、端口

    一 下载和网络请求 1 ping命令 可以通过ping命令 xff0c 检查指定的网络服务器是否可连通状态 语法 xff1a ping c num ip或主机名 选项 xff1a c 检查的次数 xff0c 若不使用 c xff0c 将无限
  • python的 ping 网络状态监测方法(含多IP)

    ping 基本概念 ping xff08 Packet Internet Groper xff09 是一种因特网包探索器 xff0c 用于测试网络连接量的程序 Ping是工作在 TCP IP网络体系结构中应用层的一个服务命令 xff0c 主
  • MS5611气压传感器中文资料

    MS5611是新一代高分辨率气压传感器 xff0c 分辨率可达10cm 其内置24位AD转换器 xff0c 支持IIC和SPI通讯协议 xff0c 传输速率可达20MHz 其转换时间可以设置 测量 工作范围 xff1a 10 1200mba
  • STM32学习——串口数据收发

    STM32学习 串口数据收发 61 61 STM32的串口通信 61 61 61 61 HAL库中串口发送的重要函数 61 61 61 61 STM32定时器实训 61 61 STM32的串口通信 异步串行通信 xff1a 通信双方在没有同
  • 赛目科技2023校园招聘火热进行中!(算法/开发等多个岗位)

    点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自动驾驶之心 求职交流 技术交流群 一 赛目概况 我们是专注于仿真技术自主创新的技术驱动型公司 xff0c 主要从事 ICV 仿真测 试
  • 多模态运动数据采集系统

    为给研究人员提供更多有效的多模态同步数据集 xff0c 合肥工业大学的程景铭团队设计了一个多模态运动数据采集系统 xff0c 采集了包含全身运动多模态数据集 xff0c 并利用已有算法对数据集进行了评估测试 多模态运动数据采集系统 多模态运
  • 【STM32】 STM32 F4 串口通讯

    概念 串口 xff0c 即串行接口 xff0c 是一种可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去 xff0c 同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件 串口通信 xff08 Serial Commu
  • 【安装】安装ros机器人系统和无人机环境配置常见问题总结

    安装ros机器人系统和无人机环境配置常见问题总结 一 安装ROS二 无人机环境配置更多安装 Ubuntu16 04安装ros xff1a http wiki ros org cn kinetic Installation Ubuntu Ub
  • ubuntu18.04搭建python环境

    注意 xff1a 我使用的是虚拟机 xff0c 在操作前请确保虚拟机可以访问到网络 1 安装python3 9 0解释器 xff0c 配置环境变量 2 配置虚拟环境 一 安装python3 9 0 到 opt python39 更新软件源
  • vscode生成的exe文件出现中文乱码的问题

    问题描述 vscode生成的exe文件出现中文乱码的问题 解决方案 xff1a 头文件处添加 xff1a span class token macro property span class token directive hash spa
  • c++进行函数重载时报错:此运算符函数的参数太多C/C++(344)

    问题描述 c 43 43 进行函数重载时报错 xff1a 此运算符函数的参数太多C C 43 43 344 原因分析 xff1a C 43 43 中类内运算符重载时只能有且仅有一个参数 解决方案 xff1a 方案一 xff1a 将重载函数作
  • c++中加入随机种子的方法

    c 43 43 中加入随机种子的方法 提示 xff1a c 43 43 中加入随机种子的方法 解决方案 xff1a span class token macro property span class token directive has
  • STM32 第5讲 MDK下载安装注册及配置

    目录 MDK下载安装注册MDK简介MDK下载MDK安装器件支持包安装注册鸡 MDK配置 MDK下载安装注册 MDK简介 MDK不同版本对比 MDK下载 MDK安装使用 61 MDK软件安装 43 器件支持包安装 MDK软件下载 xff1a
  • STM32 第7讲 STM32F407系列系统架构及映射

    Cortex M内核 amp 芯片 F407系统架构 注 xff1a 64KB CCM 内核耦合存储器 数据 RAM不属于总线矩阵 xff0c 只能存数据 xff0c 不支持DMA xff0c 但访问速度快 总线矩阵 xff1a 总线矩阵用
  • 稳了!理想汽车一季报亮眼,禾赛或成大赢家

    作者 Alan 编辑 激光雷达老炮儿 点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 5月10日 xff0c 理想汽车公布2023年第一季度财报 xff0c 季度营收和交付量双双创下历史新高 第
  • STM32 第9讲 STM32CubeMX简介安装和简单使用

    文章目录 STM32CubeMX安装安装JAVA环境安装STM32CubeMX下载关联STM32Cube固件包 新建工程芯片选型配置时钟源时钟树配置GPIO引脚配置Debug选项配置生成工程编写逻辑代码 STM32CubeMX安装 STM3
  • STM32 第11讲 正点原子SYSTEM文件夹介绍及使用(sys/delay/usart)

    文章目录 sys文件夹delay文件夹函数简介Systick定时器工作原理寄存器函数介绍 usart文件夹printf函数输出流程printf函数的使用printf函数支持微库法代码法 SYSTEM 文件夹里面的代码由正点原子提供 xff0
  • STM32 第20讲 通用定时器(简介/框图/时钟源)

    通用定时器 简介定时器框图时钟源计数器时钟源寄存器设置方法内部时钟 CK INT 外部时钟模式1 xff08 TI1 TI2 xff09 外部时钟模式2 xff08 ETR xff09 内部触发输入 xff08 ITRx xff09 基本定