LV16-32-定时器-03-高级定时器-02-高级定时器输出指定个数PWM
本文主要是STM32开发——定时器 高级定时器 输出指定个数 PWM 相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
Windows | windows11 |
Ubuntu | Ubuntu16.04的64位版本 |
VMware® Workstation 16 Pro | 16.2.3 build-19376536 |
SecureCRT | Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日 |
开发板 | 正点原子 i.MX6ULL Linux阿尔法开发板 |
uboot | NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03) |
linux内核 | linux-4.15(NXP官方提供) |
STM32开发板 | 正点原子战舰V3(STM32F103ZET6) |
点击查看本文参考资料
- 通用
分类 | 网址 | 说明 |
官方网站 | https://www.arm.com/ | ARM官方网站,在这里我们可以找到Cotex-Mx以及ARMVx的一些文档 |
https://www.st.com/content/st_com/zh.html | ST官方网站,在这里我们可以找到STM32的相关文档 | |
https://www.stmcu.com.cn/ | 意法半导体ST中文官方网站,在这里我们可以找到STM32的相关中文参考文档 | |
http://elm-chan.org/fsw/ff/00index_e.html | FatFs文件系统官网 | |
教程书籍 | 《ARM Cortex-M3权威指南》 | ARM公司专家Joseph Yiu(姚文祥)的力作,中文翻译是NXP的宋岩 |
《ARM Cortex-M0权威指南》 | ||
《ARM Cortex-M3与Cortex-M4权威指南》 | ||
开发论坛 | http://47.111.11.73/forum.php | 开源电子网,正点原子的资料下载及问题讨论论坛 |
https://www.firebbs.cn/forum.php | 国内Kinetis开发板-野火/秉火(刘火良)主持的论坛,现也做STM32和i.MX RT | |
https://www.amobbs.com/index.php | 阿莫(莫进明)主持的论坛,号称国内最早最火的电子论坛,以交流Atmel AVR系列单片机起家,现已拓展到嵌入式全平台,其STM32系列帖子有70W+。 | |
http://download.100ask.net/index.html | 韦东山嵌入式资料中心,有些STM32和linux的相关资料也可以来这里找。 | |
博客参考 | http://www.openedv.com/ | 开源网-原子哥个人博客 |
http://blog.chinaaet.com/jihceng0622 | 博主是原Freescale现NXP的现场应用工程师 | |
cortex-m-resources | 这其实并不算是一个博客,这是ARM公司专家Joseph Yiu收集整理的所有对开发者有用的官方Cortex-M资料链接(也包含极少数外部资源链接) |
点击查看相关文件下载
分类 | 网址 | 说明 |
STM32相关 | STM32F103xx英文数据手册 | STM32F103xC/D/E系列的英文数据手册 |
STM32F103xx中文数据手册 | STM32F103xC/D/E系列的中文数据手册 | |
STM32F10xxx英文参考手册(RM0008) | STM32F10xxx系列的英文参考手册 | |
STM32F10xxx中文参考手册(RM0008) | STM32F10xxx系列的中文参考手册 | |
Arm Cortex-M3 处理器技术参考手册-英文版 | Cortex-M3技术参考手册-英文版 | |
STM32F10xxx Cortex-M3编程手册-英文版(PM0056) | STM32F10xxx/20xxx/21xxx/L1xxxx系列Cortex-M3编程手册-英文版 | |
STM32 HAL库开发实战 | 野火STM32开发教程在线文档——基于F103系列开发板 | |
STM32库开发实战指南 | 野火STM32开发教程在线文档——基于野火霸道开发板 | |
SD卡相关 | SD卡相关资料——最新版本 | 有关SD卡的一些资料可以从这里下载 |
SD卡相关资料——历史版本 | 有关SD卡的一些历史版本资料可以从这里下载,比如后边看的SD卡2.0协议 | |
SD 2.0 协议标准完整版 | 这是一篇关于SD卡2.0协议的中文文档,还是比较有参考价值的,可以一看 | |
ESP32 | SD卡相关资料——最新版本 | 这个⼿册介绍了 ESP8266EX 的产品参数。 |
ESP8266 系列入门教程 | 一个入门手册(安信可官网) | |
ESP8266 AT 指令集 | 这是一篇关于ESSP8266的AT指令集的文档(安信可官网) | |
ESP8266 AT 指令使用实例 | 这是一篇关于ESSP8266的AT指令集使用实例的文档(安信可官网) | |
ESP-AT 用户指南 | 本指南详细介绍 ESP-AT 是什么、如何连接硬件、以及如何下载和烧录 AT 固件(乐鑫官网) | |
乐鑫官方技术文档 | 这里是乐鑫官方技术文档的入口,文档都可以来这里找(乐鑫官网) |
一、基本原理
要实现定时器输出指定个数 PWM,只需要掌握下面几点内容:
第一,定时器是如何输出 PWM 的,这部分的知识和前面是一样的。但是需要注意的是:我们需要把 MOE 位置 1,这样高级定时器的通道才能输出。
第二,要清楚重复计数器特性,设置重复计数器寄存器 RCR 的值为 N,那么更新事件将在定时器发生 N+1 次上溢或下溢时发生。换句话来说就是,想要指定输出 N 个 PWM,只需要把N-1 写入 RCR 寄存器。因为在边沿对齐模式下,定时器溢出周期对应着 PWM 周期,我们只要在更新事件发生时,停止输出 PWM 就行。
第三,为了保证定时器输出指定个数的 PWM 后,定时器马上停止继续输出,我们使能更新中断,并在定时器中断里关闭计数器。
二、相关寄存器
下面了解一下 TIM1/TIM8 这些高级定时器中使用到的几个重要的寄存器,其他更多关于定时器的资料可以参考《STM32F10xxx 参考手册_V10(中文版) .pdf》 的第 13 章。
1. 控制寄存器 1(TIMx_CR1)
TIM1/TIM8 的控制寄存器 1 描述如图:
上图中我们只列出了需要用的一些位, 其中:位 7(APRE)用于控制自动重载寄存器是否具有缓冲作用,在基本定时器的时候已经学习过了。 在本实验中我们把该位要置 1,这样就算改变 ARR 寄存器的值,该值也不会马上生效,而是等待之前设置的 PWM 完整输出后(发生更新事件)才生效。位 4(DIR)用于配置计数器的计数方向,这里我们默认置 0。位 0(CEN),用于使能计数器的工作,必须要设置该位为 1,才可以开始计数。
2. 捕获/比较模式寄存器 1/2(TIMx_CCMR1/2)
TIM1/TIM8 的捕获/比较模式寄存器( TIMx_CCMR1/2),该寄存器一般有 2 个: TIMx_CCMR1 和 TIMx _CCMR2。 TIMx_CCMR1 控制 CH1 和 CH2,而 TIMx_CCMR2 控制 CH3 和CH4。 TIMx_CCMR1 寄存器描述如图:
该寄存器的有些位在不同模式下,功能不一样,我们前面已经说过。比如我们要让 TIM1 的CH1 输出 PWM 波为例,该寄存器的模式设置位 OC1M[2:0]就是对应着通道 1 的模式设置,此部分由 3 位组成,总共可以配置成 8 种模式,我们使用的是 PWM 模式,所以这 3 位必须设置为110 或者 111,分别对应 PWM 模式 1 和 PWM 模式 2。这两种 PWM 模式的区别就是输出有效电平的极性相反,这里我们设置为 PWM 模式 1。位 3 OC1PE 是输出比较通道 1 的预装使能,该位需要置 1,另外 CC1S[1:0]用于设置通道 1 的方向(输入/输出)默认设置为 0,就是设置通道作为输出使用。
3. 捕获/比较使能寄存器(TIMx_ CCER)
TIM1/TIM8 的捕获/比较使能寄存器,该寄存器控制着各个输入输出通道的开关。TIMx_CCER 寄存器描述如图:
该寄存器比较简单,要让 TIM1 的 CH1 输出 PWM 波,这里我们要使能 CC1E 位,该位是通道 1 输入/输出使能位,要想 PWM 从 IO 口输出,这个位必须设置为 1。 CC1P 位是设置通道1 的输出极性,我们设置 0,即 OC1 高电平有效。
4. 事件产生寄存器(TIMx_ EGR)
TIM1/TIM8 的事件产生寄存器, 该寄存器作用是让用户用软件方式产生各类事件。TIMx_EGR 寄存器描述如图:
UG 位是更新事件的控制位,作用和定时器溢出时产生的更新事件一样,区别是这里是通过软件产生的,而定时器溢出是硬件自己完成的。只有开启了更新中断,这两种方式都可以产更新中断。本实验用到该位去产生软件更新器事件,在需要的时候把 UG 位置 1 即可,会由硬件自动清零。
5. 重复计数器寄存器(TIMx_ RCR)
重复计数器寄存器用于设置重复计数器值,因为它具有影子寄存器,所以它本身只是起缓冲作用。当更新事件发生时,该寄存器的值会转移到其影子寄存器中,从而真正起作用。 TIMx_RCR 寄存器描述如图:
该寄存器的 REP[7:0]位是低 8 位有效,即最大值 255。因为这个寄存器只是起缓冲作用,如果想要对该寄存器写入值后立即生效,可以通过对 UG 位写 1,产生软件更新事件。
6. 捕获/比较寄存器 1/2/3/4(TIMx_CCR1/2/3/4)
捕获/比较寄存器(TIMx_CCR1/2/3/4),该寄存器总共有 4 个,对应 4 个通道 CH1~CH4。我们使用的是通道 1,所以来看看 TIMx_CCR1 寄存器的描述, 如图 :
在输出模式下,捕获/比较寄存器影子寄存器的值与 CNT 的值比较,根据比较结果产生相应动作,利用这点,我们通过修改这个寄存器的值,就可以控制 PWM 的占空比了。
7. 断路和死区寄存器(TIMx_ BDTR)
高级定时器 TIM1/8 的通道用作输出时,还必须配置断路和死区寄存器(TIMx_BDTR) 的位 MOE,该寄存器各位描述如图 :
在这个实验中,我们只需要关注该寄存器的位 15(MOE),要想高级定时器的 PWM 正常输出,则必须设置 MOE 位为 1,否则不会有输出。