STM32CubeMX----基本定时器(TIM6、TIM7)

2023-11-02

基本定时器TIM6(TIM7)的相关参数

Activated:激活TIM6,把前面的方框选中局表示激活了TIM6

One Pulse Mode:STM32F103定时器的One Pulse Mode是一种特殊的计数模式,它只产生一个脉冲输出信号,而不是周期性的信号输出。在这种模式下,计数器只进行一次计数,当计数器计数到预设的值时,就会产生一个脉冲信号,然后计数器会停止计数。这种模式通常用于需要生成单个脉冲信号的应用场景,例如PWM控制、测量脉冲宽度等。在STM32F103系列中,定时器的One Pulse Mode可以通过设置TIM_CR1寄存器中的OPM位来实现。

Counter Setting:计数设置

Prescaler(PSC -16 bits value):预分频器,简写PSC,16位,可设置的值范围是0--65535。在STM32F103中,计数器的时钟源可以是内部时钟源或外部时钟源。当使用内部时钟源时,PSC可以将时钟信号频率除以一个固定的分频系数,以降低计数器的时钟频率,从而扩大计数器的计时范围。当使用外部时钟源时,PSC还可以将外部时钟信号的频率与内部时钟源的频率进行比较,以实现更高的精度。

//例如,如果使用内部时钟源,并将PSC设置为7199,
//则定时器的时钟频率将为72 MHz / (7199 + 1) = 10 kHz。
//这意味着计数器每计数10次,就会过去1毫秒。
//如果需要更长的计时范围,可以将PSC设置为更大的值。

Counter Mode:计数模式,基本定时器TIM6只能向上计数(UP)。

Counter Period(Auto Reload Register - 16 bit value):计数周期,STM32F103定时器的Auto Reload寄存器(ARR)用于设置定时器的计数周期。当定时器的计数器达到ARR的值时,定时器会自动重新加载ARR的值并继续计数。这样可以实现定时器的周期性计数,从而实现定时和计时的功能。

//以TIM6为例,如果ARR的值为9999,则定时器的计数周期为:

//计数周期 = ARR + 1 = 10000

//当定时器的计数器计数到9999时,定时器会自动重新加载ARR的值为999,并继续计数。
//这样就可以实现定时器的周期性计数,从而实现定时的功能。

//需要注意的是,ARR的值不能超过定时器的计数器的最大值(例如对于16位定时器,最大值为65535),
//否则会发生溢出。
//在实际应用中,需要根据具体的需求和系统时钟频率来选择合适的ARR的值,以实现所需的定时功能。

Auto-Reload Preload:自动重载预装载。STM32F103定时器的Auto Reload Preload(自动重载预装载)功能是用来控制定时器计数器的自动重装载和预装载的。它的作用是实现定时器计数器的精确控制和定时器溢出中断的触发。

Auto Reload Preload功能可以通过TIMx_CR1寄存器的ARPE位来开启或关闭。当该功能开启时,定时器会在计数器计满或达到比较值时自动装载计数器的初始值,从而实现计数器的自动重装载。同时,它还会预装载ARR寄存器的值,以确保在计数器重新装载之前,ARR的值已经被正确加载。

Auto Reload Preload功能的主要作用有两个:

  1. 精确控制定时器的计数范围:通过自动重装载功能,定时器可以在达到计数范围的上限时自动重新开始计数,从而实现更长的计时范围和更高的精度。

  2. 触发定时器溢出中断:当定时器计数器达到比较值或自动重装载时,定时器会触发溢出中断。通过预装载ARR寄存器的值,可以确保在溢出中断触发之前,ARR的值已经被正确加载,从而保证定时器溢出中断的精确性。

总之,STM32F103定时器的Auto Reload Preload功能可以实现定时器计数器的自动重载和预装载,从而实现更长的计时范围和更高的精度,并保证定时器溢出中断的精确性。

Trigger Output(TRGO)Parameter:

STM32F103定时器的Trigger Output功能可以用于同步多个定时器、DAC、ADC等外设的启动和停止。当一个定时器的计数器计数到预设值时,就会产生一个触发输出,可以将该输出信号连接到其他定时器或外设的启动输入端,以实现多个定时器或外设同步工作。

另外,Trigger Output还可以用于生成PWM信号。将定时器的输出比较模式设置为PWM模式,再将Trigger Output连接到PWM输出通道的更新触发输入端,就可以实现PWM信号的输出。这种方式可以在不占用CPU资源的情况下,生成高精度的PWM信号,广泛应用于电机控制、LED控制等领域。

Trigger event selection:触发事件选择

上图的三个备选项分别对应下面的配置

sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

它指定了当定时器计数器达到自动重装载值时,输出触发信号将被置为低电平。

 sMasterConfig.MasterOutputTrigger = TIM_TRGO_ENABLE;

它指定了当计数器达到定时器的重载值时,输出触发信号将被触发。这种配置可以用于实现定时中断、嵌套定时器、时间戳等应用。


sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;

它指定了当定时器计数器更新时,输出触发信号将被触发。这种配置可以用于控制PWM输出、测量脉冲宽度、生成周期性触发信号等应用。

回过头来看看STM32F103单片机定时器的工作原理

STM32F103单片机的基本定时器是一个16位定时器,它可以产生定时中断,并且可以通过软件或硬件触发。其工作原理如下:

  1. 在定时器初始化时,需要设置定时器的时钟源和计数模式。时钟源可以选择内部时钟或外部时钟,计数模式只能向上计数。

  2. 定时器开始工作后,计数器会不断累加,直到计数器的值与预设的计数值相等。

  3. 当计数器的值与预设的计数值相等时,定时器会产生一个中断请求,并且将计数器的值清零,重新开始计数。

  4. 在中断服务程序中,可以进行需要定时的操作,例如控制外设的开关、采集数据等等。

STM32F103单片机基本定时器(TIM)是一种基于计数器的定时器,其工作原理是通过计数器对定时时间进行计数,当计数器计数到设定值时,产生中断或触发其他事件。

基本定时器有以下相关寄存器:

  1. TIMx_CR1寄存器:定时器控制寄存器1,用于配置定时器工作模式、计数模式、时钟分频等。

  2. TIMx_PSC寄存器:预分频器寄存器,用于设置定时器时钟的预分频值,即将主时钟分频后作为定时器时钟。

  3. TIMx_ARR寄存器:自动重载寄存器,用于设置计数器的上限值,当计数器计数到该值时,自动将计数器清零并产生中断或触发其他事件。

  4. TIMx_CNT寄存器:计数器寄存器,用于存储当前的计数值。

  5. TIMx_SR寄存器:状态寄存器,用于标记定时器事件的状态,如计数器溢出、比较匹配等。

通过对这些寄存器的配置和操作,可以实现基本定时器的各种功能。

基本定时器的功能----精确的延时

1、设置定时器的自动重载值;

2、设置定时器的计数值为0,从0 开始计数

3、开启定时器开始计数

4、读定时器的计数值,并判断计数值是否达到目标值;

5、到达目标值就关闭定时器

void Delay_us(uint16_t t)
{
  uint16_t counter = 0;
  
  __HAL_TIM_SET_AUTORELOAD(&htim6, t); //设置自动重载值
  
  __HAL_TIM_SET_COUNTER(&htim6,0);//设置计数器的值为0,从0开始计数
  __HAL_TIM_ENABLE(&htim6); //使能TIM6
  
  while(counter != t)
  {
    counter = __HAL_TIM_GET_COUNTER(&htim6);//一直读计数器的值,直到计数器的值到达自动重载值
  }
  __HAL_TIM_DISABLE(&htim6);//关闭TIM6
  
}

void Delay_ms(uint16_t t)
{
  uint16_t i;
  for(i=0;i<1000;i++)
  {
    Delay_us(t);
  }
}

定时器的参数设置

TIM_HandleTypeDef htim6;


void MX_TIM6_Init(void)
{

  TIM_MasterConfigTypeDef sMasterConfig = {0};
  htim6.Instance = TIM6;
  htim6.Init.Prescaler = 72-1; //72MHz的时钟经过72分频之后就是1MHz,走一步就是1us
  htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  //htim6.Init.Period = 1000-1; //这个周期值就不用设置了,因为在延时函数里面设置了
  htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

}

基本定时器的功能----定时做某件事

这就用到定时器的溢出中断了,定时时间到了,在定时器中断回调函数中做某件事;

1、定时器的配置

        

void MX_TIM6_Init(void)
{
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  htim6.Instance = TIM6;
  htim6.Init.Prescaler = 72-1;
  htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim6.Init.Period = 1000-1;
  htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM6)
  {
    __HAL_RCC_TIM6_CLK_ENABLE();

    /* 配置定时器中断*/
    HAL_NVIC_SetPriority(TIM6_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(TIM6_IRQn);
  }
}

void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM6)
  {
    __HAL_RCC_TIM6_CLK_DISABLE();

    HAL_NVIC_DisableIRQ(TIM6_IRQn);
  }
}

2、开启定时器中断

在main函数中调用开始定时器中断函数

int main(void)
{

  HAL_Init();
  SystemClock_Config();

  MX_GPIO_Init();
  MX_TIM6_Init();

  HAL_TIM_Base_Start_IT(&htim6); //开启定时器中断

  while (1)
  {

  }

}

3、回调函数中进行中断处理

void TIM6_IRQHandler(void)
{
  HAL_TIM_IRQHandler(&htim6);
}


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  cnt++;
  //因为定时器设置的分频系数是72,计数周期是1000,所以每次1ms就中断,1000次就是1s钟
  if(cnt == 1000) 
  {
    cnt = 0;
    HAL_GPIO_TogglePin(LED_R_GPIO_Port,LED_R_Pin);
  }
}

基本定时器的功能----触发ADC工作

 可以参考下面的博文,定时器触发ADC模数转换

STM32学习----ADC模数转换(轮询、中断、定时器、DMA)_资深流水灯工程师的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32CubeMX----基本定时器(TIM6、TIM7) 的相关文章

  • 建立 PyQt6 窗口

    建立 PyQt6 窗口 这篇教学会介绍如何开始使用 PyQt6 建立基本的应用程序窗口 以及通过常用的窗口参数 进行窗口的相关设定 快速导航 建立 PyQt6 窗口 调整窗口样式 在窗口中放入其他组件 建立 PyQt6 窗口 PyQt6 创
  • ASP.NETCore WebApp + EFCore +Docker +MSSQL(Docker for Window)

    文章目录 一 本机环境 二 创建ASP NET Core WebApp 创建项目 添加模型 搭建基架 使用CoreFirst方式初始数据库架构 三 MSSQL Docker 拉取MSSQL Docker镜像 启动容器 环境要求 参数解析 连
  • socket failed: EPERM (Operation not permitted) 解决方法

    1 网络权限没有开启 2 不支持http 在AndroidManifest xml 中添加网络权限

随机推荐

  • 安全HCIP之IPX

    IPX Internetwork Packet Exchange protocol 互联网分组交换协议 IPX 是指互联网分组交换协议 提供分组寻址和选择路由的功能 保证可靠到达 相当于数据报的功能 SPX 是顺序报文分组交换协议 它可保证
  • C/C++ 代码编译过程【复习】

    C C 代码编译过程 很久很久没用过 C C 突然碰到编译过程 竟有些想不起来 这里复习一下 C 语言的编译链接过程要把我们编写的一个 C 程序 源代码 转换成可以在硬件上运行的程序 可执行代码 如汇编语言 机器语言 分两个部分 编译和链接
  • LLM系列

    简介 小伙伴们好 我是 小窗幽记机器学习 的小编 卖热干面的小女孩 紧接前文 万字长文细说ChatGPT的前世今生 后续会尝试以理论 实践的方式逐步对主流的各大LLM进行实测和汉化 今天这篇关于Llama2的小作文其实比较长 所以分为上下两
  • Python爬虫实战(3)-爬取豆瓣音乐Top250数据(超详细)

    前言 首先我们先来回忆一下上两篇爬虫实战文章 第一篇 讲到了requests和bs4和一些网页基本操作 Python爬虫实战 1 爬取 房天下 租房信息 超详细 第二篇 用到了正则表达式 re模块 Python爬虫实战 2 爬取小说 斗罗大
  • linux磁盘虚拟化

    1 LVM Logical Volume Manager 逻辑滚动条管理员 LVM可以将几个实体的partions 或disk 透过软件组合成为一块看起来是独立的大磁盘 VG 然后将这块大磁盘再经过分割成为可使用分隔槽 LV 最终就能够挂载
  • 【SQL注入-可回显】报错注入:简介、相关函数、利用方法

    目录 一 定义 1 1 简介 1 2 利用 1 3 利用过程 1 4示例 注 二 相关函数 2 1 最常用的三种是 2 2 Xpath语法错误 extractvalue updatexml 2 3 数据溢出 exp 2 4 主键重复 原理
  • php 大转盘抽奖概率 角度,在线抽奖大转盘和概率计算

    html gt 抽奖效果演示 rotary position relative width 854px height 504px margin 0 auto background d71f2e url p w picpaths bg1 pn
  • 3D游戏编程设计作业九

    P D 过河游戏智能帮助实现 程序具体要求 实现状态图的自动生成 讲解图数据在程序中的表示方法 利用算法实现下一步的计算 状态图分析 此次作业的代码基于第三次作业 牧师与魔鬼的动作分离版代码进行改进 加入了智能提示功能 实现效果图如下 要实
  • Android ImageView视图的七种图片缩放类型

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 前言 ImageView默认图片居中显示 默认图片的缩放类型为 scaleType属性为 fitCenter 一 scaleType属性
  • 【严重】vm2 <3.9.18 沙箱逃逸漏洞(存在POC)

    漏洞描述 vm2 是一个基于 Node js 的沙箱环境 可以使用列入白名单的 Node 内置模块运行不受信任的代码 代理对象用于拦截并重定义宿主对象的各种操作 vm2 3 9 18之前版本中 由于 prepareStackTrace 函数
  • 【转】OSI TCP/IP 浅析

    OSI是Open System Interconnect的缩写 意为开放式系统互联 国际标准组织 国际标准化组织 制定了OSI模型 这个模型把网络通信的工作分为7层 分别是物理层 数据链路层 网络层 传输层 会话层 表示层 应用层 一 网络
  • unity控制物体显示和隐藏的方法总结

    首先是物体的获取 代码如下 GameObject Find SampleAnchorMe 找到并返回一个名字为SampleAnchorMe的游戏物体 不能用于inactive的物体即隐藏的物体无法用find发现 GameObject Fin
  • 4:eMMC command

    1 前言 本文主要对eMMC的command进行详细介绍 主要包含如下内容 1 command类型 2 command格式 2 command类型 command类型 说明 bc 不带response的广播命令 bcr 带有response
  • 华为机试C语言-最长方连续方波信号

    题目描述 https zhuanlan zhihu com p 546563566 代码分层有利于代码调试 include
  • Okhttp设置公共参数,以json对象放入@Body请求公共参数的配置方式

    当网络请求都是基于一个URL 所有的接口都是同一个地址 而请求不同接口数据则是通过command字段进行配置 然后所有的请求参数都是需要自己写一个bean类 再转成json格式放入请求body里发给后台 而不是通过表单form body发送
  • MySQL之MVCC

    事务隔离级别 对于一个MySQL服务 可以有多个客户端与其建立连接 并向其发送SQL语句 一条SQL语句可能是一个事务的一部分 MySQL可以同时处理客户端的多个事务 一次事务对应着一次完成的状态转换 事务执行完毕后 需要保证数据符合客观逻
  • 622. 设计循环队列

    622 设计循环队列 Java实现循环队列设计 题目描述 设计你的循环队列实现 循环队列是一种线性数据结构 其操作表现基于 FIFO 先进先出 原则并且队尾被连接在队首之后以形成一个循环 它也被称为 环形缓冲器 循环队列的一个好处是我们可以
  • 比MyBatis Generator更强大的代码生成器

    本文为 从零打造项目 系列第一篇文章 首发于个人网站 从零打造项目 系列文章 比MyBatis Generator更强大的代码生成器 SpringBoot项目基础设施搭建 前言 工欲善其事 必先利其器 作为 从零打造项目 系列的第一篇文章
  • 服务器被放入后门文件,服务器被***了怎么办 rkhunter的简单安装及检测后门

    被 了 查看了下 var log messages和last都已经清理 sshd spawn bin echo c d mail s 标题 邮箱地址 邮件来报警 一 接着查看 host allow里面设置 禁止某个可疑ip的访问 二 用rk
  • STM32CubeMX----基本定时器(TIM6、TIM7)

    基本定时器TIM6 TIM7 的相关参数 Activated 激活TIM6 把前面的方框选中局表示激活了TIM6 One Pulse Mode STM32F103定时器的One Pulse Mode是一种特殊的计数模式 它只产生一个脉冲输出