【STM32H7教程】第34章 STM32H7的定时器应用之TIM1-TIM17的PWM实现

发布者:平安心境最新更新时间:2023-07-11 来源: zhihu关键字:STM32H7  PWM 手机看文章 扫描二维码
随时随地手机看文章

34.1 初学者重要提示

学习本章节前,务必优先学习第32章,HAL库的几个常用API均作了讲解和举例。

如果配置的GPIO引脚无法正确输出,注意本章2.1小节,保证是定时器复用支持的引脚。

STM32H7支持TIM1-TIM8,TIM12-TIM17共14个定时器,而中间的TIM9,TIM10,TIM11是不存在的,这点要注意。

STM32H7的PWM输出100MHz也是没问题的。输出效果见本章2.3小节。

34.2 定时器PWM的驱动设计

针对STM32H7的定时器PWM功能,专门设置了一个超级函数,用户可以方便的配置TIM1-TIM17所有定时器的PWM输出。


34.2.1 定时器PWM输出支持的引脚

STM32H7支持的PWM输出引脚如下(未整理互补输出引脚):


    TIM1_CH1,  PA8   PE9   PK1

    TIM1_CH2,  PA9   PE11

    TIM1_CH3,  PA10  PE13  PJ9

    TIM1_CH4,  PA11  PE14  PJ11


    TIM2_CH1,  PA0   PA5   PA15

    TIM2_CH2,  PA1   PB3  

    TIM2_CH3,  PA2

    TIM2_CH4,  PA3   PB11


    TIM3_CH1,  PA6   PC6  PB4

    TIM3_CH2,  PA7   PC7  PB5   

    TIM3_CH3,  PB0   PC8  

    TIM3_CH4,  PB1   PC9  


    TIM4_CH1,  PB6   PD12

    TIM4_CH2,  PB7   PD13

    TIM4_CH3,  PB8   PD14

    TIM4_CH4,  PB9   PD15


    TIM5_CH1,  PA0   PH10

    TIM5_CH2,  PA1   PH11

    TIM5_CH3,  PA2   PH12

    TIM5_CH4,  PA3   PI0


    TIM8_CH1,  PC6   PI5  PJ8

    TIM8_CH2,  PC7   PI6  PJ10

    TIM8_CH3,  PC8   PI7  PK0

    TIM8_CH4,  PC9   


    TIM12_CH1,  PB14  PH6

    TIM12_CH2,  PB15  PH9


    TIM13_CH1,  PF8


    TIM14_CH1,  PF9


    TIM15_CH1,  PE5 

    TIM15_CH2,  PE6


    TIM16_CH1,  PB8   PF6

    TIM16_CH2,  PF7


    TIM17_CH1,  PB9

使用时,直接配置定时器PWM模式,并配置相应引脚即可使用。


34.2.2 定时器PWM初始化

下面函数的作用是根据使用的是GPIO,使能相应的GPIO时钟。


1.    /*

2.    ******************************************************************************************************

3.    *    函 数 名: bsp_RCC_GPIO_Enable

4.    *    功能说明: 使能GPIO时钟

5.    *    形    参: GPIOx GPIOA - GPIOK

6.    *    返 回 值: 无

7.    ******************************************************************************************************

8.    */

9.    void bsp_RCC_GPIO_Enable(GPIO_TypeDef* GPIOx)

10.    {

11.        if (GPIOx == GPIOA) __HAL_RCC_GPIOA_CLK_ENABLE();

12.        else if (GPIOx == GPIOB) __HAL_RCC_GPIOB_CLK_ENABLE();

13.        else if (GPIOx == GPIOC) __HAL_RCC_GPIOC_CLK_ENABLE();

14.        else if (GPIOx == GPIOD) __HAL_RCC_GPIOD_CLK_ENABLE();

15.        else if (GPIOx == GPIOE) __HAL_RCC_GPIOE_CLK_ENABLE();

16.        else if (GPIOx == GPIOF) __HAL_RCC_GPIOF_CLK_ENABLE();

17.        else if (GPIOx == GPIOG) __HAL_RCC_GPIOG_CLK_ENABLE();

18.        else if (GPIOx == GPIOH) __HAL_RCC_GPIOH_CLK_ENABLE();

19.        else if (GPIOx == GPIOI) __HAL_RCC_GPIOI_CLK_ENABLE();

20.        else if (GPIOx == GPIOJ) __HAL_RCC_GPIOJ_CLK_ENABLE();

21.        else if (GPIOx == GPIOK) __HAL_RCC_GPIOK_CLK_ENABLE();

22.    }

下面函数的作用是根据使用的定时器,使能和禁止相应的定时器时钟。


1.    /*

2.    ******************************************************************************************************

3.    *    函 数 名: bsp_RCC_TIM_Enable

4.    *    功能说明: 使能TIM RCC 时钟

5.    *    形    参: TIMx TIM1 - TIM17

6.    *    返 回 值: 无

7.    ******************************************************************************************************

8.    */

9.    void bsp_RCC_TIM_Enable(TIM_TypeDef* TIMx)

10.    {

11.        if (TIMx == TIM1) __HAL_RCC_TIM1_CLK_ENABLE();

12.        else if (TIMx == TIM2) __HAL_RCC_TIM2_CLK_ENABLE();

13.        else if (TIMx == TIM3) __HAL_RCC_TIM3_CLK_ENABLE();

14.        else if (TIMx == TIM4) __HAL_RCC_TIM4_CLK_ENABLE();

15.        else if (TIMx == TIM5) __HAL_RCC_TIM5_CLK_ENABLE();

16.        else if (TIMx == TIM6) __HAL_RCC_TIM6_CLK_ENABLE();

17.        else if (TIMx == TIM7) __HAL_RCC_TIM7_CLK_ENABLE();

18.        else if (TIMx == TIM8) __HAL_RCC_TIM8_CLK_ENABLE();

19.    //    else if (TIMx == TIM9) __HAL_RCC_TIM9_CLK_ENABLE();

20.    //    else if (TIMx == TIM10) __HAL_RCC_TIM10_CLK_ENABLE();

21.    //    else if (TIMx == TIM11) __HAL_RCC_TIM11_CLK_ENABLE();

22.        else if (TIMx == TIM12) __HAL_RCC_TIM12_CLK_ENABLE();

23.        else if (TIMx == TIM13) __HAL_RCC_TIM13_CLK_ENABLE();

24.        else if (TIMx == TIM14) __HAL_RCC_TIM14_CLK_ENABLE();

25.        else if (TIMx == TIM15) __HAL_RCC_TIM15_CLK_ENABLE();

26.        else if (TIMx == TIM16) __HAL_RCC_TIM16_CLK_ENABLE();

27.        else if (TIMx == TIM17) __HAL_RCC_TIM17_CLK_ENABLE();    

28.        else

29.        {

30.            Error_Handler(__FILE__, __LINE__);

31.        }    

32.    }

33.    

34.    /*

35.    ******************************************************************************************************

36.    *    函 数 名: bsp_RCC_TIM_Disable

37.    *    功能说明: 关闭TIM RCC 时钟

38.    *    形    参: TIMx TIM1 - TIM17

39.    *    返 回 值: TIM外设时钟名

40.    ******************************************************************************************************

41.    */

42.    void bsp_RCC_TIM_Disable(TIM_TypeDef* TIMx)

43.    {

44.        /*

45.            APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14

46.            APB2 定时器有 TIM1, TIM8 , TIM15, TIM16,TIM17

47.        */

48.        if (TIMx == TIM1) __HAL_RCC_TIM3_CLK_DISABLE();

49.        else if (TIMx == TIM2) __HAL_RCC_TIM2_CLK_DISABLE();

50.        else if (TIMx == TIM3) __HAL_RCC_TIM3_CLK_DISABLE();

51.        else if (TIMx == TIM4) __HAL_RCC_TIM4_CLK_DISABLE();

52.        else if (TIMx == TIM5) __HAL_RCC_TIM5_CLK_DISABLE();

53.        else if (TIMx == TIM6) __HAL_RCC_TIM6_CLK_DISABLE();

54.        else if (TIMx == TIM7) __HAL_RCC_TIM7_CLK_DISABLE();

55.        else if (TIMx == TIM8) __HAL_RCC_TIM8_CLK_DISABLE();

56.    //    else if (TIMx == TIM9) __HAL_RCC_TIM9_CLK_DISABLE();

57.    //    else if (TIMx == TIM10) __HAL_RCC_TIM10_CLK_DISABLE();

58.    //    else if (TIMx == TIM11) __HAL_RCC_TIM11_CLK_DISABLE();

59.        else if (TIMx == TIM12) __HAL_RCC_TIM12_CLK_DISABLE();

60.        else if (TIMx == TIM13) __HAL_RCC_TIM13_CLK_DISABLE();

61.        else if (TIMx == TIM14) __HAL_RCC_TIM14_CLK_DISABLE();

62.        else if (TIMx == TIM15) __HAL_RCC_TIM15_CLK_DISABLE();

63.        else if (TIMx == TIM16) __HAL_RCC_TIM16_CLK_DISABLE();

64.        else if (TIMx == TIM17) __HAL_RCC_TIM17_CLK_DISABLE();

65.        else

66.        {

67.            Error_Handler(__FILE__, __LINE__);

68.        }

69.    }

配置定时器的PWM功能时,要是设置引脚的复用模式,下面函数就是起到这个作用。


1.    /*

2.    ******************************************************************************************************

3.    *    函 数 名: bsp_GetAFofTIM

4.    *    功能说明: 根据TIM 得到AF寄存器配置

5.    *    形    参: TIMx TIM1 - TIM17

6.    *    返 回 值: AF寄存器配置

7.    ******************************************************************************************************

8.    */

9.    uint8_t bsp_GetAFofTIM(TIM_TypeDef* TIMx)

10.    {

11.        uint8_t ret = 0;

12.    

13.        if (TIMx == TIM1) ret = GPIO_AF1_TIM1;

14.        else if (TIMx == TIM2) ret = GPIO_AF1_TIM2;

15.        else if (TIMx == TIM3) ret = GPIO_AF2_TIM3;

16.        else if (TIMx == TIM4) ret = GPIO_AF2_TIM4;

17.        else if (TIMx == TIM5) ret = GPIO_AF2_TIM5;

18.        else if (TIMx == TIM8) ret = GPIO_AF3_TIM8;

19.        else if (TIMx == TIM12) ret = GPIO_AF2_TIM12;

20.        else if (TIMx == TIM13) ret = GPIO_AF9_TIM13;

21.        else if (TIMx == TIM14) ret = GPIO_AF9_TIM14;

22.        else if (TIMx == TIM15) ret = GPIO_AF4_TIM15;

23.        else if (TIMx == TIM16) ret = GPIO_AF1_TIM16;

24.        else if (TIMx == TIM17) ret = GPIO_AF1_TIM17;

25.        else

26.        {

27.            Error_Handler(__FILE__, __LINE__);

[1] [2] [3] [4]
关键字:STM32H7  PWM 引用地址:【STM32H7教程】第34章 STM32H7的定时器应用之TIM1-TIM17的PWM实现

上一篇:【STM32H7教程】第35章 STM32H7的定时器应用之高精度单次延迟实现(支持TIM2,3,4和5)
下一篇:【STM32H7教程】第33章 STM32H7的定时器应用之TIM1-TIM17的中断实现

推荐阅读最新更新时间:2024-11-09 22:16

如何将ThreadX移植到STM32H7平台
前面我们将ThreadX成功移植到了STM32F4平台,但这只是我们的部分应用。我们希望将ThreadX的优势发挥到我们的更多应用中,所以在这一篇中我们就来实现将ThreadX移植到STM32H7平台中。 1、前期准备   在开始将ThreadX移植到STM32H7平台之前,我们需要做一些软硬件方面的准备。   首先,我们需要准备STM32H7的硬件平台。这次我们采用STM32H750VBT6为控制单元来作为目标平台。这是一款我们在实际项目中使用的,经过验证的,硬件能够稳定运行的平台。   其次,我们需要准备相应的软件资源,也就是ThreadX的源码。ThreadX的源码已经开源到Github上,其地址为: , /
[单片机]
如何将ThreadX移植到<font color='red'>STM32H7</font>平台
第四节:定时器中断及定时器产生PWM(用CubeMX学习STM32)
前言: STM32定时器概述 我演示用的STM32F407ZGt6的核心板有多达14个定时器;  其中包含两个高级定时器(TIM1和TIM8); 十个通用定时器(TIM2~TIM5, TIM9~TIM14); 两个基础定时器(TIM6、TIM7)。 Tips: 在十个通用定时器里面包含两个看门狗定时器(two watchdog timers) 下面是datasheet里面官方给出的介绍 Couter resolution— 计数器位数, 位数越高精度越高; Counter type — 计数类型 即向上计数还是向下计数 Prescaler factor — 分频因子, 对时钟的分频, 比如单片机的时钟为84MHz, 预
[单片机]
第四节:<font color='red'>定时器</font>中断及<font color='red'>定时器</font>产生<font color='red'>PWM</font>(用CubeMX学习STM32)
STM32实现灯的PWM输出以及定时器输入捕获频率和占空比
寄存器版本的实现 程序中的频率和占空比:频率控制在1KHZ----20KHZ,步进值为1KHZ,占空比控制在5%----90%内,步进值为5%。 程序的主要功能: 1.按键一:控制四个灯的PWM输出频率和占空比 2.按键二:改变频率大小。 3.按键三:选择一个通道。 4.按键四:改变按键三选择通道的占空比。 5.按键五:实现输入捕获频率和占空比(组内成员提供了关键思想)。 说明: 1.本次为了方便实现占空比的值为整数,默认给ARR的值+1,还希望不要误解; 2.代码里面输入捕获的实现用了全映射,通道三用来捕获的IO口被之前的按键占用,若读者想实现定时器的四路输入捕获,还请自行改变IO口,方便使用。 3.本次用更新中断来获取捕获的值
[单片机]
基于UC3842的三路输出小功率开关电源设计
电源是一切电子设备的动力心脏,其性能的优劣直接关系到整个系统的安全性和可靠性指标。开关电源以其效率高、体积小等优点,在通信、计算机及家用电器等领域得到广泛应用,特别是目前便携式设备市场需求巨大,DC-DC开关电源的需求也越来越大,性能要求也越来越高。因此设计和开发开高性能的开关电源具有很大的市场前景。本文以UC3842为PWM控制器设计了一种48V转+5V,±15V开关电源。 1、UC3842器件介绍及工作原理 UC3842是由Unitrode公司开发的新型控制器件,是国内应用比较广泛的一种电流控制型脉宽调制器,其结构原理图如图1所示,主要由振荡器、误差放大器、电流取样比较器、脉宽调制锁存器等功能模块构成。由于结构上有电压
[电源管理]
msp430 PWM周期计算
例: P4DIR |= BIT1+BIT2+BIT3; // P4.1 - P4.3 output P4SEL |= BIT1+BIT2+BIT3; // P4.1 - P4.3 TBx options TBCCR0 = 512-1; // PWM Period TBCCTL1 = OUTMOD_7; // CCR1 reset/set TBCCR1 = LightCDPM; // CCR1 PWM duty cycle TBCCTL2 = OUTMOD_7; 增计数模式下,使用CCR0作周期定时,CCR1作PW
[单片机]
STM32G474 HRTIME PWM 丢波问题分析与解决
STM32G474 中包含了针对数字电源应用的高精度定时器(HRTIMER),客户在应用该定时器产生 PWM 时,发现 PWM 的输出出现了“丢波”现象,本文对该问题进行分析并给出解决方案。 2. 问题描述 客户使用高精度定时器产生 PWM, 其 PWM 产生的配置如下,Master Timer 的 period event与 compare 1 event 分别作为 Timer A 与 Timer B 的复位源,Timer A 与 Timer B 产生的 180 度移相的 PWM 输出,EEV4 作为外部事件来触发 PWM reset, 并且使用 blanking 功能过滤发生在PWM set 点附近的
[单片机]
STM32G474 HRTIME <font color='red'>PWM</font> 丢波问题分析与解决
51单片机测量PWM脉冲宽度LCD1602显示当前PWM占空比频率
此程序通过两个定时器一个外部中断,测量PWM高电平时间以及周期,计算并在1602显示出占空比 周期 高电平时间,只需让脉冲在P3^2口输入即能测得数据。。 单片机源程序如下: #include reg52.h #include LCD1602.h typedef unsigned char uint8; typedef unsigned int uint16;//数据类型重定义 uint8 count = 0; //计进入外部中断次数 bit flag = 1; //捕获结束标志位 long Pwm_All; //PWM的周期 long Pwm_High; //PWM的高电平时间 占空比=Pwm_Hi
[单片机]
工程师推荐PWM调光之如何优化LED色彩稳定度
本文探讨提供发光二极体( LED )调光的方法,分析 LED调光 对其长期性能及所发射出光的色彩稳定性之影响,并特别探讨如何结合使用线性恒流稳流器(CCR)及数位电晶体来提供脉冲宽度调变( PWM )调光。 PWM为改变LED光输出首要方法 光要多少才足够?要求的发光量通常由所处环境与用途决定。就会议室而言,一般圆桌会议时的照明可能非常亮;但若使用投影系统来观看会议材料,会议室的光就可能会调暗很多;起居室的照明通常会被调节从而营造恰当的氛围;而汽车仪表板的背光则通常根据日间或夜间驾驶来自动调节。 光源已从非常易于调节的白炽灯转向要求以特殊电路提供不同光等级的萤光灯。LED是业界出现的最新一代光源,要求采用新的电子电路来改变光等
[电源管理]
工程师推荐<font color='red'>PWM</font>调光之如何优化LED色彩稳定度

推荐帖子

LinKIt ONE 测评(2)
接着上贴:LinKItONE测评(1)搭建LinKItONE的开发环境LINKITONE的开发平台是ArudinoARDUINOIDE下载链接:https://www.arduino.cc/en/Main/Software下载最新的1.81之前下载的是1.6多的结果编译程序时出错编译不了。安装好后打开文件--首选项在附加开发板网址上填入http://download.labs.mediatek.com/package_mtk_
ihalin stm32/stm8
关于DSP检测的问题
小弟刚开始学DSP,用的是C6713+FPGA开发板(已经没有了技术支持),老是找不到目标板,经过检查仿真器没有问题,可能是板子有点问题,但小弟不知道如何检查,该从哪些地方检查,还希望有经验的大侠多多指教,如果有这方面的资料,可以发到whq105223@126.com 在此多谢各位了!!!关于DSP检测的问题连不上也得有个连不上的提示吧,建议你贴出图来,大家好给你解决。论坛发帖解决可以帮助以后遇到问题的人好找到答案
whq105223 DSP 与 ARM 处理器
求助 AT89S51与C8051F单片机有什么区别啊?(急)
各位前辈,我是一名学生菜鸟,要用单片机做采集器,遇到了这么一个问题,AT89S51与C8051F单片机有什么区别,请各位帮忙解决,谢谢!求助AT89S51与C8051F单片机有什么区别啊?(急)和AT89S51比C8051F是功能强大些的片上系统,使用方便,适合初学,大部分集成AD,DA等,可以选用便宜一点的C8051F330D(直插),支持JATG,ISP,相比之下AT89S51功能简单,但价格也便宜很多,但通常更多的人会选择AVR。C8051F是改进了的增强型51内核在不改变指
bareydai 嵌入式系统
有关单片机 PWM方面的问题 懂得进来 帮个忙
我们要采集的PWM信号频率是500hz,打算用51单片机12M的测量PWM的占空比,精度要求达到1%,这个可以达到吗?有关单片机PWM方面的问题懂得进来帮个忙没问题,肯定可以的才500Hz,应该可以吧
nucjank 51单片机
在 Proteus 中仿真 MSP430 单片机的设置方法
Proteus是一款功能強大,簡單易用的仿真軟件,完全不需要實體的硬件支持,對於沒有開發板的朋友而言可是一種福音. 在Proteus中仿真MSP430单片机的设置方法真的太激动了哈哈这个proteus得要什么版本以上的才有MPS430呢?学习学习,谢谢楼主分享哈!
lucky_jeck 微控制器 MCU
学学绕制高频变压器
变压器参数需:磁芯:EE22原边:134T(1-3脚),辅助:32T(5-4脚),输出:15T(10-9脚)原边电感:138010%uH漏感:44uH引脚分布图:特别注意:绕制方法为网上下载,其中变压器绕制方法是对的,但其中存在着很多问题(比如,正规变压器的绕组的头和尾是要添加铁氟龙套管的,每一层之间也得打挡墙增加绝缘,要使变压器耦合好,通常的做法是三明治绕法,比如,1-3先绕35圈然后10-9,然后3-2绕35圈,然后绕5-
qwqwqw2088 模拟与混合信号
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
    502 Bad Gateway

    502 Bad Gateway


    openresty

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved