STM32CubeIDE(CUBE-MX hal库)----定时器_stm32cubeide 定时器-程序员宅基地

技术标签: stm32  STM32 CUBEMX-hal库学习教程  嵌入式硬件  单片机  

系列文章目录

STM32CubeIDE(CUBE-MX hal库)----初尝点亮小灯
STM32CubeIDE(CUBE-MX hal库)----按键控制
STM32CubeIDE(CUBE-MX hal库)----串口通信



前言

STM32定时器是一种多功能外设,可以为嵌入式系统提供各种定时和计数功能。通过合理配置,它可以适应各种应用场景,提供精准的定时和计数功能,使嵌入式系统更加灵活和可控。


一、定时器

功能:定时、捕获脉冲、计算PWM占空比、输出PWM波形、编码器计数。
如何进行计数:如果时钟输入频率是72MHZ,则计数器计数到72000000用了一秒钟。但是计数器寄存器的位数16bit只能计数65536/72000000次/秒=0.0009秒。所以需要一个预分频器(顾名思义是将频率进行降低计算公式 频率/(分频数+1)不分频就设为0)也是一个16位的寄存器,可进行65536次分频。则定时器最多可定时65536×65536/72000000=59.65s

二、使用步骤

设置串口一用于打印调试信息
在这里插入图片描述
打开串口中断
在这里插入图片描述
将高速外部时钟源设为晶振可以提高定时精度
在这里插入图片描述
时钟设置
在这里插入图片描述

定时器设置
在这里插入图片描述
定时器参数设置,下面的设置实现了1s的定时,如果想要0.5s的定时则将分频系数设为7199,计数值设为4999。计算过程72000000/(7199+1)/(4999+1)=2Hz 赫兹(Hz)是频率的单位,表示每秒的周期数。要将赫兹转换为秒 1/2=0.5s

在这里插入图片描述
定时器中断设置
在这里插入图片描述

三、HAL库实验代码

实验一:观察计数器的数值是如何变化的,只需要在已有的代码中加入以下代码头文件包含

/* USER CODE BEGIN Includes */
#include <string.h>
#include <string.h>
/* USER CODE END Includes */
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start(&htim4);
  int counter=0;
  char message[20];

  /* USER CODE END 2 */

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_TIM4_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start(&htim4);
  int counter=0;
  char message[20];

  /* USER CODE END 2 */

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

    /* USER CODE BEGIN 3 */
	  counter=__HAL_TIM_GET_COUNTER(&htim4);//获取计数�?
	  sprintf(message,"counter: %d",counter);
	  HAL_UART_Transmit_IT(&huart1, (uint8_t *)message, sizeof(message));
	  HAL_Delay(99);//延时100ms
  }
  /* USER CODE END 3 */
}

__HAL_TIM_SET_COUNTER 设置计数器的值
__HAL_TIM_GET_COUNTER 获取计数器的值
__HAL_TIM_SET_AUTORELOAD 设置重装载计数器的值
__HAL_TIM_GET_AUTORELOAD 获取重装载计数器的值
__HAL_TIM_SET_PRESCALER 设置预分频器的值

实验现象
在这里插入图片描述

实验二:利用定时器中断实现计时功能,通过重写HAL_TIM_PeriodElapsedCallback函数,实现每隔1s触发一次中断,num自增一向串口助手传num的值。

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 函数是在使用STM32的HAL(Hardware Abstraction Layer)库时,用于处理定时器(TIM)定时周期到达事件的回调函数。该函数在定时器的中断服务子程序(ISR)中被调用,用于用户定义的处理。

参数 TIM_HandleTypeDef *htim 是一个指向定时器处理结构体的指针,其中包含了有关定时器的信息,如定时器的基地址、计数器值、定时器配置等。

uint8_t num=0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    
	if(htim==&htim4){
    
		num++;
		HAL_UART_Transmit_IT(&huart1, &num, 1);

	}

}

实验现象
在这里插入图片描述

三、标准库代码

定时器初始化

void Timer_Init(void)
{
    
	//开启时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
	
	//选择时基单元的时钟 选择内部时钟  默认使用内部时钟可以不写
	TIM_InternalClockConfig(TIM4);
	
	
	//配置时基单元
	TIM_TimeBaseInitTypeDef TimeBaseInitStructure;
	TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//时钟分频 不进行分频
	TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数方式  向上计数
	TimeBaseInitStructure.TIM_Period=10000-1 ; //自动重装载的值
	TimeBaseInitStructure.TIM_Prescaler=7200-1;//预分频系数
	TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器高级定时器里面才有
	
	TIM_TimeBaseInit(TIM4,&TimeBaseInitStructure);//时基初始化
	TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);//使能定时器中断
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;  //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级2级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //从优先级1级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
	
	TIM_Cmd(TIM4,ENABLE);//开启定时器

	
}

中断服务函数

void EXTI4_IRQHandler(void)
{
    
	if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET) //检查定时器中断标志位是否置位
	{
    
		
		num++;
		TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
	}
}

hal库和标准库函数对比

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)--------->void EXTI4_IRQHandler(void)(标准库)
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)和TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);功能类似开启定时器中断

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xddwg521125/article/details/134712208

智能推荐

Google《Android性能优化》学习笔记_intro and recap timestamps-程序员宅基地

文章浏览阅读1k次。http://www.csdn.net/article/2015-04-15/2824477-android-performance/1摘要:Google在Udacity上的《Android性能优化》在线课程详细介绍了该如何优化性能,这些课程是Google之前在Youtube上发布的Android性能优化典范专题课程的细化与补充。本文是对渲染、运算、内存、电量四个篇章的学习笔记。_intro and recap timestamps

hive使用适用场景_大数据技术中,HIVE的应用场景有哪些-程序员宅基地

文章浏览阅读2k次。事务:之前了解到的是,转账(一个帐户上都加、一个帐户上进行减)行级事务(要保存一条insert\update不会出现只插入一部分的情况)实时:查询速度快,响应速度快。在企业里面,一个请求发送出去,如果不是太复杂的话,在做需求的时候,整个响应过程一般不会超过3SOLTP:一般指的是数据库OLAP:重点在于分析上,用于查询或者分析使用。没有实时要求一般是按天、周、月、年来进行数据统计。OLTP是要求实..._hive 使用场景

Asp.net面试题_asp.net标签必须是小写吗-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏27次。Asp.net核心技术思想 1、概述反射和序列化反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet_asp.net标签必须是小写吗

iphone 把图片保存到Photo Album_iphone file文件放入album-程序员宅基地

文章浏览阅读960次。uikit里有一个函数是UIImageWriteToSavedPhotosAlbum可以实现_iphone file文件放入album

Armv8-A架构安全特性总结_arm sel2技术-程序员宅基地

文章浏览阅读1.2k次。Arm-A 体系架构安全特性总结:安全特性 英文拼写 说明 应对的攻击 引入的版本 XN execute never 不可执行。一般用于配置数据段不可执行,防止数据段注入可执行的shell code。 使用XN可执行DEP(Data execute Prevention,一般我们通常说的堆栈不可执行) 任意地址读写、代码段覆盖 < v8 PXN Privileged Execute Never 特权模式不可执..._arm sel2技术

数据模型的含义是什么?为什么要建立数据模型_什么是数据模型-程序员宅基地

文章浏览阅读9.8k次。数据模型(Data Model)是2113数据特征的5261抽象。数据(Data)是描述事物的符号记录,模型(4102Model)是现实世界的抽象。数据1653模型从抽象层次上描述了系统的静态特征、动态行为和约束条件,为数据库系统的信息表示与操作提供了一个抽象的框架。数据模型所描述的内容有三部分:数据结构、数据操作和数据约束。扩展资料:数据模型所描述的内容包括三个部分:数据结构、数据操作、数据约束。1、数据结构:数据模型中的数据结构主要描述数据的类型、内容、性质以及数据间的联系等。数据结构是数据模型_什么是数据模型

随便推点

About Add DataRow-程序员宅基地

文章浏览阅读128次。当从一个表中将记录Copy到另一个结构相同的表中的时候,有两种方式:DataTable.ImportRow()或: DataTable.Rows.Add()正确的使用方法: dt1.ImportRow(dt.Rows[0]);或: dt1.Rows.Add(dt.Rows[0].ItemArray);不要使用:..._add data row

linux中-f的含义,linux 下shell中if的“-e,-d,-f”的含义-程序员宅基地

文章浏览阅读1.5w次,点赞4次,收藏55次。文件表达式-e filename 如果 filename存在,则为真-d filename 如果 filename为目录,则为真-f filename 如果 filename为常规文件,则为真-L filename 如果 filename为符号链接,则为真-r filename 如果 filename可读,则为真-w filename 如果 filename可写,则为真-x filename 如果..._-f

【JS】根据日期和给定的天数,计算日期的前几天或者后几天的日期时间_js计算某个日期多少天后的日期-程序员宅基地

文章浏览阅读301次。【代码】【JS】根据日期和给定的天数,计算日期的前几天或者后几天的日期时间。_js计算某个日期多少天后的日期

WebRTC-Android 源码导读(二):预览实现分析_surfaceviewrenderer-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏5次。在本系列第一篇中,我们分析了 WebRTC-Android 相机采集的实现,本文中我们将分析预览的实现。有过一定相机开发经验的朋友可能会疑惑,预览还有什么好分析的,不是直接 camera.setPreviewDisplay 或者 camera.setPreviewTexture 就能在 SurfaceView/TextureView上预览了吗?实际上预览还有更高级的玩法,尤其是需要加上图像处理功能..._surfaceviewrenderer

Easyx-----c语言实现斗地主_easyx制作打牌-程序员宅基地

文章浏览阅读2.7k次,点赞28次,收藏88次。tools.hpp源.cpp_easyx制作打牌

UNITY开发VR从入门到放弃---VR自学手册_unity vr-程序员宅基地

文章浏览阅读2.6w次,点赞54次,收藏349次。如何快速学习VR开发,以及HTCvive的使用。_unity vr

推荐文章

热门文章

相关标签