当前位置: 首页 > news >正文

定时器TIM HAL库+cubeMX(上)

定时器时钟源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++;elseledRpwmval--;if(ledRpwmval > 500)dir = 0;if(0 == ledRpwmval)dir = 1;//修改比较值控制占空比__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, ledRpwmval);/* USER CODE BEGIN 3 */}

相关文章:

  • PaddleClas学习3——使用PPLCNet模型对车辆朝向进行识别(c++)
  • 安装LLaMA-Factory微调chatglm3,修改自我认知
  • 奥比中光 Femto Bolt相机ROS配置
  • strtok()的用法及实现哦
  • 逻辑回归的介绍和应用
  • es模板和索引简单操作简介
  • rust宏(macro)详解
  • Selenium+Unittest+HTMLTestRunner框架更改为Selenium+Pytest+Allure(一)
  • Sui承诺向流动性质押协议投入$SUI
  • TimescaleDB-1 安装
  • 3D渲染和动画制作软件KeyShot Pro mac附加功能
  • CRM客户管理系统-超详细介绍
  • 机器人视觉
  • OTP语音芯片与可重复擦写(Flash型)语音芯片:特性比较与应用差异
  • CanEasy多场景应用,让汽车总线测试更简单
  • 2019.2.20 c++ 知识梳理
  • Docker入门(二) - Dockerfile
  • ES学习笔记(12)--Symbol
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • overflow: hidden IE7无效
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • PHP的类修饰符与访问修饰符
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • uva 10370 Above Average
  • Vue2.0 实现互斥
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 简单基于spring的redis配置(单机和集群模式)
  • 删除表内多余的重复数据
  • 小李飞刀:SQL题目刷起来!
  • 学习使用ExpressJS 4.0中的新Router
  • 异步
  • #FPGA(基础知识)
  • #pragam once 和 #ifndef 预编译头
  • $L^p$ 调和函数恒为零
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (二)斐波那契Fabonacci函数
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)负载均衡,回话保持,cookie
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • ..回顾17,展望18
  • .htaccess配置重写url引擎
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .net 使用ajax控件后如何调用前端脚本
  • .NetCore 如何动态路由
  • .net下简单快捷的数值高低位切换
  • .pyc文件是什么?
  • ;号自动换行
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • [2016.7.Test1] T1 三进制异或