32单片机——基本定时器

news2025/7/27 5:17:46
        STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源

1、定时原理

1.1 软件定时原理

使用纯软件(CPU死等)的方式实现定时(延时)功能

void delay_us(uint32_t us) {    

        us *= 72;    

        while(us--);

}

缺点:①延时不精准;②CPU死等(阻塞) 

1.2 定时器定时原理

使用精准的时基,通过硬件的方式,实现定时功能

定时器核心就是计数器

 定时器简易框图

1.3 定时器分类

常规定时器的区别 

1.4 定时器特性表

2、基本定时器

2.1 简介

        STM32F103有两个基本定时器TIM6和TIM7,它们的功能完全相同,资源是完全独立的,可以同时使用
        其主要特性如下:16位自动重载 递增 计数器(计数值:0~65535);16位可编程预分频器(预分频系数:1~65536),用于对计数器时钟频率进行分频;还可以触发DAC的同步电路;在更新事件(计数器溢出)时,产生中断/DMA请求

2.2 框图

2.3 溢出时间计算公式

T_{out}:定时器溢出时间

F_{t}:定时器的时钟源频率,72Mhz

ARR:自动重装载寄存器的值

PSC:预分频寄存器的值

3、定时器中断的配置步骤

3.1 配置定时器基础工作参数

void base_tim_init(uint16_t arr,uint16_t psc);  //自己写的初始化函数

3.2 定时器基础MSP初始化

__weak void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim);  //配置NVIC、CLOCK等

3.3 使能更新中断并启动计数器

HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);

{
  TIM_TypeDef                        *Instance;         /*  寄存器基地址  */
  TIM_Base_InitTypeDef         Init;                   /*  TIM时基所需参数  */
......

#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
......
#endif 
} TIM_HandleTypeDef;

typedef struct
{
  uint32_t Prescaler;                  /*  预分频系数(范围:0x0000~0xFFFF)  */

  uint32_t CounterMode;           /*  计数模式  */

  uint32_t Period;                      /*  自动重装载值(范围:0x0000~0xFFFF)  */

  uint32_t ClockDivision;           /*  预分频因子,高级定时器会用到  */

  uint32_t RepetitionCounter;  

  uint32_t AutoReloadPreload;  /*  自动重装载预装载使能  */
} TIM_Base_InitTypeDef;

CounterMode 如下所示:

#define TIM_COUNTERMODE_UP              0x00000000U   

                                                                                                /*  用作向上计数器的计数器  */
#define TIM_COUNTERMODE_DOWN        TIM_CR1_DIR

                                                                                                /*!< 用作向下计数器的计数器 */
#define TIM_COUNTERMODE_CENTERALIGNED1     TIM_CR1_CMS_0   

                                                                                                                /*  居中对齐模式1  */
#define TIM_COUNTERMODE_CENTERALIGNED2     TIM_CR1_CMS_1                        

                                                                                                                /*  居中对齐模式2  */
#define TIM_COUNTERMODE_CENTERALIGNED3     TIM_CR1_CMS                          

                                                                                                                /*  居中对齐模式3  */

AutoReloadPreload 如下所示:

#define TIM_AUTORELOAD_PRELOAD_DISABLE        0x00000000U              

                                                                                                 /*   TIMx_ARR寄存器未缓冲  */
#define TIM_AUTORELOAD_PRELOAD_ENABLE       TIM_CR1_ARPE              

                                                                                                 /*  TIMx_ARR寄存器已缓冲  */ 

3.4 设置优先级,使能中断

HAL_NVIC_SetPriority();

HAL_NVIC_EnableIRQ();

在32单片机——外部中断_32中断-CSDN博客中有解释

3.5 编写中断服务函数

void TIM6_IRQHandler(void){
    HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim);  //中断公共处理函数
}

3.6 编写定时器更新中断回调函数

__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);

例子

使用基本定时器TIM6实现精准定时,使LED1每隔500ms翻转一次,在主函数用LED0的翻转来提示程序正在运行
分析:实现500ms定时  psc:7199;arr:4999 

base_time.h

#ifndef _BASE_TIME_H
#define _BASE_TIME_H
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"

//定时器初始化
void base_tim_init(uint16_t arr,uint16_t psc);

#endif


 

base_time.c

#include "./BSP/TIMER/base_tim.h"
TIM_HandleTypeDef base_tim_handle;  //定时器句柄
void base_tim_init(uint16_t arr,uint16_t psc){
    base_tim_handle.Instance=TIM6;  //寄存器基地址
    base_tim_handle.Init.Prescaler=psc;  //预分频系数
    base_tim_handle.Init.Period=arr;  //自动重装载值
    base_tim_handle.Init.CounterMode=TIM_COUNTERMODE_UP;  //计数模式
    base_tim_handle.Init.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE;  //自动重装载预装载使能
    //base_tim_handle.Init.ClockDivision=  //预分频因子,高级定时器会用到
    HAL_TIM_Base_Init(&base_tim_handle);
    
    //开启定时器
    HAL_TIM_Base_Start_IT(&base_tim_handle);
}
//定时器Msp回调函数
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim){
    if(htim->Instance==TIM6){
        //CLOCK
        __HAL_RCC_TIM6_CLK_ENABLE();
        //设置优先级
        HAL_NVIC_SetPriority(TIM6_IRQn,0,0);
        HAL_NVIC_EnableIRQ(TIM6_IRQn);
    }
}
//中断服务函数
void TIM6_IRQHandler(void){
    HAL_TIM_IRQHandler(&base_tim_handle);  //中断公共处理函数
}
//定时器更新中断回调函数  定时500ms

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
    if(htim->Instance==TIM6){
        HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
    }
}

main.c

#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/TIMER/base_tim.h"

int main(void){
    uint8_t i=0;
    HAL_Init();
    sys_stm32_clock_init(RCC_PLL_MUL9);  //设置系统时钟
    delay_init(72);
    
    led_init();
    base_tim_init(4999,7199);
    
    while (1){
        i++;
        if(i>20){
            i=20;
            delay_ms(100);
            HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);  //LED0闪烁,指示程序正常运行
        }
  }
}


 

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

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

相关文章

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露&#xff0c;数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据&#xff0c;严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能&#xff0c;但SEMR…

Matlab实现任意伪彩色图像可视化显示

Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中&#xff0c;如何展示好看的实验结果图像非常重要&#xff01;&#xff01;&#xff01; 1、灰度原始图像 灰度图像每个像素点只有一个数值&#xff0c;代表该点的​​亮度&#xff08;或…

图解JavaScript原型:原型链及其分析 | JavaScript图解

​​ 忽略该图的细节&#xff08;如内存地址值没有用二进制&#xff09; 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么&#xff1a;保存在堆中一块区域&#xff0c;同时在栈中有一块区域保存其在堆中的地址&#xff08;也就是我们通常说的该变量指向谁&…

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)

Name&#xff1a;3ddown Serial&#xff1a;FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名&#xff1a;Axure 序列号&#xff1a;8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&&#xff1a;逻辑与 ||&#xff1a;逻辑或 &#xff01;&#xff1a;逻辑非 短路求值 位运算符 按位与&&#xff1a; 按位或 | 按位取反~ …

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 原创笔记&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;《数据结构第4章 数组和广义表》…

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程

鸿蒙电脑版操作系统来了&#xff0c;很多小伙伴想体验鸿蒙电脑版操作系统&#xff0c;可惜&#xff0c;鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机&#xff0c;来体验大家心心念念的鸿蒙系统啦&#xff01;注意&#xff1a;虚拟…

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)

引言 在嵌入式系统中&#xff0c;用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例&#xff0c;介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单&#xff0c;执行相应操作&#xff0c;并提供平滑的滚动动画效果。 本文设计了一个…

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…

WebRTC调研

WebRTC是什么&#xff0c;为什么&#xff0c;如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例&#xff1a; 某医药分销企业&#xff0c;主要经营各类药品的批发与零售。由于药品的特殊性&#xff0c;效期管理至关重要&#xff0c;但该企业一直面临效期问题的困扰。在未使用WMS系统之前&#xff0c;其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…