定时器TIM HAL库+cubeMX(上)

news2024/9/25 19:22:16

定时器时钟源APB1 36MHz 

 

一.基本定时器

1.基本框图

2.溢出时间计算

3.配置定时器步骤 

TIM_HandleTypeDef g_timx_handle;

/* 定时器中断初始化函数 */
void btim_timx_int_init(uint16_t arr, uint16_t psc)
{
    g_timx_handle.Instance = TIM6;
    g_timx_handle.Init.Prescaler = psc;
    g_timx_handle.Init.Period = arr;
    HAL_TIM_Base_Init(&g_timx_handle);

    HAL_TIM_Base_Start_IT(&g_timx_handle);
}

/* 定时器基础MSP初始化函数 */
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM6)
    {
        __HAL_RCC_TIM6_CLK_ENABLE();
        HAL_NVIC_SetPriority(TIM6_IRQn, 1, 3);
        HAL_NVIC_EnableIRQ(TIM6_IRQn);
    }
}

/* 定时器6中断服务函数 */
void TIM6_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&g_timx_handle);
}

/* 定时器溢出中断中断回调函数 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM6)
    {
        LED0_TOGGLE();
    }
}

4.cubeMX配置基本定时器

使用定时器6,实现500ms定时器更新中断,在中断里翻转LED0。PSC=7199,ARR=4999、

单脉冲模式(One Pulse Mode): 开启这个模式后,只要触发了一次溢出标志,就会自动把计数使能关掉,想再次触发需要手动开启计数使能。所以如果想要实现周期触发事件,就不用勾选这个选项。
预分频系数(Prescaler): 新手杀手之一,虽然这里写的是预分频系数,但实际设置的值是预分频系数-1,也就是需要10分频时,需要设置9。
计数模式(Counter Mode): 计数模式,也称计数方向,决定定时器是递增计数还是递减计数。如果只是用来定时,那递增或递减都没什么影响。
计数周期(Counter Period): 就是当计数值达到计数周期值时,会触发一个溢出标志,新手杀手之二,因为计数是从0开始计的,所以如果想要实现10次计数,这里只需要设置9即可。
自动重装载(auto-reload preload): 如果选择了自动重装载,那么在触发了一次溢出标志后,定时器会自动将计数清0并重新计数。
触发事件选择(Trigger Event Selection): 可以选择通过UG标志、计数使能、溢出标志来触发输出,这个一般用不上。 

步骤1.图形化配置

   

步骤2.重写虚函数

进入HAL_TIM_IRQHandler(&htim2)函数,这里面的代码很长,就是不同的中断类型,进入不同的中断回调函数,这里找到 HAL_TIM_PeriodElapsedCallback(htim);

                                                                  

步骤3.在main函数里面添加

  /* 使能更新中断 */
  HAL_TIM_Base_Start_IT(&htim6);
  /* 启动定时器 */
  HAL_TIM_Base_Start(&htim6);

二.通用定时器

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

 ①内部时钟(CK_INT),来自外设总线APB提供的时钟                                                                     ②外部时钟模式1:外部输入引脚(TIx),来自定时器通道1或者通道2引脚的信号                           ③外部时钟模式2:外部触发输入(ETR),来自可以复用为TIMx_ETR的IO引脚                               ④内部触发输入(ITRx),用于与芯片内部其它通用/高级定时器级联

实验一.通用计数器闪烁

代码没有使用 HAL_TIM_IRQHandler()公用函数来处理,而是直接通过判断中断位的方式。

void TIM3_IRQHandler(void)
{
  /* USER CODE BEGIN TIM3_IRQn 0 */

  /* USER CODE END TIM3_IRQn 0 */
  if(__HAL_TIM_GET_FLAG(&htim3,TIM_FLAG_UPDATE)!=RESET)
  {
  	HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
	__HAL_TIM_CLEAR_FLAG(&htim3,TIM_IT_UPDATE);
  }
  /* USER CODE BEGIN TIM3_IRQn 1 */

  /* USER CODE END TIM3_IRQn 1 */
}

实验二.PWM输出实验

 1.定时器配置 

typedef struct 
{ 
   uint32_t OCMode; 	  /* 输出比较模式选择 */
   uint32_t Pulse; 	            /* 设置比较值 */
   uint32_t OCPolarity;       /* 设置输出比较极性 */

   uint32_t OCNPolarity;    /* 设置互补输出比较极性(高级) */
   uint32_t OCFastMode;   /* 使能或失能输出比较快速模式(用的少) */
   uint32_t OCIdleState;     /* 空闲状态下OC1输出(互补输出高级TIM) */
   uint32_t OCNIdleState;  /* 空闲状态下OC1N输出(互补输出高级TIM) */ 
} TIM_OC_InitTypeDef;

2.实验要求 

LED0接在PB5,PB5可以重定义TIM3_Ch2

void MX_TIM3_Init(void);											//通用定时器3初始化函数
HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim);		//HAL库定时器初始化函数
/*PWM配置函数*/
HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim,
                                            const TIM_OC_InitTypeDef *sConfig,
                                            uint32_t Channel);
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle);		//相关时钟配置函数
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle);				//重映射功能配置函数
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);	//PWM使能函数
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, ledRpwmval);			//这是一个宏定义,用于修改CCRx改变占空比
TIM_HandleTypeDef g_timx_pwm_chy_handle;

/* 通用定时器PWM输出初始化函数 */
void gtim_timx_pwm_chy_init(uint16_t arr, uint16_t psc)
{
    TIM_OC_InitTypeDef timx_oc_pwm_chy;
    
    g_timx_pwm_chy_handle.Instance = TIM3;
    g_timx_pwm_chy_handle.Init.Prescaler = psc;
    g_timx_pwm_chy_handle.Init.Period = arr;
    g_timx_pwm_chy_handle.Init.CounterMode = TIM_COUNTERMODE_UP;
    HAL_TIM_PWM_Init(&g_timx_pwm_chy_handle);
    
    timx_oc_pwm_chy.OCMode = TIM_OCMODE_PWM1;
    timx_oc_pwm_chy.Pulse = arr / 2;
    timx_oc_pwm_chy.OCPolarity = TIM_OCPOLARITY_LOW;
    HAL_TIM_PWM_ConfigChannel(&g_timx_pwm_chy_handle, &timx_oc_pwm_chy, TIM_CHANNEL_2);
    HAL_TIM_PWM_Start(&g_timx_pwm_chy_handle, TIM_CHANNEL_2);
}

/* 定时器输出PWM MSP初始化函数 */
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM3)
    {
        GPIO_InitTypeDef gpio_init_struct;
        __HAL_RCC_GPIOB_CLK_ENABLE();
        __HAL_RCC_TIM3_CLK_ENABLE();

        gpio_init_struct.Pin = GPIO_PIN_5;
        gpio_init_struct.Mode = GPIO_MODE_AF_PP;            /* 推挽复用 */
        gpio_init_struct.Pull = GPIO_PULLUP;                /* 上拉 */
        gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;      /* 高速 */
        HAL_GPIO_Init(GPIOB, &gpio_init_struct);
        
        __HAL_RCC_AFIO_CLK_ENABLE();
        __HAL_AFIO_REMAP_TIM3_PARTIAL();
    }
}

3.配置cubeMX

 

1.配置重定义,这里直接在PB5上选择TIM3_ch2,系统直接给你重定义好                                       

2.配置2KHz为例,首先Tclk为输入时钟频率72MHz,我们首先带入psc = 72-1方便计算,则算出arr = 500-1。

3.接下来配置模式为PWM模式1,这里的Pulse即为我们CNT,将其设置为499/2,即控制我们的占空比为50%(默认一开始的),因为我们的CNT恰好为ARR的一半,最后是设置输出比较极性为低电平有效,因为板子上的LED灯需要接通低电平才亮。                                                                                           

4.我们需要在main添加使能函数 

HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);

5.main函数里面代码

 HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
  uint16_t ledRpwmval = 0;//控制LED的pwm重装载设定值
  uint8_t dir = 1; 
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
     HAL_Delay(10);
      
      if(dir)
          ledRpwmval++;
      else
          ledRpwmval--;
      
      if(ledRpwmval > 500)
          dir = 0;
      if(0 == ledRpwmval)
          dir = 1;
      
      //修改比较值控制占空比
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, ledRpwmval);
    /* USER CODE BEGIN 3 */
  }

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

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

相关文章

SLAM学习笔记001

当向机器人下达移动到地点B的命令后,机器人不免会问三个颇具哲学性的问题,即“我在哪儿”“我将到何处去”“我该如何去”。slam导航技术涵盖:航天、军事、特种作业、工业生产、智慧交通、消费娱乐等slam导航的经典应用:火星探测车…

「神印王座」皓晨带伙伴参与伊老试炼,12魔神攻打震南关,高能

Hello,小伙伴们,我是拾荒君。 时光匆匆,国漫《神印王座》的第85集已经与大家如约而至。想必各位观众都已经迫不及待地观看了这一集,其中,龙皓晨向光之晨曦团的成员们揭示了永恒之塔的秘密,并带领他们深入其中。 永恒之…

如何在Facebook Business Manager进行企业认证

Facebook Business Manager,简称BM,按照字面意思理解就是Facebook官方的商务管理平台,是供广告主团队去使用的一个管理工具。BM可以绑定Facebook公共主页、广告账户等一系列Facebook账号。通过BM,企业就可以在一个后台&#xff0c…

每日一练2023.12.14——幸运彩票【PTA】

题目链接:L1-062 幸运彩票 题目要求: 彩票的号码有 6 位数字,若一张彩票的前 3 位上的数之和等于后 3 位上的数之和,则称这张彩票是幸运的。本题就请你判断给定的彩票是不是幸运的。 输入格式: 输入在第一行中给出…

设计模式(2)--对象创建(2)--生成器

1. 意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 2. 四种角色 指挥(Director)、抽象生成器(Builder)、具体生成器(Concrete Builder)、产品(Product) 3. 优点 3.1 可以改变一个产品的内部表示(通过定义新的生成器)。 3.2 将构…

垃圾回收 (GC) 在 .NET Core 中是如何工作的?(二)

接上一篇文章垃圾回收 (GC) 在 .NET Core 中是如何工作的?-CSDN博客 GC 会分配堆段,其中每个段都是一系列连续的内存。 置于堆中的对象归类为 3 个代系之一:0、1 或 2。 代系可确定 GC 尝试在应用不再引用的托管对象上释放内存的频率。 编号…

如何在本地搭建Oracle数据库并实现无公网ip通过PLSQL工具远程连接数据库

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 正文开始前给大家推荐个网站,前些天发…

人工智能与VR技术

人工智能与虚拟现实技术(VR)的结合是当今科技领域中备受瞩目的话题。两者的结合不仅在娱乐、教育、医疗等领域展现出了巨大的潜力,而且在未来的发展趋势中也将具有重要意义。本文将从技术融合、应用场景和未来发展等方面探讨人工智能与虚拟现…

单例模式:饿汉模式、懒汉模式

目录 一、什么是单例模式 二、饿汉模式 三、懒汉模式 一、什么是单例模式 单例模式是Java中的设计模式之一,能够保证某个类在程序中只存在唯一一份实例,而不会创建出多个实例 单例模式有很多实现方式,最常见的是饿汉和懒汉两种模式 二、…

网络小测------

使用软件PT7.0按照上面的拓扑结构建立网络,进行合理配置,使得所有计算机之间能够互相通信。并且修改各交换机的系统名称为:学号_编号,如你的学号为123,交换机Switch0的编号为0,则系统名称为123_0&#xff1…

数据结构(超详细讲解!!)第二十七节 查找

1.查找的基本概念 1、查找表——由同一类型的数据元素(或记录)构成的集合称为查找表。 2、对查找表进行的操作: 查找某个特定的数据元素是否存在; 检索某个特定数据元素的属性; 在查找表中插入一个数据元素&#x…

12.HTML5新特性

HTML5新特性 1.介绍 它是万维网的核心语言、标准通用标记语言下的一个应用超文本标记语言(HTML)的第五次重大修改。用于取代 HTML4 与 XHTML 的新一代标准版本,所以叫HTML5 HTML5 在狭义上是指新一代的 HTML 标准,在广义上是指…

Mysql进阶-InnoDB引擎事务原理及MVCC

事务原理 事务基础 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系 统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 事务的四大特性: 原子性(A…

Milvus 老友汇|AI、云原生与向量数据库的精彩碰撞回顾!

一场久违的老友对谈,一次精妙的 AI 探索碰撞。 近日,Milvus 老友汇Arch Meetup 在上海圆满落幕。本次 Meetup 亮点颇多,不仅得到了 KubeBlocks 社区的大力支持,同时也邀请了来自网易伏羲和蚂蚁集团的资深专家,现场分享…

影响云渲染质量的几大要素是什么?影响云渲染质量的主要原因有?

对于3D渲染从业者而言,实现高效和高质量的渲染是一个常见的挑战。由于三维场景的复杂性,相关计算和处理通常需要大量的计算能力和存储,尤其是当面对着高分辨率图像、详细的动画或全局光照效果等要求时,渲染时间往往会大幅增加。针…

Shopee热卖产品:把握市场趋势,掌握消费者心声

在Shopee平台上,热卖产品的选择是一个不断变化的过程。随着时间、季节和市场需求的变化,消费者对各类产品的需求也会有所不同。本文将为您介绍一些建议的热卖产品类别,并提供了一些关键的市场趋势和策略,以帮助您在Shopee平台上获…

Python安装报错: This environment is externally managed

error: externally-managed-environment This environment is externally managed ╰─> To install Python packages system-wide, try apt installpython3-xyz, where xyz is the package you are trying toinstall.这个错误信息表示当前Python环境是由系统外部管理的&…

国际语音呼叫中心的工作流程

国际语音呼叫中心的工作流程一般包括以下几个步骤: 1.呼叫分配 当客户拨打企业的客服电话时,国际语音呼叫中心会自动将呼叫分配给示闲的客服代表,或者根据客户的需求,将呼叫转接给相应的客服代表。 2.客服代表接听电话 客服代…

windows 服务器 怎么部署python 程序

一、要在 Windows 服务器上部署 Python 程序,您需要遵循以下步骤: 安装 Python:首先,在 Windows 服务器上安装 Python。您可以从官方网站(https://www.python.org/downloads/windows/)下载最新的 Python 安…

365锦鲤助手 砍价小程序源码 流量主引流裂变

源码介绍 修改版365锦鲤 助手, 砍价小程序源码 流量主引流裂变 拼多多商品快速丰富产品内容满足广大用户需求;流量矩阵让流量都进你的圈子飞起来;长期盈利、项目稳定 1.后台安装微擎 2安装应用 后台打包上传