STM32的HAL库开发---高级定时器

一、高级定时器简介

1、STM32F103有两个高级定时器,分别是TIM1和TIM8。

2、主要特性

  • 16位递增、递减、中心对齐计数器(计数值:0~65535)
  • 16位预分频器(分频系数:1~65536)
  • 可用于触发DAC、ADC
  • 在更新事件、触发事件、输入捕获、输出比较时,会产生中断/DMA请求4个独立通道,可用于:输入捕获、输出比较、输出PWM、单脉冲模式使用外部信号控制定时器且可实现多个定时器互连的同步电路支持编码器和霍尔传感器电路等
  • 重复计数器
    死区时间带可编程的互补输出
  • 断路输入,用于将定时器的输出信号置于用户可选的安全配置中

3、高级定时器框图

高级定时器的时钟源部分跟通用定时器是一样的,主要区别在重复计数器、互补输出部分、刹车输入。

 重复计数器:通用定时器在计数器溢出的时候,就会产生更新事件和更新中断。而高级定时器多了重复计数器,计数器溢出后,需要经过重复计数器才会产生更新事件或者更新中断。首先往RCR寄存器里边写入值REP,每当计数器值溢出的时候,重复计数器的值就减一,当重复计数器的值递减到0的时候,再次溢出就会产生更新事件或者更新中断。

互补输出部分:通用定时器只有CH1、CH2、CH3、CH4,而高级定时器除了这些通道以外,还有CH1N、CH2N、CH3N三个互补通道。通道4是没有互补通道的,DTG是用于设置死区时间的。

刹车输入:TIMx_BKIN引脚,信号BRK进来以后,首先经过一个极性选择,看是高电平有效还是低电平有效。经过一个或门,产生刹车中断(BI)。或门信号还可以来自时钟安全系统CSS。

二、高级定时器输出指定个数PWM实验原理

1、重复计数器特性

计数器每次上溢或下溢都能使重复计数器减1,减到0时,再发生一次溢出就会产生更新事件

当TIMx_RCR寄存器的值设置为0的时候,没,每当计数器溢出时,由于 重复计数器的值已经是0了,所以每次计数器溢出时,都会产生更新事件。

当TIMx_RCR寄存器的值设置为3的时候,当计数器的值溢出三次后,重复计数器的值递减到0了,当计数器的值再次溢出时,则产生更新事件。

再同步:由于RCR重复计数寄存器的存在影子寄存器,实际起作用的是影子寄存器,当软件产生更新事件以后,RCR寄存器里边的值会转移到影子寄存器里边,比如当影子寄存器里边已经递减到1了,软件更新事件产生后,影子寄存器的值会恢复为3,因此需要计数器再溢出4次才能产生更新事件或者更新中断。有点像影子寄存器复位的意思。

如果设置RCR为N,更新事件将在N+1次溢出时发生。

2、实验原理

  • 配置边沿对齐模式输出PWM
  • 指定输出N个PWM,则把N-1写入RCR
  • 在更新中断内,关闭计数器

注意:高级定时器通道输出必须把MOE位置1

三、高级定时器输出指定个数PWM实验配置步骤

1、HAL_TIM_PWM_Init()函数,配置定时器基础工作参数。这个函数与HAL_TIM_Base_init()函数功能是一样的。

2、HAL_TIM_PWM_MspInit(),配置NVIC、CLOCK、GPIO等。

3、HAL_TIM_PWM _Configchannel()函数,配置PWM模式/比较值。‘

4、HAL NVIC SetPriority()、HAL_NVIC_EnablelRQ()函数,设置优先级,使能中断

5、HAL_TIM_PWM _Start()函数,使能输出、主输出、启动计数器。

6、__HAL TIM ENABLE IT()宏定义,使能定时器更新中断

7、TIMx_IROHandler()等>HAL_TIM_IROHandler()函数,编写中断服务函数

8、HAL_TIM_PeriodElapsedCallback()函数,编写更新中断回调函数

四、高级定时器输出指定个数PWM实验配置步骤 

实验:通过定时器1通道1实现指定个数PWM输出,用于控制LED1的亮灭

PWM.h头文件程序

#ifndef __PWM_H
#define __PWM_H#include "stm32f1xx.h"
void PWM_Init(void);
#endif

PWM.c源程序

#include "./BSP/TIMER/PWM.h"TIM_HandleTypeDef htim;
void PWM_Init(void)
{htim.Instance = TIM1;htim.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;htim.Init.CounterMode = TIM_COUNTERMODE_UP;htim.Init.Period = 72000000/20000 - 1;htim.Init.Prescaler = 9999;//设置重复计数器值htim.Init.RepetitionCounter = 9;HAL_TIM_PWM_Init(&htim);TIM_OC_InitTypeDef sConfig = {0};sConfig.OCMode = TIM_OCMODE_PWM1;sConfig.OCPolarity =TIM_OCPOLARITY_HIGH;sConfig.Pulse = 0.5 * (TIM1->ARR + 1);//设置PWM输出通道HAL_TIM_PWM_ConfigChannel(&htim,&sConfig,TIM_CHANNEL_1);//使能更新中断__HAL_TIM_ENABLE_IT(&htim, TIM_IT_UPDATE);///使能主输出和定时器HAL_TIM_PWM_Start(&htim,TIM_CHANNEL_1);
}void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM1){//开启定时器1时钟__HAL_RCC_TIM1_CLK_ENABLE();//开启GPIOA时钟__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitTypeDef GPIO_Init;GPIO_Init.Mode = GPIO_MODE_AF_PP;GPIO_Init.Pin = GPIO_PIN_8;//上下拉只有输入有用GPIO_Init.Pull = GPIO_NOPULL;GPIO_Init.Speed = GPIO_SPEED_FREQ_HIGH;//设置PA8为复用推挽输出HAL_GPIO_Init(GPIOA, &GPIO_Init);HAL_NVIC_SetPriority(TIM1_UP_IRQn, 2, 2);HAL_NVIC_EnableIRQ(TIM1_UP_IRQn);}
}void TIM1_UP_IRQHandler(void)
{HAL_TIM_IRQHandler(&htim);}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM1){//关闭计数器TIM1->CR1 &= ~(1 << 0);//这个函数里边判断了输出通道和输出互补通道是否已经关闭了//没关闭 不可以关闭计数器//__HAL_TIM_DISABLE(htim);}
}

注意: __HAL_TIM_DISABLE(htim);宏定义的使用在程序里说明了

main.c主函数程序

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/TIMER/PWM.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */delay_init(72);                     /* 延时初始化 *///led_Init();                         /* LED初始化 */PWM_Init();while(1){ 
//		LED0(1);
//		LED1(0);
//		delay_ms(500);
//		
//		LED0(0);
//		LED1(1);delay_ms(500);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键

欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭&#xff5e; ??? 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。?? 希望在这里&#xff0c;我们能一起探…

优惠券平台(一):基于责任链模式创建优惠券模板

前景概要 系统的主要实现是优惠券的相关业务&#xff0c;所以对于用户管理的实现我们简单用拦截器在触发接口前创建一个单一用户。 // 用户属于非核心功能&#xff0c;这里先通过模拟的形式代替。后续如果需要后管展示&#xff0c;会重构该代码 UserInfoDTO userInfoDTO new…

搭建集成开发环境PyCharm

1.下载安装Python&#xff08;建议下载并安装3.9.x&#xff09; https://www.python.org/downloads/windows/ 要注意勾选“Add Python 3.9 to PATH”复选框&#xff0c;表示将Python的路径增加到环境变量中 2.安装集成开发环境Pycharm http://www.jetbrains.com/pycharm/…

模板的进阶

非类型模板参数 模板参数分类类型形参与非类型形参 。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在 class 或者 typename 之类的参数类型名称 。 非类型形参&#xff0c;就是用一个常量作为类 ( 函数 ) 模板的一个参数&#xff0c;在类 ( 函数 ) 模板中可将…

windows安装linux子系统【ubuntu】操作步骤

1.在windows系统中开启【适用于Linux的Windows子系统】 控制面板—程序—程序和功能—启用或关闭Windows功能—勾选适用于Linux的Windows子系统–确定 2.下载安装Linux Ubuntu 22.04.5 LTS系统 Ununtu下载链接 3.安装完Ununtu系统后更新系统 sudo apt update4.进入/usr/l…

【大数据技术】搭建完全分布式高可用大数据集群(Kafka)

搭建完全分布式高可用大数据集群(Kafka) kafka_2.13-3.9.0.tgz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群 Kafka 的详细步骤。 注意: 统一约定将软件安装包存放于虚拟机的/software目录下,软件安装至/opt目录下。 安…

万字详解 MySQL MGR 高可用集群搭建

文章目录 1、MGR 前置介绍 1.1、什么是 MGR1.2、MGR 优点1.3、MGR 缺点1.4、MGR 适用场景 2、MySQL MGR 搭建流程 2.1、环境准备2.2、搭建流程 2.2.1、配置系统环境2.2.2、安装 MySQL2.2.3、配置启动 MySQL2.2.4、修改密码、设置主从同步2.2.5、安装 MGR 插件 3、MySQL MGR 故…

Linux高级IO

文章目录 &#x1f965;IO的基本概念&#x1f347;钓鱼五人组&#x1f348;五种IO模型&#x1f349;高级IO重要概念同步通信 VS 异步通信阻塞 VS 非阻塞 &#x1f34a;其他高级IO&#x1f34b;阻塞IO&#x1f34b;‍&#x1f7e9;非阻塞IO &#x1f965;IO的基本概念 什么是IO…

摄像头模块烟火检测

工作原理 基于图像处理技术&#xff1a;分析视频图像中像素的颜色、纹理、形状等特征。火焰通常具有独特的颜色特征&#xff0c;如红色、橙色等&#xff0c;且边缘呈现不规则形状&#xff0c;还会有闪烁、跳动等动态特征&#xff1b;烟雾则表现为模糊、无固定形状&#xff0c;…

4.3 线性回归的改进-岭回归/4.4分类算法-逻辑回归与二分类/ 4.5 模型保存和加载

4.3.1 带有L2正则化的线性回归-岭回归 岭回归&#xff0c;其实也是一种线性回归&#xff0c;只不过在算法建立回归方程的时候1&#xff0c;加上正则化的限制&#xff0c;从而达到解决过拟合的效果 4.3.1.1 API 4.3.1.2 观察正则化程度的变化&#xff0c;对结果的影响 正则化力…

CSS outline详解:轮廓属性的详细介绍

什么是outline&#xff1f; outline&#xff08;轮廓&#xff09;是CSS中一个有趣的属性&#xff0c;它在元素边框&#xff08;border&#xff09;的外围绘制一条线。与border不同的是&#xff0c;outline不占用空间&#xff0c;不会影响元素的尺寸和位置。这个特性使它在某些…

设计模式.

设计模式 一、介绍二、六大原则1、单一职责原则&#xff08;Single Responsibility Principle, SRP&#xff09;2、开闭原则&#xff08;Open-Closed Principle, OCP&#xff09;3、里氏替换原则&#xff08;Liskov Substitution Principle, LSP&#xff09;4、接口隔离原则&am…

硬件工程师思考笔记02-器件的隐秘角落:磁珠与电阻噪声

目录 引言 一、磁珠&#xff1a;你以为的“噪声克星”&#xff0c;可能是高频杀手 1. 磁珠的阻抗特性与误区 2. 案例&#xff1a;磁珠引发的5G射频误码率飙升 二、电阻&#xff1a;静默的噪声制造者 1. 电阻噪声的两种形态 2. 案例&#xff1a;ADC精度被电阻噪声“偷走” 三、设…

mysql 不是内部或外部命令,也不是可运行的程序或批处理文件

mysql 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件 前言描述1、&#x1f331;环境变量配置&#xff08;高级系统设置&#xff09;&#xff1a;2、&#x1f331;环境变量配置&#xff08;系统属性&#xff09;&#xff1a;3、&#x1f331;环境变量配置&…

极客说|利用 Azure AI Agent Service 创建自定义 VS Code Chat participant

作者&#xff1a;卢建晖 - 微软高级云技术布道师 「极客说」 是一档专注 AI 时代开发者分享的专栏&#xff0c;我们邀请来自微软以及技术社区专家&#xff0c;带来最前沿的技术干货与实践经验。在这里&#xff0c;您将看到深度教程、最佳实践和创新解决方案。关注「极客说」&a…

在rtthread中,scons构建时,它是怎么知道是从rtconfig.h找宏定义,而不是从其他头文件找?

在rtthread源码中&#xff0c;每一个bsp芯片板级目录下都有一个 SConstruct scons构建脚本的入口&#xff0c; 在这里把rtthread tools/目录下的所有模块都添加到了系统路径中&#xff1a; 在tools下所有模块中&#xff0c;最重要的是building.py模块&#xff0c;在此脚本里面…

Redis基础--常用数据结构的命令及底层编码

零.前置知识 关于时间复杂度,按照以下视角看待. redis整体key的个数 -- O(N)当前key对应的value中的元素个数 -- O(N)当前命令行中key的个数 -- O(1) 一.string 1.1string类型常用命令 1.2string类型内部编码 二.Hash 哈希 2.1hash类型常用命令 2.2hash类型内部编码 2.3ha…

【leetcode100】岛屿的最大面积

1、题目描述 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0&#xff08;代表水&#xff09;包围着。 岛屿的面积…

将仓库A分支同步到仓库B分支,并且同步commit提交

一、 问题 有一仓库A 和 一仓库B&#xff0c; 需要将仓库A分支a1所有提交同步推送到仓库B分支b1上 二、 解决 2.1、 首先需要仓库A、仓库B的权限&#xff0c; 2.2、将仓库A clone到本地&#xff0c; 进入A目录&#xff0c;并且切换到a1分支 cd A ## A 为A仓库clone到本地代…

Matplotlib基础01( 基本绘图函数/多图布局/图形嵌套/绘图属性)

Matplotlib基础 Matplotlib是一个用于绘制静态、动态和交互式图表的Python库&#xff0c;广泛应用于数据可视化领域。它是Python中最常用的绘图库之一&#xff0c;提供了多种功能&#xff0c;可以生成高质量的图表。 Matplotlib是数据分析、机器学习等领域数据可视化的重要工…