[单片机框架][bsp层][cx32l003][bsp_tim] Baes TIM 基础定时器配置和使用

news2024/9/21 22:49:19

文章目录

  • 一、基础定时器介绍
  • 二、功能描述
    • (1) Buzzer 功能
  • 三、示例代码(PWM)

一、基础定时器介绍

基础定时器 Base Timer 包含两个定时器 TIM10/11。TIM10/11 功能完全相同。TIM10/11 是同步定时/计数器,可以作为 16/32 位自动重装载功能的定时/计数器,也可以作为16/32 位无重载功能的定时/计数器。TIM10/11 可以对外部脉冲进行计数或者实现系统定时。

在这里插入图片描述

二、功能描述

  1. TIM10/11 每个定时/计数器都有独立的控制启动信号、外部输入时钟和门控信号。
    当 TIM10/11 使用 EXT、GATE 来进行计数功能时,EXT 用于计数器的外部输入时钟信号,GATE 用于有效电平计数使能信号。
  2. 当门控功能使能后,当且仅当外部输入 GATE 电平有效时,计数器才会计数,否则计数器处于保持状态。
  3. 门控使能使用 TIMx_CR.GATE_EN 控制。默认门控功能关闭。
  4. 门控电平选择使用 TIMx_CR.GATE_P 控制。默认高电平为门控有效电平;设置 TIMx_CR.GATE_P 为 1后,门控低电平为有效电平。
  5. 当 TIM10/11 使用 PCLK,GATE 来进行定时功能时,PCLK 用于定时器的内部输入时钟信号,GATE可用于有效电平定时使能信号。
  6. 当门控功使能后,当且仅当外部输入 GATE 电平有效时,定时器才会计数,否则定时器处于定时计数器停止状态。
  7. 门控使能使用 TIMx_CR.GATE_EN 控制。默认门控功能关闭。
  8. 门控电平选择使用 TIMx_CR.GATE_P 控制。默认高电平为门控有效电平;设置为 1 后门控有效电平是低电平。定时功能可以配置预除频。TIMx_CR.TMR_PRE 控制分频比。

(1) Buzzer 功能

  1. 通过定时器的翻转输出功能可以实现驱动 Buzzer 的功能。TIMx_CR.TOG_EN 为 1 时,TOG、TOGN输出反向。
  2. 设置 TIMx_CR.TOG_EN 为 0 可以同时设置端口 TOG、TOGN 输出为 0。
  3. 在计数时钟为4M 情况下 Buzzer 输出不同频率的 Timer 重载模式配置如下(16 位 Max=0xFFFF):

在这里插入图片描述

三、示例代码(PWM)

/********************************************************************************
* @file    bsp_tim.c
* @author  jianqiang.xue
* @version V1.1.0
* @date    2023-02-26
* @brief   本文件不再初始化GPIO,由APP_IO完成引脚初始化和复用。
********************************************************************************/
/* Public Includes ------------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "RTE_Components.h"
#include CMSIS_device_header

#include "bsp_gpio.h"
#include "bsp_tim.h"
#include "cx32l003_hal_basetim.h"
/* Private Includes ----------------------------------------------------------*/
#include "ls_gpio.h"
#include "ls_syscfg.h"

/* Private Define ------------------------------------------------------------*/
/* Private Typedef -----------------------------------------------------------*/

#if LS_TIM10_EN
BASETIM_HandleTypeDef *g_tim10_handle = NULL;
static uint8_t g_tim10_pwm_update_cnt = 0;
static bsp_base_tim_cfg_t *g_tim10_cfg = NULL;
#endif
/* Public function prototypes -----------------------------------------------*/

#if LS_TIM10_EN
#include "ls_gpio.h"
#include "ls_syscfg.h"
/**
 * @brief  TIM10初始化
 * @param  *cfg: 基础定时器配置
 * @retval 0--成功
 */
uint8_t bsp_tim10_init(bsp_base_tim_cfg_t *cfg) {
    if (g_tim10_handle) return 0; // 已经初始化过
    if (cfg == NULL) return 3; // 配置为空
    g_tim10_handle = malloc(sizeof(BASETIM_HandleTypeDef)); // 申请空间
    if (!g_tim10_handle) return 1; // TIM结构体无法申请空间
    memset(g_tim10_handle, 0, sizeof(BASETIM_HandleTypeDef));
    // 结构体赋值
    g_tim10_handle->Instance          = TIM10;
    g_tim10_handle->Init.CntTimSel    = BASETIM_TIMER_SELECT;          // CKD 时钟分频因子(Clock division)
    g_tim10_handle->Init.MaxCntLevel  = BASETIM_MAXCNTLEVEL_16BIT;     // TimerSize=0:max count value=0xFFFF;
    g_tim10_handle->Init.AutoReload   = BASETIM_AUTORELOAD_ENABLE; // 模式2自动重装载计数器/定时器
    g_tim10_handle->Init.OneShot      = BASETIM_REPEAT_MODE; // 重复模式
    g_tim10_handle->Init.Period       = BASETIM_MAXCNTVALUE_16BIT - HAL_RCC_GetPCLKFreq()/cfg->period;  // 重装载值 cfg->period
    g_tim10_handle->Init.Prescaler    = cfg->prescaler;   // 预分频 cfg->prescaler
    g_tim10_cfg = cfg;
    __HAL_RCC_BASETIM_CLK_ENABLE();
	HAL_BASETIM_Base_Init(g_tim10_handle);
	HAL_NVIC_EnableIRQ(TIM10_IRQn);
    return 0;
}

void bsp_tim10_set_pwm(uint8_t io, uint8_t val) {
    if (g_tim10_cfg == NULL) return;
    HAL_BASETIM_Base_Stop_IT(g_tim10_handle);
    if (g_tim10_cfg->io != io) {
        g_tim10_cfg->io = io;
    }
    if (g_tim10_cfg->cnt != val) {
        g_tim10_cfg->cnt = val;
    }
    if (io != 0xff) {
        HAL_BASETIM_Base_Start_IT(g_tim10_handle);
    }
}

void TIM10_IRQHandler(void) {
    /* TIM Update event */
    if (__HAL_BASETIM_GET_FLAG(g_tim10_handle) != RESET) {
        if (__HAL_BASETIM_GET_IT_SOURCE(g_tim10_handle) != RESET) {
            __HAL_BASETIM_CLEAR_IT(g_tim10_handle);
            if (g_tim10_cfg == NULL) return;
            if (g_tim10_cfg->io == 0xFF) {
                HAL_BASETIM_Base_Stop_IT(g_tim10_handle);
                return;
            }
            if (g_tim10_pwm_update_cnt++ < g_tim10_cfg->cnt) {
                bsp_gpio_set_pin(g_io_cfg[g_tim10_cfg->io].port, g_io_cfg[g_tim10_cfg->io].pin, BSP_GPIO_PIN_SET);
            } else if (g_tim10_pwm_update_cnt < g_tim10_cfg->period - g_tim10_cfg->cnt) {
                bsp_gpio_set_pin(g_io_cfg[g_tim10_cfg->io].port, g_io_cfg[g_tim10_cfg->io].pin, BSP_GPIO_PIN_RESET);
            } else {
                g_tim10_pwm_update_cnt = 0;
            }
        }
    }
}

#endif

/********************************************************************************
* @file    bsp_tim.c
* @author  jianqiang.xue
* @version V1.1.0
* @date    2023-02-26
* @brief   本文件不再初始化GPIO,由APP_IO完成引脚初始化和复用。
********************************************************************************/

#ifndef __BSP_TIM_H
#define __BSP_TIM_H

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include "ls_syscfg.h"
/* Private Define ------------------------------------------------------------*/

typedef struct {
    uint16_t prescaler;  // 预分频器的值(Prescaler value) 计数器的时钟频率(CK_CNT)等于 fCK_PSC/(PSC[15:0]+1)。
    uint16_t freq; // 单位hz,freq对应的period: 750--15  1000--20 1500--30  2000--40  3000--60  6000--120
    uint16_t period;     // 周期     作为PWM时,决定了PWM的分辨率
    uint8_t level_logic; // 有效电平   0--低电平  1--高电平
    uint8_t io;  // IO_ID
    uint16_t cnt; // 计数器的值(Counter value)--CNT
} bsp_base_tim_cfg_t; // 模拟PWM
/* Private Typedef -----------------------------------------------------------*/

/* Public Function Prototypes ------------------------------------------------*/
#if LS_TIM10_EN
uint8_t bsp_tim10_init(bsp_base_tim_cfg_t *cfg);
void bsp_tim10_set_pwm(uint8_t io, uint8_t val);
#endif
#endif

#if LS_TIM10_EN
bsp_base_tim_cfg_t g_tim10_cfg = {
    .prescaler = LS_TIM10_PRESCALER,
    .freq = LS_TIM10_FREQ,
    .period = LS_TIM10_PERIOD,
    .level_logic = LS_TIM10_LEVEL_LOGIC};
#endif
bsp_tim10_init(&g_tim10_cfg);

// 将LED0亮度设置50%
bsp_tim10_set_pwm(LED0, g_tim10_cfg.period/2);

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

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

相关文章

VS2022配置GDAL

GDAL&#xff08;Geospatial Data Abstraction Library&#xff09;是一个用于处理地理空间数据的开源库。它提供了一组功能丰富的API&#xff0c;用于读取、写入、转换和处理各种地理空间数据格式&#xff0c;包括栅格数据&#xff08;如卫星图像、数字高程模型&#xff09;和…

Jupyter创建Anaconda多个虚拟环境教程

这里写目录标题 1.1界面化创建虚拟环境1.2命令行创建虚拟环境2.查看是否创建成功3.激活虚拟环境pylessonppt4.更改工作目录5.删除6.查看是否删除成功 1.1界面化创建虚拟环境 1.2命令行创建虚拟环境 conda create -n myenv——name pythonx.xmyenv-name:自己定义的环境名称 pyt…

fastjson反序列化漏洞复现

fastjson反序列化漏洞复现 一.影响版本: Fastjson<1.2.24二.实验过程图三.实验步骤四&#xff0c;实验结果以及参考链接 一.影响版本: Fastjson<1.2.24 二.实验过程图 (踩坑) rmijndi环境&#xff1a;java.sql.SQLException: JdbcRowSet (连接) JNDI 无法连接 2、ldapjn…

上海无纺布制造商【盈兹】申请纳斯达克IPO上市,募资1100万美元

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;来自上海的无纺布制造商【盈兹】&#xff0c;近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&#xff0c;股票代码为&#xff08;ETZ&#…

Invalid bound statement (not found)的原因以及解决方法

相信我们在学习Mybatis的时候都出现过 Invalid bound statement (not found) 这个错误&#xff0c;一般由以下几种可能导致这个错误 一&#xff1a;mapper方法名 和 mapper.xml id名不对应 例如&#xff1a; mapper&#xff1a; 对应的mapper.xml 这里建议小伙伴们下载一个插…

Linux中的YUM源仓库和NFS文件共享服务

这里写目录标题 一 、YUM仓库源的介绍和相关信息1.1yum相关介绍1.2 Linux系统各家厂商用的安装源1.3 yum下载方式 二 、 yum 仓库源的三种搭建2.1yum 配置本地源2.2创建ftp源2.3 配置http源2.4 配置yum在线源 三 、NFS的简介3.1 什么是NFS3.2 linux中要使用NFS需要下载的软件包…

User Diverse Preference Modeling by Multimodal Attentive Metric Learning

BACKGROUND 现有模型通常采用一个固定向量去表示用户偏好&#xff0c;在假设——特征向量每一个维度都代表了用户的一种特性或者一个方面&#xff0c;这种方式似乎不妥&#xff0c;因为用户对于不同物品的偏好是不一样的&#xff0c;例如因演员喜欢一部电影&#xff0c;而因特…

C++中的vector容器

文章目录 vector的介绍vector的使用vector的定义vector初始化vector iterator的使用vector空间增长问题vector增删改查vector迭代器失效问题 vector的介绍 vector是封装动态数组的顺序容器。   就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。这也就意味着我…

Java核心技术 卷1-总结-15

自己实现的hashCode方法应该与equals方法兼容 Java核心技术 卷1-总结-15 视图与包装器子范围不可修改的视图同步视图受查视图 并发线程状态新创建线程可运行线程被阻塞线程和等待线程被终止的线程 视图与包装器 子范围 可以为很多集合建立子范围&#xff08;subrange&#x…

机器学习——朴素贝叶斯

目录 一、贝叶斯 1.什么是贝叶斯 3.贝叶斯下的朴素贝叶斯 二、朴素贝叶斯 1.高斯朴素贝叶斯 2.伯努利朴素贝叶斯 3.多项式朴素贝叶斯 前言 在所有的机器学习分类算法中&#xff0c;朴素贝叶斯和其他绝大多数的分类算法都不同。对于大多数的分类算法&#xff0c;比如决策…

【业务数据分析】—— 用户留存分析(以挖掘Aha时刻为例)

目录 一、用户留存是什么 二、为什么要考虑用户留存 1、为什么要考虑用户留存&#xff1f; 2、影响用户留存的可能因素 3、用户留存的3个阶段 三、怎么进行用户留存分析(挖掘Aha时刻) 1、Aha时刻 2、Aha时刻的作用 3、挖掘Aha时刻 一、用户留存是什么 在互联网行业中…

Three——二、加强对三维空间的认识

Three——二、加强对三维空间的认识 接上个例子我们接着往下看 辅助观察坐标系 THREE.AxesHelper()的参数表示坐标系坐标轴线段尺寸大小&#xff0c;你可以根据需要改变尺寸。 使用方法&#xff1a; // AxesHelper&#xff1a;辅助观察的坐标系 const axesHelper new THRE…

Jetson nano B01学习笔记 -- 系统环境配置以及ROS安装

文章目录 一、Jetson nano 简介二、 系统环境配置1、系统镜像烧录2、CUDA环境配置 三、 ROS安装和环境配置总结 一、Jetson nano 简介 Jetson Nano是一款体积小巧、功能强大的人工智能嵌入式开发板&#xff0c;于2019年3月由英伟达推出。它预装Ubuntu 18.04LTS系统&#xff0c;…

有什么好用的远程工具吗

沟通在任何类型的工作中都扮演着重要的角色。但当谈到远程工作时&#xff0c;这一点就更为重要。因此&#xff0c;您的组织必须找到可以让您的团队保持一致的工具。 在某些方面&#xff0c;项目管理扮演着类似的角色。 您会注意到&#xff0c;下面的大多数工具都会直接影响您的…

Android进阶宝典—Koin使用和原理分析

一、理解设计模式 控制反转 是面向对象编程中的一种设计原则&#xff0c;可以用来减低计算机代码之间的耦合度。 实现控制反转最常见的方式叫做依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;&#xff0c;依赖注入(Dependency Injection)和控制反…

提高硬件设计能力的学习路线

不懂硬件的人&#xff0c;会觉得硬件高深莫测&#xff0c;“为什么他改几个电阻、电容就调出来&#xff0c;我弄个半天没搞定&#xff1f;”&#xff0c;“噢&#xff0c;靠的是经验”&#xff0c;但是经验又是什么呢&#xff1f;不能形容&#xff0c;反正就是不明觉厉。 就是…

Git(版本控制:前端git使用全流程)

1.版本控制&#xff08;简单理解&#xff1a;就是软件对每次操作之后提交的记录&#xff09; 文件版本 版本控制软件 版本控制的好处 版本控制的分类 本地版本控制系统 集中化版本控制系统 分布式版本控制系统 2. Git基础概念与工作流程 什么是Git&#xff1f; 开源的…

单片机编程中的裸机编程和多任务系统FreeRTOS系统详解,以及怎么学习FreeRTOS,看哪家的教程?(合集)

单片机编程中的裸机系统和多任务系统 学习了那么久的stm32还停留在裸机&#xff1f;&#xff1f;&#xff1f; 单片机编程中的裸机系统和多任务系统.1 裸机系统1.1轮询系统1.2 前后台系统 2 多任务操作系统3 为什么要学习多任务操作系统&#xff1f;&#xff1f;4 怎么学习Free…

诊断CAPL自动化(6) —— 诊断自动化测试,实战演示

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe,博客目录大全,点击跳转👉 下图是UDS协议测试的部分测试用例,该表格在文章末尾网盘自己获取经过前面几…

Cesium实践(4)——空间数据加载

文章目录 前言几何形体点线面体 标签文字图标 几何文件GeoJsonKMLCZML 三维模型总结 前言 本文介绍Cesium如何加载空间数据&#xff0c;空间数据即明确定义在三维空间中的数据&#xff0c;空间数据包括以下几类&#xff1a;1、几何形体&#xff08;点、线、面、体&#xff09;…