【工具使用】STM32CubeMX-基础定时器配置

news2024/11/27 0:25:10

一、概述

    无论是新手还是大佬,基于STM32单片机的开发,使用STM32CubeMX都是可以极大提升开发效率的,并且其界面化的开发,也大大降低了新手对STM32单片机的开发门槛。
    本文主要讲述STM32芯片的定时器的配置及其相关知识。

二、软件说明

    STM32CubeMX是ST官方出的一款针对ST的MCU/MPU跨平台的图形化工具,支持在Linux、MacOS、Window系统下开发,其对接的底层接口是HAL库,另外习惯于寄存器开发的同学们,也可以使用LL库。STM32CubeMX除了集成MCU/MPU的硬件抽象层,另外还集成了像RTOS,文件系统,USB,网络,显示,嵌入式AI等中间件,这样开发者就能够很轻松的完成MCU/MPU的底层驱动的配置,留出更多精力开发上层功能逻辑,能够更进一步提高了嵌入式开发效率。
    演示版本 6.7.0

三、定时器简介

    定时器,顾名思义,就是定时的功能,定时器在单片机中算是除GPIO外最基本的外设。在ST中,定时器分为几种,基础定时器,通用定时器,高级定时器和低功耗定时器。本文重点在于基础定时器的配置,其他类型的定时器在其他篇章中详细说明。
    基础定时器,就是只提供最基础的定时功能,下面我们就从ST这个基础定时器框图来讲解一下定时器原理。
在这里插入图片描述
    以定时1s为例,如果当前输入的时钟频率为1MHz,那怎么样才能得到1s的间隔呢?众所周知,1MHz,本身的含义就是每秒1000000次的频次,那么很容易就能想到,如果让定时器每个时钟周期计一个数,计到1000000次的时候就是1s的时间。于是第一个参数就出现了——自动重装载值(Auto Reload Value),这个参数的作用就是:当计数达到自动重装载值时,可以触发一个溢出中断标志,用户获取这个溢出中断标志就可以得到1s的时间。
    然而现实并没这么理想,这个自动重装载值只有16位,定时器的计数值也只有16位,也就是说计数最大只能到65535,根本到不了1000000,那应该怎么办呢?想一下,既然计数没办法达到这么大的数,那是不是可以让计数不要计那么快,比如让定时器以1kHz的频率计数,那只要计1000次就可以得到1s的时间。但定时器的输入是1MHz,怎么样才能让它变慢呢?这时候另一个参数就派上用场了——预分频系数(Prescaler Value)。1MHz进行2分频,就是500kHz,进行1000分频,就是1kHz。

四、定时器配置

    看完原理,这里我们就来看下具体的功能实现,就以上面的定时1s钟为例,在CubeMX中应该如何设置。

  • 基本配置

    首先看下配置界面,因为这里我们只需要一个定时知会的功能,并不需要使用到外部端口,所以我们可以直接在选项卡"Timers"中选择"TIM6"(TIM6就是基础定时器),勾选"Activated"启用定时器。
在这里插入图片描述
    接下来看下基本的一些配置信息。
在这里插入图片描述
单脉冲模式(One Pulse Mode): 开启这个模式后,只要触发了一次溢出标志,就会自动把计数使能关掉,想再次触发需要手动开启计数使能。所以如果想要实现周期触发事件,就不用勾选这个选项。
预分频系数(Prescaler): 新手杀手之一,虽然这里写的是预分频系数,但实际设置的值是预分频系数-1,也就是需要10分频时,需要设置9。
计数模式(Counter Mode): 计数模式,也称计数方向,决定定时器是递增计数还是递减计数。如果只是用来定时,那递增或递减都没什么影响。
计数周期(Counter Period): 就是当计数值达到计数周期值时,会触发一个溢出标志,新手杀手之二,因为计数是从0开始计的,所以如果想要实现10次计数,这里只需要设置9即可。
自动重装载(auto-reload preload): 如果选择了自动重装载,那么在触发了一次溢出标志后,定时器会自动将计数清0并重新计数。
触发事件选择(Trigger Event Selection): 可以选择通过UG标志、计数使能、溢出标志来触发输出,这个一般用不上。

    为了实现1s的计时,我们得先知道当前定时器的时钟频率。先查看下时钟树,TIM6是挂在APB时钟总线上的,这里我们按单片机最高主频设置的,是48MHz。
在这里插入图片描述
    为了方便计算,这里我们预分频系数可以填47999,也就是48000分频。计数周期就可以填999,也就是计数1000次。另外再使能自动重装载,这样就可以得到一个1s的周期计数。
在这里插入图片描述
    为了让计数周期到时可以立即知会到我们去执行一些操作,这里还需要打开中断服务函数。在"NVIC Setting"选项卡中,勾选"TIM6"的中断使能。
在这里插入图片描述
    做完以上配置,选择好使用的库就可以生成工程代码了。

  • LL库代码实现

    在生成的工程中添加如下代码,在触发中断时,对一个bool变量进行翻转。

/***************************main.c******************************/
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM6_Init();
  /* USER CODE BEGIN 2 */
  
  /* 使能更新中断 */
  LL_TIM_EnableIT_UPDATE(TIM6);
  /* 使能计数 */
  LL_TIM_EnableCounter(TIM6);
  
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
/***********************************************************************/

/***************************stm32f0xx_it.c******************************/
void TIM6_DAC_IRQHandler(void)
{
  /* USER CODE BEGIN TIM6_DAC_IRQn 0 */
  /* 进中断后判断如果使能了更新中断,且更新中断标志为1,则翻转数据,并清除标志 */
  if (   (LL_TIM_IsActiveFlag_UPDATE(TIM6))
      && (LL_TIM_IsEnabledIT_UPDATE(TIM6))
	   )
  {
      LL_TIM_ClearFlag_UPDATE(TIM6);
      TestTimer = (++TestTimer) % 2;
  }
  /* USER CODE END TIM6_DAC_IRQn 0 */

  /* USER CODE BEGIN TIM6_DAC_IRQn 1 */

  /* USER CODE END TIM6_DAC_IRQn 1 */
}
/*******************************************************************/
  • HAL库代码实现
/* USER CODE BEGIN 0 */
uint8_t TestTimer = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(htim);
  TestTimer = (++TestTimer) % 2;
  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_TIM_PeriodElapsedCallback could be implemented in the user file
   */
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM6_Init();
  /* USER CODE BEGIN 2 */
  
  /* 使能更新中断 */
  HAL_TIM_Base_Start_IT(&htim6);
  /* 启动定时器 */
  HAL_TIM_Base_Start(&htim6);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
  • 效果演示

在这里插入图片描述

    烧录软件进行调试,可以看到该变量1s翻转一次电平。

五、注意事项

1、留意预分频系数和重装载值设置的时候都是要减1处理,也就是想要2分频,PSC需要设置为1,想要计数10次复位,则需要给重装载值设置9。
2、配置完生成的工程,并不会在初始化的时候就给打开计数,需要在使用过程中自行调用LL库打开。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/844452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小白到运维工程师自学之路 第六十七集(Harbor企业镜像仓库部署)

一、概述 Harbor 是 VMware 公司开源的企业级 Docker Registry 项目,其目标是帮助用户迅速搭建一个企业级的 Docker Registry 仓库服务。它以Docker公司开源的Registry为基础,提供了管理 UI。基于角色的访问控制(Role Based AccessControl)、AD/LDAP集成…

微信开店小程序怎么做

微信开店小程序是一种在微信平台上运行的在线商店应用,它提供了丰富的功能和便捷的购物体验。下面将介绍微信开店小程序的功能以及带来的好处: 1. 商品展示与销售:微信开店小程序可以展示企业的商品信息,包括图片、价格、详细描述…

安装Win10操作系统时找不到任何驱动器的解决方法

安装Win10操作系统时找不到任何驱动器的解决方法 有时候在一台新电脑上使用U盘安装系统时提示:我们找不到任何驱动器。 如下图所示: 解决方法: 一、按F12(不同电脑进入Bios的按键可能不同)将电脑进入Bios画面&#x…

软件测试面试,这些坑你别踩,我已经替你踩过了

看看我写的软件测试面试时候的这些坑,你一定不能踩!!! 第一个坑--测试用例编写没有思路,想起一条写一条。 分析: 该题目一般检查候选人编写测试用例的思路、覆盖度、深度。如果想起一条写一条&#xff0…

Linux基础与应用开发系列四:ARM-GCC与交叉编译

三个问题: ARM-GCC是什么?它与GCC有什么关系? 编译工具链和目标程序运行相同的架构平台,就叫本地编译 编译工具链和目标程序运行在不同的架构平台,叫做交叉编译 ARM-GCC是针对arm平台的一款编译器,它是GCC编译工具链的一个分支 虚拟机…

比亚迪与 Stingray达成合作,交互式车载KTV亮相,汽车也能卡拉OK

比亚迪公司与音乐媒体科技公司Stingray达成合作,计划从2023年开始,在全球多个市场推出车载KTV产品,成为新能源汽车的亮点。 根据比亚迪官方公众号发布的消息,比亚迪正在合作开发一款全新的娱乐系统。该系统计划支持多语言&#xf…

ESPFriends之ESP32模型部署训练历险记(一)

开发环境的部署搭建 超级小星星:时间过得可真快ESPFriends创客沙龙已经在武汉举办了两期,在这里有行业内的工程师、高校的学生以及极客,在这里我们交流分享自己的开发心得,提出遇到的“大坑”也可以得到小伙伴们的解决方案&#x…

SAP 请求合并

SAP 请求合并 由于公司请求管理要求比较高,经常需要将很多请求合并在一起传输,实际SAP是支持这个功能的,不仅可以将开发类的请求合并,还可以将开发和定制的合并在一起传输 1、合并请求 SE09 实用程序-重组-合并请求 看提示写的…

Qt--QPlugin插件

写在前面 Qt–动态链接库一文中提到,动态方式加载dll只能加载 extern "C“ 的导出函数,而无法加载类,因此可以使用Qt提供的插件来实现导出类的动态加载。 QPlugin是Qt插件框架的一部分,是一种轻量级的插件系统,…

K8S系列文章之 自动化运维利器 Ansible

Ansible-安装 第一步:安装我们的epel扩展源 yum -y install epel-release 我这里会报/var/run/yum.pid 已被锁定,如果没有直接进行下一步 [rootmaster home]# yum -y install epel-release 已加载插件:fastestmirror, langpacks /var/run/…

Bean的Aware接口

Aware 简介 Spring中提供了一些以Aware结尾的接口,实现了Aware接口的bean在被初始化之后,可以获取相应资源。比如BeanNameAware之类的以Aware结尾的接口,这个接口获取的资源就是以BeanName相关的。 通过Aware接口,可以对Spring相…

以产品经理的角度去讲解原型图---会议OA项目

目录 一.前言 二.原型图 2.1 原型图是什么 3.1 原型图的作用 三.演示讲解 3.1 项目背景 3.2 项目介绍 3.2.1 会议管理(会议的发起,通知) 3.2.2 投票管理(会议的流程重大决策记录) 3.2.3 会议室管理 3.2.4 系统管…

SDXL-Stable Diffusion改进版

文章目录 1. 摘要2. 算法:2.1 结构:2.2 微小的条件机制2.3 多宽高比训练2.4 改进自编码器2.5 所有组合放到一起2.6 主流方案比较 3. 未来工作4. 限制 论文: 《SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis…

HCL MPLS L2VPN BGP lsp

目录 1 拓扑 2 配置步骤 2.1 配置接口IP 和路由协议 2.2 配置MPLS LDP 2.3 配置L2VPN PW(BGP) 2.4 验证L2VPN 使用EVE-NG 中 的H3C 镜像,配置bgp 后,OSPF 会失效,可能镜像有问题,使用HCL没有问题。 1 拓扑 2 配置步骤 2.1…

【Axure动态面板】利用动态面板实现树形菜单的制作

利用动态面板,简单制作高保真的树形菜单。 一、先看效果 https://1poppu.axshare.com 二、实现思路 1、菜单无非就是收缩和展开,动态面板有个非常好的属性:fit to content,这个属性的含义是:面板的大小可以根据内容多少…

vue3-ts-vite:vue 项目 配置 多页面应用

一、Vue项目,什么是多页面应用 Vue是一种单页面应用程序(SPA)框架,这意味着Vue应用程序通常只有一个HTML页面,而在该页面上进行动态的内容更改,而不是每次都加载新的HTML页面。 但是,有时候我…

C++动态内存管理 - new和delete

目录 开胃菜 - 浅析C/C的内存分段 内存分段 各段说明 new和delete的基础用法 深度剖析new 定位new 浅析delete malloc/free和new/delete的异同 开胃菜 - 浅析C/C的内存分段 这部分是计算机系统相关的知识,这里只是先浅谈一下,可能有些内容会有冲…

初学绘画就上手!7款AI绘图免费软件精选推荐!

本篇文章将分享7款个人非常喜爱的AI绘图免费软件,一起来看看吧。 即时灵感 即时灵感 " 是一款全新升级的 AI 绘画工具,为创作者们提供了丰富多样的创作体验和强大功能。这个创新工具旨在让创作过程更加简单、便捷,同时提供高质量的作品…

Jenkins+Nginx+vue

安装nodejs 在这里插入图片描述 echo off xcopy C:\ProgramData\Jenkins\.jenkins\workspace\super_manage_vue\dist F:\java\www\super_manage_vue\ /s /e /y echo 复制文件完成 exit安装niginx 配置文件如下 #user nobody; worker_processes 1;#error_log logs/error.lo…

反射调用private方法的坑

使用反射调用私有方法时,发现空指针异常,无法直接注入导致空指针异常 加入如下代码后,恢复正常 if (AopUtils.isCglibProxy(marketSmsTaskService)) {// 如果是cglib代理对象,则转为原始对象marketSmsTaskService (MarketSmsTas…