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

智能推荐

signature=48103a3afac469f01b9e56842d44e7bb,Young Men and Fire-程序员宅基地

文章浏览阅读138次。ISBN-13:978-613-2-42669-7ISBN-10:6132426698EAN:9786132426697Buchsprache:EnglischKlappentext:Please note that the content of this book primarily consists of articles available from Wikipedia or other f..._∧great american nude no. 48 , fullformat:,year,1963

Postgresql 数据库时区(timezone)设置,以及TIMESTAMPTZ和TIMESTAMP数据类型的选择-程序员宅基地

文章浏览阅读2.1w次,点赞12次,收藏18次。timestamp和timestamptz都占用8个字节,在存储时间时并没有本质的区别,都不携带时区信息。只是在insert保存数据和select给数据库客户端返回数据时处理方式不同。下边以具体示例解释这两种数据类型的差别,以及他们与数据库链接时区(session对应的时区)和postgresql数据库时区之间的关系。下边例子使用的数据库时区是Etc/UTC (GMT + 0),首先创建表,然后做相应操作:test_db=> CREATE TABLE test_table ( _timestamptz

模拟鼠标点击按钮的简单示例_bat脚本控制鼠标点击-程序员宅基地

文章浏览阅读7.2k次。原理 首先枚举到目标按钮所在程序的窗口,然后在该窗口内枚举控件获取控件的句柄,获取到按钮的句柄后可通过SendMessage或者PostMessage来发送消息模拟鼠标点击按钮等交互方式。但是因为枚举窗口和句柄都是使用WIN32 API,所以只能枚举到WIN32的控件,对于那些不是微软提供的控件则表示无能为力了。本示例简单地模拟一个往打字机里面写入数据,点击确认的方法。_bat脚本控制鼠标点击

筷云解读企业上云:为什么上云?选什么上云?_企业上云和用户上云啥意思-程序员宅基地

文章浏览阅读611次。近段时间,大家都在说企业上云,那么到底什么是企业上云?企业为什么要上云?应该怎么上呢?在新旧动能转换的关键时期,企业上云的确是可以驱动流程创新和业务创新,成为企业新的利润增长点。筷云作为国内知名的互联网生态体系构建者,以云服务为核心,赋能数字经济为使命,在助力企业上云方面有着丰富的经验。企业上云是什么?企业上云是指企业通过网络,将企业的基础设施、管理及业务部署到云端,利用网络便捷..._企业上云和用户上云啥意思

node、 node-sass 和sass-loader的版本对应问题_node-sass 版本-程序员宅基地

文章浏览阅读2.1k次。错误产生原因:node、 node-sass 和sass-loader的版本对应问题。_node-sass 版本

Java中的静态和非静态(有代码实例,超详细!)_java 静态-程序员宅基地

文章浏览阅读1.8k次,点赞10次,收藏39次。静态变量和方法是属于类的,而不属于类的实例或对象。它们可以通过类名直接访问,不需要创建对象。因此,静态成员常常用于描述与类本身有关的信息,比如常量、工具方法等。例如,Math类中的PI常量和abs()方法都是静态的。非静态变量和方法则是属于类的实例或对象的。它们必须依赖于对象的状态,才能进行相应的操作。因此,非静态成员常常用于描述类的实例状态,比如具有不同属性的学生或员工对象。例如,一个Person类中的name和age变量就是非静态的。_java 静态

随便推点

如何看待鸿蒙应用开发框架采用JavaScript作为开发语言?-程序员宅基地

文章浏览阅读9.1k次。喜闻乐见,其实使用 JavaScript 作为应用开发语言并不是第一家,比如 JerryScript 就是为了三星自家的 IoT 手表开发的,国产 RT Thread 也用了 JS 做 ..._鸿蒙开发语言最好的是java吗

kohana 框架简单小结_kohana框架-程序员宅基地

文章浏览阅读1.7k次。kohana 框架是一个相对比较小众的php框架 ,是有一个开源组织开发的mvc框架。(1)Controller 篇1.接受参数$this -> request -> param('key') 返回的是route路由里定义的参数Arr :: get($_GET, 'key') 获取的是GET作用于里key对应的值2. 重定向$this -> requ_kohana框架

智谱AI发布新一代基座大模型GLM-4;机器学习书籍推荐_glm书籍-程序员宅基地

文章浏览阅读1.1k次,点赞23次,收藏17次。智谱AI发布了全新的基座大模型GLM-4,性能可比GPT-4,拥有超强的中文能力和长文本处理能力。GLM-4的全面跃升在综合能力上提升了60%,支持更长的上下文,具备更强的多模态功能,支持更快的推理,更多并发,推理成本大大降低。智谱AI还发布了定制化的个人GLM大模型GLMs和GLM Store,实现了全家桶能力,让模型自主根据用户意图,自动理解、规划复杂指令,自由调用多种能力,从而完成更加复杂的任务。_glm书籍

在preferenceScreen中加入自己设计的layout布局_能否在perferencescreen中加入linearlayout-程序员宅基地

文章浏览阅读4.9k次。本文来自:点击打开链接图1中上面的listtitle是一个listPreference,当你点击后会出现图2的效果,然后在图2中选择ABC其中一个,这个dialog会消失,并将选择的文本显示在图1中而下面的部分是在PreferenceScreen中嵌套一个PreferenceScreen,在内部的PreferenceScreen中使用android:@layout/your_layou_能否在perferencescreen中加入linearlayout

项目研发管理经验交流_研发经验分享-程序员宅基地

文章浏览阅读10w+次,点赞6次,收藏26次。最近,大BOSS要求我给集团内部的各项目研发组长进行一次培训,让我准备下,我当时一听有点懵,为什么是我? 内心挣扎了200ms后,我爽快的答应了! 回来后,我就在想,我要怎么做这个PPT呢?我当时想的不是我能不能完成,而是我要怎么结合自己这近一年的研发管理经验,来把这个PPT完成的很有料! 既然让我做,就有让我做的理由,我很忙,也没时间去想,咱也不敢说,咱也不敢问..._研发经验分享

spring-security入门4---自定义登录成功和登录失败的行为_spring sso 自定义登录错误-程序员宅基地

文章浏览阅读1.6k次。项目源码地址https://github.com/nieandsun/security_spring sso 自定义登录错误