STM32实验-高级定时器输出指定个数PWM

news2024/9/23 19:20:54

STM32F103ZET6中有TIM1,TIM8两个高级定时器,每一定时器都有

1、一个16位向上、向下、向上/下自动装载计数器
2、一个16位预分频器和四个独立从输入输出通道
3、每一个通道都可用于输入捕获、输出比较、PWM和单脉冲模式(除了基本定时器,高级定时器和通用定时器都能产生PWM)

当高级计时器发生溢出的时候都能使重复计数器减一,当重复计数器减到0之后,再发生一次计时器溢出,就会导致一次事件更新。

如下图所示,当RCR寄存器数据为0时候,每次计数器溢出都会导致事件更新;当RCR寄存器数据为2时候,当发生2次计数器溢出的时候,再发生一次溢出就会触发事件触发,即每3次溢出都会发生一次事件更新。如果设置了软件更新重新同步,则会导致软件更新的时候会直接触发重复计数器和基本计时器重置。

PWM的周期和基本定时器一样是Tout=(ARR+1)*(PSC+1)/Ft(Ft=72M)

实验要求是通过定时器8通道1输出指定个数PWM输出,用于控制LED1的输出。

我们已经知道LED1的引脚是PE5,查询引脚图我们会得知TIM8_CH1对应引脚为PC6。

 接下来编写我们的实验代码。

先编写头文件代码atim.h:

#ifndef __ATIM_H
#define __ATIM_H

#include "./SYSTEM/sys/sys.h"

extern TIM_HandleTypeDef g_timx_pwm_chy_handle;

void atim_timx_npwm_chy_init(uint16_t arr, uint16_t psc);
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim);
void atim_timx_npwm_chy_set(uint8_t npwm);
void TIM8_UP_IRQHandler(void);
void HAL_TIM_PeriodElapseCallback(TIM_HandleTypeDef *htim);

#endif

再编写函数程序文件atim.c:

#include "./BSP/GTIM/gtim.h"
#include "./BSP/LED/led.h"

TIM_HandleTypeDef g_timx_npwm_chy_handle;

static uint8_t g_npwm_remain = 0;
 
void atim_timx_npwm_chy_init(uint16_t arr, uint16_t psc){
 
    TIM_OC_InitTypeDef timx_oc_npwm_chy = {0};
 
    g_timx_npwm_chy_handle.Instance = TIM8;
    g_timx_npwm_chy_handel.Init.Prescaler = psc;
    g_timx_npwm_chy_handle.Init.Period = arr;
    g_timx_npwm_chy_handle.Init.CounterMode = TIM_COUNTERMODE_UP;//向上计数模式
    HAL_TIM_PWM_Init(&g_timx_npwm_chy_handle);
 
    timx_oc_npwm_chy.OCMode = TIM_OCMODE_PWM1;//选择PWM1模式
    timx_oc_npwm_chy.Pulse = arr / 2;//设置占空比的比较值
    timx_oc_npwm_chy.OCPolarity = TIM_OCPOLARITY_HIGH;//输出极性:高极性
    HAL_TIM_PWM_ConfigChannel(&g_timx_npwm_chy_handle, &timx_oc_npwm_chy, TIM_CHANNEL_1);
 
    __HAL_RCC_GPIOE_CLK_ENABLE();
    gpio_init_struct.Pin = GPIO_PIN_5;
    gpio_init_struct.Mode = GPIO_MODE_INPUT;
    gpio_init_struct.Pull = GPIO_PULLUP;
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOE, &gpio_init_struct);

    __HAL_TIM_ENABLE_IT(&g_timx_npwm_chy_handle, TIM_IT_UPDATE);
    HAL_TIM_PWM_Start(&g_timx_npwm_chy_handle, TIM_CHANNEL_1);
}
 
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim){
 
    if(htim->Instance == TIM8){
        GPIO_InitTypeDef gpio_init_struct;
        __HAL_RCC_GPIOC_CLK_ENABLE();
        __HAL_RCC_TIM8_CLK_ENABLE();
 
        
        gpio_init_struct.Pin = GPIO_PIN_6;
        gpio_init_struct.Mode = GPIO_MODE_AF_PP;
        gpio_init_struct.Pull = GPIO_PULLUP;
        gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOC, &gpio_init_struct);
 
        __HAL_RCC_AFIO_CLK_ENABLE();
        __HAL_AFIO_REMAP_TIM8_PARTIAL();
        HAL_NVIC_SetPriority(TIM8_UP_IRQn, 1, 3);
        HAL_NVIC_ENABLEIRQ(TIM8_UP_IRQn);
    }
}

void atim_timx_npwm_chy_set(uint8_t npwm){

    if(npwm == 0)return;

    g_npwm_remain = npwm;
    HAL_TIM_GenerateEvent(&g_timx_npwm_chy_handle, TIM_EVENTSOURCE_UPDATE);
}

void TIM8_UP_IRQHandler(void){

    HAL_TIM_IRQHandler(&g_timx_npwm_chy_handle);
}

void HAL_TIM_PeriodElapseCallback(TIM_HandleTypeDef *htim){

    if(htim->Instance == TIM8){
        if(g_npwm_remain){
            TIM8->RCR = g_npwm_remain - 1;
            HAL_TIM_GenerateEvent(&g_timx_npwm_chy_handle, TIM_EVENTSOURCE_UPDATE);
            __HAL_TIM_ENABLE(&g_timx_npwm_chy_handle);
            g_npwm_remain = 0;
        }
        else{
            TIM8->RC1 &= ~(1 << 0);
        }
    }
}

再编写主函数的代码main.c:

#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/ATIM/atim.h"
 
int main(void){

    uint8_t key = 0;
    uint8_t t = 0;

    HAL_Init();
    sys_stm32_clock_init(RCC_PLL_MUL9);
    delay_init(72);
    led_init();
    key_init();
    usart_init(115200);
    atim_timx_pwm_chy_init(5000 - 1, 7200 - 1);

    atim_timx_npwm_chy_set(5);
 
    while(1){
        key = key_scan(0);
        if(key == KEY0_PRES){
            atim_timx_npwm_chy_set(10);
        }
    }
}

这样我们的实验代码就写完了。

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

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

相关文章

Cesium-源码修改-gltf增加纹理贴图改变3dtiles外观

一、需求 Cesium支持加载gltf和3dtiles等三维数据模型&#xff0c;实现了很好的封装&#xff0c;往往只需要给一个uri就能加载模型文件&#xff0c;并实现贴图渲染等。但是好的封装带来的问题是如果开发者想要自定义贴图&#xff0c;那该怎么办&#xff1f;不得不从源码入手。 …

条码控件Aspose.BarCode入门教程(6):如何在C# 中生成GS1-128 条码

Aspose.BarCode for .NET 是一个功能强大的API&#xff0c;可以从任意角度生成和识别多种图像类型的一维和二维条形码。开发人员可以轻松添加条形码生成和识别功能&#xff0c;以及在.NET应用程序中将生成的条形码导出为高质量的图像格式。 Aspose API支持流行文件格式处理&am…

三、Golang环境搭建及打包和工具链

一、环境搭建 从https://golang.google.cn/dl/下载安装即可 新建GO_HOME 系统环境变量&#xff0c;指向go的安装目录 在终端输入go dev即可测试有无安装成功 二、包 所有Go程序的程序都会组织成若干组文件&#xff0c;每组文件被称为一个包。每个包的代码都可以作为很小的复用…

webpack 5 实战(1)

一、为什么使用webpack 个人将前端开发分为三个阶段&#xff1a; 1.1 Web1.0 Web1.0前端主要工作&#xff1a; 前端主要编写静态页面对于JavaScript的使用&#xff0c;主要是进行表单验证和动画效果制作 1.2 Web2.0之AJAX 伴随着AJAX的诞生&#xff0c;前端的工作模式也发…

什么牌子的蓝牙耳机音质最好?盘点2023音质最好的蓝牙耳机

近几年&#xff0c;蓝牙耳机在日常生活中的出现频率越来越高&#xff0c;不管是运动、听歌、追剧、玩游戏等等都能看到蓝牙耳机的身影。接下来&#xff0c;我来给大家盘点几款音质好的蓝牙耳机&#xff0c;感兴趣的朋友可以了解一下。 一、南卡小音舱Lite2蓝牙耳机 参考价&…

使用 WSL 在 Windows 上安装 Linux提示无法解析服务器的名称或地址及0x80370114问题解决

开发人员可以通过WSL在windows电脑上安装Linux发行版&#xff0c;并可以直接在电脑上使用Linux应用程序、实用程序和Bash命令行工具等。 先决条件 必须运行 Windows 10 版本 2004 及更高版本&#xff08;内部版本 19041 及更高版本&#xff09;或 Windows 11 才能使用以下命令…

结合企业实践来规范你的Git commit(含插件使用指南)

&#x1f3c6; 文章目标&#xff1a;了解通用的Git commit规范&#xff0c;并在企业的团队内部进行实践。 &#x1f340; 如何规范你的Git commit&#xff08;理论结合企业的实践&#xff09; ✅ 创作者&#xff1a;Jay… &#x1f389; 个人主页&#xff1a;Jay的个人主页 &am…

论文学习——数据挖掘技术在水文数据分析中的应用

文章目录0 引言1 数据挖掘技术及工具1.1 什么是数据挖掘&#xff1f;1.2 数据挖掘的过程&#xff1f;1.3 常用的数据挖掘技术1.4 ODM2 水文数据分析系统功能设计3 系统实现与应用3.1 数据获取与清理3.2 模型建立4 结语2012年12月 计算机工程与设计 0 引言 洪水是现实生活中频发…

数据结构_第十三关(3):归并排序

目录 归并排序 1.基本思想&#xff1a; 2.原理图&#xff1a; 1&#xff09;分解合并 2&#xff09;数组比较和归并方法&#xff1a; 3.代码实现&#xff08;递归方式&#xff09;&#xff1a; 归并排序的非递归方式 原理&#xff1a; 情况1&#xff1a; 情况2&#…

《剑指大前端全栈工程师》--大前端时代全站式开发,直指大厂P7技术专家

【内容提要】 实力打造大前端时代&#xff0c;走在时代的钱端&#xff01;   实战驱动教学&#xff0c;探索前端黑科技。紧跟企业实际技术选型&#xff0c;追求技术的实用性与前瞻性完美结合&#xff01;   本书对大前端技术栈进行了全面的讲解&#xff0c;内容涉及HTML5CS…

AI产品铺天盖地,企业却用不上?

近年来,随着人工智能技术的飞速发展,越来越多的企业开始关注并尝试使用人工智能技术来提高业务效率和降低成本。然而,国内企业使用人工智能技术仍然存在一些困难和问题,主要原因如下: 国外产品不稳定或不安全 目前国内市场上存在许多国外的AI产品,例如ChatGPT、GPT-4等,但这些…

QT CTK控件 CTK开发(二)

CTK 为支持生物医学图像计算的公共开发包,其全称为 Common Toolkit。为医学成像提供一组统一的基本功能;促进代码和数据的交互及结合;避免重复开发;在工具包(医学成像)范围内不断扩展到新任务,而不会增加现有任务的负担;整合并适应成功的解决方案。 本专栏文章较为全面…

教你如何搭建物业-后勤管理系统,demo可分享

1、简介 1.1、案例简介 本文将介绍&#xff0c;如何搭建物业-后勤管理。 1.2、应用场景 该应用包含疫情上报、绿化、安保等管理功能。 2、设置方法 2.1、表单搭建 1&#xff09;新建表单【返区登记】&#xff0c;字段设置如下&#xff1a; 名称类型名称类型姓名单行文本…

【历史上的今天】3 月 17 日:苹果起诉微软;CN 域名开放注册;赛博朋克之父出生

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 3 月 17 日&#xff0c;在 1958 年的今天&#xff0c;我国第一台黑白电视机诞生。当时&#xff0c;我国电视机研制技术与日本基本处在同一起跑线&#xff0c;是…

四十六、docker-compose部署

一个项目肯定包含多个容器&#xff0c;每个容器都手动单独部署肯定费时费力。docker-compose可以通过脚本来批量构建镜像和启动容器&#xff0c;快速的部署项目。 使用docker-compose部署主要是编写docker-compose.yml脚本。 一、项目结构 不论是Dockerfile还是docker-compo…

如果你想从事人工智能职业,学习Python吧

人工智能并不会抢走你的工作&#xff0c;至少目前还不会。人工智能和机器学习&#xff08;AI/ML&#xff09;最好的应用是补充人类的创造力&#xff0c;而不是取代它。具有讽刺意味的是&#xff0c;最好的大型语言模型&#xff08;LLMs&#xff09;可能是通过使用受版权保护的人…

本地环境配置自签名HTTPS证书

在本地使用的线上的https证书的话&#xff0c;每三个月需要更新一次比较繁琐&#xff0c;用本地证书也可以满足调试需求也会方便许多 下载签名工具&#xff1a; https://github.com/FiloSottile/mkcert/releases/tag/v1.4.4 根据需求下载对应系统的版本&#xff0c;以64位的win…

有奖征文|小鱼再进化!OceanBase 4.1免费体验

OceanBase 4.0&#xff08;小鱼&#xff09;的首次亮相是在 2022 年 8 月&#xff0c;作为业内首个单机分布式一体化架构的数据库&#xff0c;4.0 版本兼顾了分布式架构的扩展性和集中式架构的性能优势&#xff0c;在同等硬件条件下实现单机性能赶超集中式数据库的同时&#xf…

【分享】群报数入驻集简云平台,实现无代码集成数百款应用

群报数介绍 群报数是一款人人可用的轻量化统计小程序&#xff0c;支持填表、报名、接龙、预约、打卡、问卷、通知等多种场景。 群报数集简云使用场景 企业的用户信息&#xff0c;人才信息往往在很多不同的系统里&#xff0c;比如CRM系统&#xff0c;客服系统&#xff0c;人力…

打造智慧医疗新生态:互联网医院系统源码分析

在数字化时代&#xff0c;医疗行业也在不断地探索新的模式和方法&#xff0c;以更好地服务于人民群众。互联网医院系统作为一种新型医疗服务模式&#xff0c;受到了广泛的关注和热议。下文&#xff0c;小编将为大家介绍互联网医院系统的概念、特点以及如何利用互联网医院系统源…