Air001 TIM1高级定时器单脉冲输出模式使用
Air001 TIM1高级定时器单脉冲输出模式使用
- ✨本例程基于合宙官方提供的标准库以及Demo工程作为验证参考。
- 📍官方提供的SDK包资源:
https://gitee.com/openLuat/luatos-soc-air001 - 🌿想了解STM32高级定时器单脉冲输出模式了解可以参考阅读:
https://shequ.stmicroelectronics.cn/thread-622823-1-1.html - 🚩TIM1高级定时器基本功能:

📓Air001单脉冲模式简介
单脉冲模式(OPM)是之前所述众多模式中的一个特例。这种模式允许计数器响应一个激励,并在一个程序可控的延时之后,产生一个脉宽可被程序控制的脉冲。
- 🌿可以通过从模式控制器启动计数器,在输出比较模式或者 PWM 模式下产生波形。设置 TIMx_CR1 寄存器的 OPM 位将选择单脉冲模式,这样可以让计数器自动的在产生下一个更新事件 UEV 时停止。
- 🔖用户手册给出的例子说明:

- 例如,当需要在从 TI2 输入脚上检测到一个上升沿开始,延迟 tDELAY 之后,在 OC1 上产生一个长度为tPULSE 的正脉冲。
使用 TI2FP2 作为触发 1:
◼ 置 TIMx_CCMR1 寄存器中的 CC2S=01,把 TI2FP2 映像到 TI2。
◼ 置 TIMx_CCER 寄存器中的 CC2P=0,使 TI2FP2 能够检测上升沿。
◼ 置 TIMx_SMCR 寄存器中的 TS=110,TI2FP2 作为从模式控制器的触发(TRGI)。
◼ 置 TIMx_SMCR 寄存器中的 SMS=110(触发模式),TI2FP2 被用来启动计数器。
OPM 的波形由写入比较寄存器的数值决定(要考虑时钟频率和计数器预分频器)
◼ tDELAY 由 TIMx_CCR1 寄存器中的值定义。
◼ tPULSE 由自动装载值和比较值之间的差值定义(TIMx_ARR -TIMx_CCR1)。
◼ 假定当发生比较匹配时要产生从 0 到 1 的波形,当计数器达到预装载值时要产生一个从 1 到 0 的波形;首先要置TIMx_CCMR1 寄存器的OC1M=111,进入 PWM 模式 2;根据需要有选择地使能预装载寄存器:置TIMx_CCMR1 中的OC1PE=1 和TIMx_CR1 寄存器中的ARPE;然后在TIMx_CCR1 寄存器中填写比较值,在 TIMx_ARR 寄存器中填写自动装载值,设置 UG 位来产生一个更新事件,然后等待在 TI2 上的一个外部触发事件。本例中,CC1P=0。
在这个例子中,TIMx_CR1 寄存器中的 DIR 和 CMS 位应该置低。
因为只需要一个脉冲,所以必须设置 TIMx_CR1 寄存器中的 OPM=1,在下一个更新事件(当计数器从自动装载值翻转到 0)时停止计数。
📗实例测试工程
- ✨功能说明:使用TIM1定时器通道1作为信号输出,通道2作为输入信号,当检测到通道2,每接收到一个上升沿信号时,将延时80ms,输出一个20ms的高电平脉冲.(延时时间+高电平时间=计数器TIM1_ARR装载值以及TIM1_CCR1比较值)。
- ⚡需要注意的是,通道2的检测信号频率,不能超出输出通道1的频率,否则通道1输出的信号会被截断。根据本例程配置,通道2的信号间隔需要大于100ms。
- 🔰如需响应更高频率信号的接收和输出,可以将分频系数改小。(
TimHandle.Init.Prescaler)

- 🌿TIM1定时器通道1:
TIM1_CH1 ------> GPIO_AF13_TIM1----->PA3 - 🌿TIM1定时器通道2:
TIM1_CH2 ------> GPIO_AF1_TIM1----->PB3 - 🖍对应通道引脚配置初始化:
void TIM1_GPIO_Configuration(void)
{/**TIM GPIO ConfigurationTIM1_CH1 ------> GPIO_AF13_TIM1----->PA3TIM1_CH2 ------> GPIO_AF1_TIM1----->PB3*/GPIO_InitTypeDef GPIO_InitStruct;__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_3;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF13_TIM1;//TIM1通道1 PA3HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_3;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;//TIM1通道2 PB3HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
- 🛠定时器配置:
TIM_HandleTypeDef TimHandle;TIM_OnePulse_InitTypeDef sConfig;TimHandle.Instance = TIM1; /* 选择TIM1 */TimHandle.Init.Period = 1000; /* 自动重装载值0 - 0xffff*/TimHandle.Init.Prescaler = 800 - 1; /* 分频系数16MHz/800 */TimHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; /* 时钟不分频 */TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 向上计数 */TimHandle.Init.RepetitionCounter = 1-1; /* 不重复计数 */TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; /* 自动重装载寄存器没有缓冲 *//*TIM1单脉冲初始化*/if(HAL_TIM_OnePulse_Init(&TimHandle, TIM_OPMODE_SINGLE) != HAL_OK){Error_Handler();}sConfig.OCMode = TIM_OCMODE_PWM1; /* PWM模式1->TIM_OCPOLARITY_LOW PWM模式2->TIM_OCPOLARITY_HIGH */sConfig.OCPolarity = TIM_OCPOLARITY_LOW; /* OC输出低电平有效*/sConfig.Pulse = 200; /* 宽度 20ms*/sConfig.ICPolarity = TIM_ICPOLARITY_RISING; /* IC1捕获信号不反向 */sConfig.ICSelection = TIM_ICSELECTION_DIRECTTI; /* CC1 通道被配置为输入IC1映射在TI1上 */sConfig.ICFilter = 0; /* 不滤波 */sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH; /* OCN输出高电平有效 */sConfig.OCIdleState = TIM_OCIDLESTATE_RESET; /* 输出空闲状态1(OC1输出) */sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET; /* 输出空闲状态1(OC1N输出) *//*配置TIM1 单脉冲通道参数配置*/if(HAL_TIM_OnePulse_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1, TIM_CHANNEL_2) != HAL_OK)//通道1作为输出,通道2作为输入{Error_Handler();}/*配置TIM1 单脉冲启动*/if(HAL_TIM_OnePulse_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK)//通道1作为输出,通道2作为输入{Error_Handler();}
- 🔖也可以这样配置:
TIM_HandleTypeDef TimHandle;TIM_OnePulse_InitTypeDef sConfig;TimHandle.Instance = TIM1; /* 选择TIM1 */TimHandle.Init.Period = 1000; /* 自动重装载值0 - 0xffff*/TimHandle.Init.Prescaler = 800 - 1; /* 分频系数16MHz/800 */TimHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; /* 时钟不分频 */TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 向上计数 */TimHandle.Init.RepetitionCounter = 1-1; /* 不重复计数 */TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; /* 自动重装载寄存器没有缓冲 *//*TIM1单脉冲初始化*/if(HAL_TIM_OnePulse_Init(&TimHandle, TIM_OPMODE_SINGLE) != HAL_OK){Error_Handler();}sConfig.OCMode = TIM_OCMODE_PWM2; /* PWM模式1->TIM_OCPOLARITY_LOW PWM模式2->TIM_OCPOLARITY_HIGH */sConfig.OCPolarity = TIM_OCPOLARITY_HIGH; /* OC输出低电平有效*/sConfig.Pulse = 200; /* 宽度 20ms*/sConfig.ICPolarity = TIM_ICPOLARITY_RISING; /* IC1捕获信号不反向 */sConfig.ICSelection = TIM_ICSELECTION_DIRECTTI; /* CC1 通道被配置为输入IC1映射在TI1上 */sConfig.ICFilter = 0; /* 不滤波 */sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH; /* OCN输出高电平有效 */sConfig.OCIdleState = TIM_OCIDLESTATE_RESET; /* 输出空闲状态1(OC1输出) */sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET; /* 输出空闲状态1(OC1N输出) *//*配置TIM1 单脉冲通道参数配置*/if(HAL_TIM_OnePulse_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1, TIM_CHANNEL_2) != HAL_OK)//通道1作为输出,通道2作为输入{Error_Handler();}/*配置TIM1 单脉冲启动*/if(HAL_TIM_OnePulse_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK)//通道1作为输出,通道2作为输入{Error_Handler();}
📚测试工程:
链接:https://pan.baidu.com/s/1ebfm3hSOuJ5StIe-sh8Rwg
提取码:beda
相关文章:
Air001 TIM1高级定时器单脉冲输出模式使用
Air001 TIM1高级定时器单脉冲输出模式使用 ✨本例程基于合宙官方提供的标准库以及Demo工程作为验证参考。📍官方提供的SDK包资源:https://gitee.com/openLuat/luatos-soc-air001🌿想了解STM32高级定时器单脉冲输出模式了解可以参考阅读:https…...
矿机生意难做,比特大陆停发工资
文/章鱼哥 出品/陀螺财经 沉寂了许久的比特大陆,因为一则延迟发薪的公告引起了圈内热议,熊市下,曾经风头无两的比特大陆,现金流也会扛不住吗? 据吴说区块链报道,多名比特大陆内部员工确认,比特大…...
计算机竞赛python区块链实现 - proof of work工作量证明共识算法
文章目录 0 前言1 区块链基础1.1 比特币内部结构1.2 实现的区块链数据结构1.3 注意点1.4 区块链的核心-工作量证明算法1.4.1 拜占庭将军问题1.4.2 解决办法1.4.3 代码实现 2 快速实现一个区块链2.1 什么是区块链2.2 一个完整的快包含什么2.3 什么是挖矿2.4 工作量证明算法&…...
pyqt 划线标注工具,可用于车道线标注
目录 效果图: pyqt代码: opencv划线: 效果图: pyqt代码: import osfrom PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QPushButton, QLabel from PyQt5.QtGui import QPainter, QPen, QColor, QImage, QPixmap from PyQt5.QtCore import Qt, QPoint i…...
蓝桥等考Python组别十七级004
第一部分:选择题 1、Python L17 (15分) 运行下面程序,输出的结果是( )。 def func(x, y): return (x - y) // 2 print(func(10, 4)) 2356正确答案:B 2、Python L17 (15...
计算机毕业设计选什么题目好?springboot 职业技术学院图书管理系统
✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…...
外汇天眼:6个常见网络投资诈骗迹象,如发现任何一个,务必小心!
在这个数字时代,随着外汇和加密货币市场的不断发展,网络投资已经成为一种广受欢迎的理财方式。然而,近年来,诈骗犯罪也在不断增加,给社会带来了巨大的财务损失。尽管投资诈骗的手法各式各样,但它们都可以追…...
MyBatis的xml里#{}的参数为null报错、将null作为参数传递报错问题
今天在调试的过程中发现一个bug,把传入的参数写到查询分析器中执行没有问题,但是在程序中执行就报错:org.springframework.jdbc.UncategorizedSQLException : Error setting null parameter. Most JDBC drivers require that the JdbcType m…...
【网络安全】「漏洞原理」(一)SQL 注入漏洞之概念介绍
前言 严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。 【点击此处即可获…...
Go语言错误处理最佳实践
错误处理实践 我们在go语言中设计error的处理体系时候, 一般都会去做下面两点 直接使用errors.New()生成error接口的值 扩展error接口, 并定义扩展error接口的实现类型 error接口是什么? go语言的error是一个接口类型, 其源码如下: type error interface {Error() string…...
python结合excel数据轻松实现接口自动化测试
在刚刚进入测试行业的时候,最开始也是做功能测试,我想很多伙伴和我一样,觉得自动化测试都很高端,很神秘。迫不及待的想去学习作自动化测试。 以前比较常用数据库python做自动化,后面发现excel个人觉得更加适合&#x…...
构建精致 Chrome 插件:开箱即用的 TypeScript 模板 | 开源日报 No.51
tonsky/FiraCode Stars: 72.7k License: OFL-1.1 Fira Code 是一种免费的等宽字体,具有编程连字符。 Fira Code 提供了丰富多样的箭头和标点符号调整功能。Fira Code 支持各种不同的字符变体、风格集和其他字体特性,以满足用户个性化需求。Fira Code …...
在Windows下自己从源码编译Python3.10.13成安装包
文章目录 (一)Python 3.10 的生命周期(一)下载源码(二)准备环境(三)编译(3.1)解压源码到目录(3.2)下载依赖(PCBuild&#…...
WIN10如何搭建自己的博客
引言: 路线说明: 在CSDN,博客园,简书等平台,可以直接在上面发表,用户交互做的好,写的文章百度也能搜索的到,这样速度也是最快的,不费心运营啥的。缺点是比较不自由&…...
uniapp 首页制作
uniapp拨打固定的电话 function Hotline() {// 拨打电话uni.makePhoneCall({phoneNumber: 19969547693})}页面跳转 //普通跳转function homepage() {uni.navigateTo({url: /pages/homepage/homepage});}//二、uni.redirectTo关闭当前页面,跳转到应用内的某个页面。…...
意大利航天飞行器公司【Sidereus】完成510万欧元融资
来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,位于意大利萨莱诺的航天飞行器公司Sidereus Space Dynamics今日宣布已完成510万欧元融资。 本轮融资由Primo Space和CDP Venture Capital Sgr领投,通过Italia Venture II - Fondo Impr…...
10-网络篇-DHCP获取的参数详解
一个设备接入路由器局域网时,是通过DHCP获取网络信息,从而完成网络配置的获取。如下图所示为windows系统通过DHCP所要获取的网络配置:IP、子网掩码、网关、DNS服务器。任何设备要上网前,都需要知道这几个参数,下面对这…...
MVCC底层原理
MVCC多版本并发控制机制 多版本多个undo日志 什么时候会获取到事务id 事务id的生成并不是通过begin/start/transaction命令得到的,是在执行第一个修改操作或者加入排他锁操作,才会向mysql申请真正的事务id,mysql内部是严格按照事务的启动顺…...
云原生Docker容器管理
目录 docker容器的管理 容器创建 查看容器的运行状态 启动容器 创建并启动容器 终止容器运行 删除容器 容器的进入 查看容器详细信息 复制到容器中 从容器复制文件到主机 容器的导出与导入 导出 导入 相当于一个进程,性能接近于原生,几乎没有损…...
1.Cesium For Unity插件安装
1.Unity安装 先安装Unity Hub,然后在里面安装Unity。 2.新建工程 新建项目 选择项目类型 3. 导入Cesium包 打开新建的项目,在菜单栏选择Edit->Project Settings->Package Manager.并添加Cesium的包信息。 Name: Cesium URL: https://unity.pkg.cesium.com Sco…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
