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__);
上一篇:【STM32H7教程】第35章 STM32H7的定时器应用之高精度单次延迟实现(支持TIM2,3,4和5)
下一篇:【STM32H7教程】第33章 STM32H7的定时器应用之TIM1-TIM17的中断实现
推荐阅读最新更新时间:2024-11-09 22:16
推荐帖子
- 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 模拟与混合信号
设计资源 培训 开发板 精华推荐
- 深入东芝参考设计库:夯实您的设计库,让您的设计更出彩
- 学AM335X课程,赢超值BB-Black团购资格,更有DIY大奖赛预热中!
- 体积小、功耗低、安全性高,专用加密芯片ATSHA204 精彩专题,答题有好礼!
- ADI 全新技术资料集锦
- ADI 连续无创式血压解决方案
- HDMI/ DP2.0 线上实测研讨会|是德科技
- 有奖直播|多款MSP430™片上Sigma-Delta ADC助力高精度信号检测应用 报名中
- 答题抽奖:Mentor Tessent Automotive相关测试解决方案(奖品池还剩不少奖品哟)
- 了解 PI 全新 PowiGaN 开关电源 IC ,答题赢好礼!
- 寻宝大冒险,搜索有好礼!