【STM32】定时器+基本定时器

一、定时器的基本概述

1.软件定时器原理

原来我们使用51单片机的时候,是通过一个__nop()__来进行延时

我们通过软件的方式来进行延时功能是不准确的,受到很多不确定因素。

2.定时器原理:计数之间的比值

因为使用软件延时受到影响,所以我们尽量使用硬件来进行定时。硬件同时执行效率也比软件的高。

3.STM32定时器分类

4.STM32定时器特性表

注意点:

1)基本定时器是向上计数器(递增)

2)预分频器系数是从1-65536(但是实际上存储的数值范围是0-65535)--》所以存在+1和-1的问题

5.STM32基本,通用,高级定时器功能整体区别

二、基本定时器(TIM6/TIM7)

1.基本概念

“触发DAC”---》指的是数据电路和模拟电路之间的转换

2.基本定时器框图

1.注意点

1)基本定时器的时钟源是:内部时钟

2)自动重载寄存器和预分频器都有相对应的影子寄存器

3)决定自动重载寄存器(ARR)和预分频器(PSC)是否马上将值更新(是否有缓冲)到影子寄存器的取决于ARPE位

有缓冲--》减少时间误差

无缓冲---》有大量的时间误差

4)影子寄存器中的值更新也要有事件触发

5)实际起作用的是:影子寄存器,其不能直接被访问到

6)溢出条件是CNT==ARR影子寄存器,而不是ARR本身

7)当溢出时,会产生两种结果:中断和DMA输出   中断事件

2.内部时钟频率问题

1)定时器最终的时钟频率不仅仅取决于外部传入的时钟频率还取决于是否进行分频。

举个例子

3.STM32定时器计数模式及溢出条件

递增计数模式实例说明

递减计数模式实例说明

中心对齐模式实例说明

三、定时器寄存器

1.TIM6 和TIM7 控制寄存器 1(TIMx_CR1)

该寄存器用于设置ARR寄存器是否具有缓冲,并且使能/关闭计数器

是否有缓冲的区别:应用场景

1.假设我们现在让led先亮1s,然后灭,在亮2s,假设1s对应的ARR=99,2s对应的ARR=199

a)此时没有缓冲,则在亮1s后灭,然后再要开始亮的时候,我们要修改CNT的值为199,这个修改过程需要浪费时间

b)此时有缓冲,则再亮1s的这个时间段,我们就可以修改ARR=199,因为有缓冲,是等到下一个周期才起作用。

2.假设我们现在让led先亮1s,然后灭,在亮1s,假设1s对应的ARR=99

a)此时没有缓冲,则在亮1s后灭,然后再要开始亮的时候,此时我们不需要修改,则不需要时间

b)此时有缓冲,则再亮1s,然后再要开始亮的时候,此时我们不需要修改,则不需要时间

2.TIM6 和TIM7 DMA/中断使能寄存器(TIMx_DIER)

用于使能更新中断

3. TIM6 和TIM7 状态寄存器(TIMx_SR)

用于判断是否发生更新中断,由硬件置1,软件清零

4. TIM6 和TIM7 计数器(TIMx_CNT)

计数器是可读可写,并且再运行过程中也是可以对其进行修改。

5. TIM6 和TIM7 预分频器(TIMx_PSC)

6. TIM6 和TIM7 自动重装载寄存器(TIMx_ARR)

四、定时器溢出时间计算方法

1)这里ARR+1,可以这样理解,例如ARR的值为2,则计数器从0到1,从1到2,此时并不会立刻溢出,而是再经过一个时钟脉冲后才会溢出,所以实际的溢出时间是三个时钟脉冲,即ARR+1个时钟脉冲

2)ARR里面的值是从零开始的

推导过程

溢出时间=计数个数*f

五、定时器中断配置步骤

1.具体步骤

注意点:

1)记得开启计数器

2)记得使能中断(定时器,NVIC)

3)编写中断服务函数

4)设置NVIC,时钟等基础

5)设置定时器相关的基础参数

6)定时器溢出中断中断回调函数

1)定时器初始化--》HAL_TIM_Base_Init

2)设置中断优先级,使能中断---》HAL_NVIC_SetPriority &&  HAL_NVIC_EnableIRQ

3)编写中断服务函数---》去start.s文件中查找对应的名字【TIM6_IRQHandler】然后再这个函数中调用【HAL_TIM_IRQHandler(这个再hal_tim.c中)】

3)编写定时器的回调函数--》这个函数是在中断处理程序中调用的--》HAL_TIM_PeriodElapsedCallback

4)启动定时器(计数器)和中断---》HAL_TIM_Base_Start_IT

2.相关HAL库函数

1.HAL_TIM_OC_Init:定时器初始化

在stm32f1xx_hal_tim.c中

HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim)
{
  /* Check the TIM handle allocation */
  if (htim == NULL)
  {
    return HAL_ERROR;
  }

  /* Check the parameters */
  assert_param(IS_TIM_INSTANCE(htim->Instance));
  assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode));
  assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision));
  assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload));

  if (htim->State == HAL_TIM_STATE_RESET)
  {
    /* Allocate lock resource and initialize it */
    htim->Lock = HAL_UNLOCKED;

    /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */
    HAL_TIM_OC_MspInit(htim);

  }

  /* Set the TIM state */
  htim->State = HAL_TIM_STATE_BUSY;

  /* Init the base time for the Output Compare */
  TIM_Base_SetConfig(htim->Instance,  &htim->Init);

  /* Initialize the TIM state*/
  htim->State = HAL_TIM_STATE_READY;

  return HAL_OK;
}

关键结构体介绍

2.HAL_TIM_Base_MspInit

这个函数的作用:MSP是指和MCU相关的初始化

 3.HAL_TIM_Base_Start

启动计数器

4.HAL_TIM_Base_Start_IT

启动定时器的中断

5. TIM6_IRQHandler

1)这个函数名根据所使用的定时器类型去start.s中查找

2)再这个函数中调用“HAL_TIM_IRQHandler”

6.HAL_TIM_PeriodElapsedCallback

编写定时器溢出回调函数,这个是用户根据相关的要求编写

三、中断服务函数VS中断回调函数

HAL库中的中断,在callback回调函数和中断函数中处理有何区别 (amobbs.com 阿莫电子论坛 - 东莞阿莫电子网站)

中断服务函数:TIM6_IRQHandler--->这个实际上不编写业务代码,只是提供一个中断入口

中断回调函数:HAL_TIM_PeriodElapsedCallback--->这个回调函数中编写了相关的业务代码,真正的处理

  1. 中断服务函数(ISR): 中断服务函数是由硬件触发并由操作系统或者嵌入式系统执行的函数。当中断事件(例如,定时器溢出、外部触发等)发生时,CPU会跳转到相应的中断服务函数来执行相关的操作。在这个上下文中,ISR 是系统级别的,用于响应底层的硬件事件。

  2. 中断回调函数: 中断回调函数通常是用户或应用程序级别定义的函数,它会在中断服务函数的上下文中执行。在某些情况下,中断服务函数可能会调用用户定义的回调函数。这个回调函数是由用户定义的,用于处理中断事件,执行与中断相关的应用程序逻辑。在这个上下文中,回调函数是应用程序级别的,用于定制中断发生时的行为。

六、编程实战:定时器中断实验

STM32CubeMX学习笔记(5)——基本定时器接口使用_counter mode mx-CSDN博客

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);
	
	//打开定时器6的中断
	HAL_TIM_Base_Start_IT(&g_timx_handle);
	
}
//定时器基础MSP初始化函数(就是初始化NVIC,CLOCK等)
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim){
	
	//判断地址是否为定时器6
	if(htim->Instance==TIM6){
		//打开定时器6的时钟
		__HAL_RCC_TIM6_CLK_ENABLE();
		
		//初始化NVIC
		HAL_NVIC_SetPriority(TIM6_IRQn,1,3);//设置优先级
		HAL_NVIC_EnableIRQ(TIM6_IRQn);//打开定时器6中断
		
	}
	
}

//编写中断服务函数
//去start.s文件中查找
//代码作用:实际上这个函数是提供了一个定时器中断的入口
//并不进行业务的处理
void TIM6_IRQHandler(){
	
	HAL_TIM_IRQHandler(&g_timx_handle);
}

//编写定时器溢出回调函数
//代码作用:编写用户相关的业务代码
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
	//判断地址是否为定时器6
	if(htim->Instance==TIM6){
		//翻转led,使得闪烁
		HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);
	}
}

main函数

int main(){
    HAL_Init();
    sys_stm32_clock_init(RCC_PLL_MUL9);
    delay_init();
    btim_timx_int_init(5000-1,7200-1);
    while(1){
    
    }

}

通用定时器

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Scala---介绍及安装使用

一、Scala介绍 1. 为什么学习Scala语言 Scala是基于JVM的语言,与java语言类似,Java语言是基于JVM的面向对象的语言。Scala也是基于JVM,同时支持面向对象和面向函数的编程语言。这里学习Scala语言的原因是后期我们会学习一个优秀的计算框架S…

企业如何管理员工电脑和规范电脑的使用

企业如何管理员工电脑和规范电脑的使用 在现代信息时代,数据安全问题已经成为各个领域都面临的挑战。随着大数据的快速发展和互联网的普及,数据泄露的风险也逐渐增加。而作为企业或个人用户,如何保护自己的数据,避免泄露给不法分…

ios 对话框UIAlertController放 tableview

//强弱引用 #define kWeakSelf(type)__weak typeof(type)weak##type type; -(void) showUIAlertTable {kWeakSelf(self)UIAlertController *alert [UIAlertController alertControllerWithTitle:NSLocalizedString("select_stu", nil) message:nil prefer…

构建Docker基础镜像(ubuntu20.04+python3.9.10+pytorch-gpu-cuda11.8)

文章目录 一、前置条件1.创建 ubuntu 镜像源文件【sources.list】2.下载 python 安装包【Python-3.9.10.tgz】 二、构建方法1.构建目录2.创建DockerFile3.打包镜像 一、前置条件 配置一下 ubuntu 的镜像源下载 python 安装包 1.创建 ubuntu 镜像源文件【sources.list】 内容…

麒麟信安登录央视,深度展现为中国信息安全铸“魂”之路

麒麟信安登录央视,深度展现为中国信息安全铸“魂”之路 近日,麒麟信安登录央视频道,《麒麟信安——为中国信息安全铸“魂”》在CCTV-4中文国际频道、CCTV-7国防军事频道、CCTV-10 科教频道、CCTV-12社会与法频道、CCTV-17农业农村频道&#x…

动态调整学习率Lr

动态调整学习率Lr 0 引入1 代码例程1.1 工作方式解释 2 动态调整学习率的几种方法2.1 lr_scheduler.LambdaLR2.2 lr_scheduler.StepLR2.3 lr_scheduler.MultiStepLR2.4 lr_scheduler.ExponentialLR2.2.5 lr_scheduler.CosineAnnealingLR2.6 lr_scheduler.ReduceLROnPlateau2.7 …

后门程序2

System\CurrentControlSet\Services\Disk\Enum Windows 操作系统注册表中的一个路径。这个路径通常包含有关磁盘设备的信息。在这个特定的路径下,可能存储了有关磁盘枚举的配置和参数 Enum(枚举)子键通常包含了系统对磁盘的枚举信息&#xf…

网络安全/黑客技术(0基础入门到进阶提升)

前言 前几天发布了一篇 网络安全(黑客)自学 没想到收到了许多人的私信想要学习网安黑客技术!却不知道从哪里开始学起!怎么学 今天给大家分享一下,很多人上来就说想学习黑客,但是连方向都没搞清楚就开始学习…

高通SDX12:ASoC 音频框架浅析

一、简介 ASoC–ALSA System on Chip ,是建立在标准ALSA驱动层上,为了更好地支持嵌入式处理器和移动设备中的音频Codec的一套软件体系。 本文基于高通SDX12平台,对ASoC框架做一个分析。 二、整体框架 1. 硬件层面 嵌入式Linux设备的Audio subsystem可以划分为Machine(板…

关于企业海外Social平台营销布局,你需要了解这三件事

01 企业Social营销布局模式 Social营销走到现在,早已进入了标准配置期。任何企业和组织,进行营销宣传的时候都会在社媒社交平台上创建账号和运营。目前,海外Social平台营销模式基本分为四类: 官方社媒账号运营:以Hoot…

HTML5学习系列之主结构

HTML5学习系列之主结构 前言HTML5主结构定义页眉定义导航定义主要区域定义文章块定义区块定义附栏定义页脚 具体使用总结 前言 学习记录 HTML5主结构 定义页眉 head表示页眉&#xff0c;用来表示标题栏&#xff0c;引导和导航作用的结构元素。 <header role"banner…

使用Python和requests库的简单爬虫程序

这是一个使用Python和requests库的简单爬虫程序。我们将使用代理来爬取网页内容。以下是代码和解释&#xff1a; import requests from fake_useragent import UserAgent # 每行代理信息 proxy_host "jshk.com.cn" # 创建一个代理器 proxy {http: http:// proxy_…

SQLServer添加Oracle链接服务器

又一次在项目中用到了在SQLServer添加Oracle链接服务器&#xff0c;发现之前文章写的也不太好使&#xff0c;那就再总结一次吧。 1、安装OracleClient 安装64位&#xff0c;多数SQLServer是64位&#xff0c;所以OracleClient也安装64位的&#xff1b; 再一个一般安装的Oracl…

Python二级 每周练习题26

如果你感觉有收获&#xff0c;欢迎给我打赏 ———— 以激励我输出更多优质内容 练习一: 从键盘输入任意字符串&#xff0c;按照下面要求分离字符串中的字符&#xff1a; 1、分别取出该字符串的第偶数位的元素&#xff08;提醒注意&#xff1a;是按照从左往右数的 方式确定字…

新增配置字

新增的配置字 “使用的集成功放通道数量”&#xff0c;我的理解 channelnum 和 有没有AVAS有关&#xff0c;油车的话没有AVAS&#xff1b; a2b :有外置功放肯定有a2b; amp1:内置功放&#xff1b; amp2:Avas 用的内置功放&#xff1b;

如何防止听力下降?

听力受损是不可逆的&#xff0c;一旦听力下降了是无法恢复的&#xff0c;所以当我们出现听力障碍的时候&#xff0c;我们更应该注意我们的耳朵&#xff0c;想想如何能保护我们的残余听力&#xff01; 今天来告诉大家&#xff0c;哪些事是有易于听力的&#xff0c;一起来看看吧…

一款免费好用的制作电子杂志网站,发现新大陆~

你是不是也厌倦了传统纸质杂志的限制&#xff0c;想要尝试一种全新的阅读体验&#xff1f;那么&#xff0c;今天我要向你推荐的这款免费好用的制作电子杂志网站&#xff0c;绝对能让你眼前一亮&#xff01; 这款网站就是FLBOOK在线制作电子杂志平台&#xff0c;并且界面简洁、操…

Kubernetes介绍和环境部署

文章目录 Kubernetes一、Kubernetes介绍1.Kubernetes简介2.Kubernetes概念3.Kubernetes功能4.Kubernetes工作原理5.kubernetes组件6.Kubernetes优缺点 二、Kubernetes环境部署环境基本配置1.所有节点安装docker2.所有节点安装kubeadm、kubelet、kubectl添加yum源containerd配置…

【带头学C++】----- 五、字符串操作函数 ---- 5.1 字符串操作函数

5.1字符串操作函数(以str开头的字符串处理函数默认遇到\0结束操作) 5.1.1 测量字符串的长度strlen() strlen() 函数用于计算一个字符串的长度。 #include <string.h> //注意&#xff1a;该头文件必须包含 size_t strlen(const char *s); // s指的是需要测量字符串的首地…

【T690 之十一】基于方寸EVB2开发板,结合 Eclipse+gdb+gdbserver 调试 CCAT 的流程总结

目录 1. 准备工作1.1 Eclipse1.2 工程编译1.3 烧写固件 2. 创建工程2.1 搭建调试工程2.2 配置Dbug调试信息 3. 调试4. 手动调试过程4. 总结 备注&#xff1a; 1&#xff0c;假设您已对方寸微电子的T690系列芯片的使用方式都有了一定的了解&#xff0c;可以根据此文的配置进行Li…