Air001 TIM1高级定时器单脉冲输出模式使用

news2024/11/15 11:07:07

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 Configuration
    TIM1_CH1 ------> GPIO_AF13_TIM1----->PA3
		TIM1_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 PA3
    HAL_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 PB3
    HAL_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

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

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

相关文章

C++ 黑马程序员通讯录管理系统源码

/* 通讯录管理系统 通讯录是一个可以记录亲人、好友信息的工具。 本教程主要利用C来实现一个通讯录管理系统系统中需要实现的功能如下: 添加联系人:向通讯录中添加新人,信息包括 (姓名、性别、年龄、联系电话、家庭住址))最多记录1000人 显示联系人:显示通讯录中所有…

前端开发工具vscode

一、下载安装 https://code.visualstudio.com/ 二、安装插件 三、使用 ①、创建一个空目录 ②、利用vscode工具打开该目录 ③、将该目录设置为工作区 在工作区中添加文件,还可以进行浏览器访问(提前安装了Live Server插件)

linux下安装ffmpeg的详细教程、ffmpeg is not installed

1、下载解压 wget http://www.ffmpeg.org/releases/ffmpeg-6.0.tar.gz tar -zxvf ffmpeg-6.0.tar.gz 2、 进入解压后目录,输入如下命令/usr/local/ffmpeg为自己指定的安装目录 cd ffmpeg-6.0 ./configure --prefix/usr/local/ffmpeg make sudo make install 3、配置变量 v…

在Windows下自己从源码编译Python3.10.13成安装包

文章目录 (一)Python 3.10 的生命周期(一)下载源码(二)准备环境(三)编译(3.1)解压源码到目录(3.2)下载依赖(PCBuild&#…

推荐一款AI写作大师、问答、绘画工具-「智元兔 AI」

在当今技术飞速发展的时代,人工智能(Artificial Intelligence,简称AI)的应用已经深入到各个领域。其中,AI写作大师、问答、绘画工具是备受关注和追捧的热门应用之一。在众多的选择中,有一款笔者在使用过程中…

分享一下做一个电商小程序可以实现什么功能

电商小程序是一种基于微信小程序平台的电子商务应用,它可以帮助商家展示商品信息、提供在线支付、订单管理等功能,从而吸引更多的用户进行消费。本文将介绍电商小程序可以实现的一些主要功能,以帮助读者了解其优势和应用场景。 商品展示与搜索…

AWS SAP-C02教程3--网络资源

架构设计中网络也是少不了的一个环节,而AWS有自身的网络结构和网络产品。本章中将带你看看AWS中不同网络产品,以及计算资源、存储资源等产品在网络架构中处于哪个位置,如何才能让它们与互联网互通、与其它产品互通。下图视图将SAP涉及到网络相关组件在一张图表示出来,图中可…

【LeetCode:201. 数字范围按位与 | 位运算】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

【藏经阁一起读(71)】读《阿里云 ClickHouse 企业版技术白皮书》

【藏经阁一起读(71)】读《阿里云 ClickHouse 企业版技术白皮书》 作者: Tom Schreiber 凤豪 卫寻 魏庄 本书由 ClickHouse 资深技术专家和产品联合撰写,全面介绍了ClickHouse企业版的云原生存算分离整体架构,详细介绍 …

HT for Web (Hightopo) 使用心得(3)- 吸附与锚点

吸附与锚点是 HT for Web 中两个比较重要的概念。这两个概念在执行交互和动画时会经常被用到。 吸附,顾名思义,是一个节点吸附到另一个节点上。就像船底的贝类一样,通过吸附到船身,在船移动的时候自己也会跟着移动;而…

Node.js 新特性 SEA/单文件可执行应用尝鲜

#1 关于 SEA 单文件可执行应用(SEA,Singe Executable Applications),是 Node.js 新版本的特性,最初在 v19.7.0、v18.16.0 加入,并在 v20.x 得到扩展。而上个月发布的全家桶 Bun.js,就自带了 SEA…

2023-2024-1-高级语言程序设计-简单程序设计(作业)

7-1 算术入门之加减乘除 分数 10 全屏浏览题目 切换布局 作者 周强 单位 青岛大学 对于输入的两个整数,按照要求输出其和差积商。 输入格式: 在一行内输入两个不超过100的非负整数a和b,中间以一个空格间隔,且保证b不为0。 输出格式: …

MySQL(存储过程,store procedure)——存储过程的前世今生 MySQL存储过程体验 MybatisPlus中使用存储过程

前言 SQL(Structured Query Language)是一种用于管理关系型数据库的标准化语言,它用于定义、操作和管理数据库中的数据。SQL是一种通用的语言,可以用于多种关系型数据库管理系统(RDBMS),如MySQ…

C语言系统化精讲(三): 运算符与表达式

文章目录 一、运算符与表达式1.1 运算符1.2 表达式 二、赋值运算符与赋值表达式2.1 赋值运算符2.2 赋值表达式 三、算术运算符与算术表达式3.1 算术运算符3.2 算术表达式3.3 自增/自减运算符 四、关系运算符与关系表达式4.1 关系运算符4.2 关系表达式 五、逻辑运算符与逻辑表达…

WIN10如何搭建自己的博客

引言: 路线说明: 在CSDN,博客园,简书等平台,可以直接在上面发表,用户交互做的好,写的文章百度也能搜索的到,这样速度也是最快的,不费心运营啥的。缺点是比较不自由&…

notepad++进行UTF-16编码的时候前面出现FFFE

文章目录 一、问题二、原因三、总结四、参考 一、问题 当我学习UTF-16编码时,我用notepadd进行学习,然后用二进制编辑器打开发现 我输入我时,按照编码规则,应该是62 11,但是却变成了4个字节,前面多了FFFE…

Elasticsearch 分片内部原理—近实时搜索、持久化变更

目录 一、近实时搜索 refresh API 二、持久化变更 flush API 一、近实时搜索 随着按段(per-segment)搜索的发展,一个新的文档从索引到可被搜索的延迟显著降低了。新文档在几分钟之内即可被检索,但这样还是不够快。 磁盘在这…

多输入多输出 | MATLAB实现CNN-BiLSTM-Attention卷积神经网络-双向长短期记忆网络结合SE注意力机制的多输入多输出预测

MATLAB实现CNN-BiLSTM-Attention卷积神经网络-双向长短期记忆网络结合SE注意力机制的多输入多输出预测 目录 MATLAB实现CNN-BiLSTM-Attention卷积神经网络-双向长短期记忆网络结合SE注意力机制的多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 C…

S/4 HANA 大白话 - 财务会计-2 总账主数据

接下来看看财务模块的一些具体操作。 总账相关主数据 公司每天运转,每天办公室有租金,有水电费,有桌椅板凳损坏,鼠标损坏要换,有产品买卖,有收入。那么所有这些都得记下来。记哪里?记在总账里…

NC56 自定义查询的维护

前言 昨天收到一个业务反馈,某公司自定义查询的销售订单、和手工核销的数据对不上了。于是进行了简单的排查和分析。顺带了解了 NC56 的自定义查询的维护方法。 操作位置 在【客户化 - 自定义查询 - 查询引擎 - 查询引擎管理 】找到对应的自定义查询。并且点击右…