当前课程知识点:ARM微控制器与嵌入式系统 > 第五章 ARM微控制器的各种外设 > 5.5.2 ARM微控制器外设:PWM寄存器与编程 > 5.5.2 ARM微控制器外设:PWM寄存器与编程
各位同学大家好
我是清华大学工程物理系的曾鸣老师
欢迎大家继续回到我们
ARM微控制器与嵌入式系统的MOOC课堂
我们在上一个单元学习了
PWM这样一类模块的基本原理和方法的
这个概念基础上
我们来学一学怎么对它进行编程
那么学到这儿我们会发现
对于这样一类微控制器的外设
特别是我们这门课越学越简单
其实PWM的原理一点都不难
那么我们在这个单元里来试着把它玩起来
做一点好玩的事情
那么我们对于一个TPM模块
对它进行编程
产生脉冲宽度调制的PWM信号
那么编程需要几个步骤呢
跟我们以前学习的一样
还是需要三个步骤
大家都很熟了
第一个步骤把我们这个引脚
用到的这个引脚的时钟
还有TPM模块的时钟给打开
那么第二个步骤呢
把我们Port上这些引脚配置给
指定为TPM模块用
而不是给IO
给别的功能来使用
第三个步骤呢
就是对TPM模块自己的寄存器来进行编程
让它工作在我们想要的工作模式
产生我们要的频率的信号
就这三个步骤
那么我们一个个来看
对于如何把一个模块的时钟打开
我们已经非常非常熟的
它一直都在我们KL25的这个芯片的
系统集成模块的那些寄存器里头
也就是我们芯片手册的第12章
大家在192页能够找到
那么我们熟悉的那几个打开IO模块
PortA、PortB、PortC的寄存器的
那些时钟之外呢
在这个单元里头
TPM模块的时钟源
也在这个部分要做一点点额外的设置
所以会多写一两句话
首先第一个用到的寄存器
就是这个SIM
也就System integration module
SIM模块的SOPT2这个寄存器
这个寄存器如图中所示
在两个比特段可以进行配置
他们分别是选择
设置我们所有TPM模块的时钟源
所以在上面这个第24比特位置
我们把它设成01
让它使用片内的锁相环产生的时钟
然后在中间第16比特这个位置呢
我们把它设成0
虽然我这里给出的这句话是一个宏定义
大家想一想它的内容
或者大家在CodeWarrior单击右键
看一看它的宏定义
就能知道我们是把这个比特设为0
这样子呢
在这两个组合下我们指定所有的
TPM模块使用锁相环产生的
片内的默认时钟源
而且就是它原始频率
并不是除以2的频率
那么就完成一个时钟频率的选择
大家学的多了以后可以自己去改这些代码
改自己想要的设置
那么按照老师给的代码
我们选择片内锁相环产生的默认时钟
并且不除以2使用原始时钟是什么意思呢
就回到我们原来看过很多次的
这个片内的时钟Tree
在上电以后
使用片内的IRC振荡电路
经过锁频环然后产生的片内的振荡时钟
就是20.97兆
所以按照刚才的这个配置
我们简化了大家的理解
就是我们接下来这门课范围内
编程TPM模块的时钟源
用的都是这个20.97兆
这就完成了时钟的选择
时钟选择完了
我们要把时钟的开关打开 对不对
那么分两块
一块我们看一看我们这个板子的电路图
我们要干的一件事
干的一件有意思的事或者干的一件坏事
是我们要拿这个引脚来点一个蜂鸣器
放一放不同的声音
那么我发现点蜂鸣器这个引脚
我们对着电路图看叫Buzzer EN
这个Buzzer EN如果我们读电路图
所有net名相同的电路
等于是有一根线连接
我们会发现Buzzer EN这个引脚
接的是PTC8这样一个IO引脚
或者这样一个物理引脚
那么与之呼应的
大家一定要学会
在电路图芯片手册之间来回切换
我们这门课已经讲到第五类外设了
大家一定要有这个能力
我们读电路图发现蜂鸣器接的是Buzzer EN
Buzzer EN在电路图里接的是PTC8
一定记得回到你的芯片手册里
去查一查就是我们上面这张表PTC8这个引脚
有哪几个复用功能
那么大家查一查就会发现PTC8这个引脚
有若干个复用功能
其中编号0、1、2、3
第3号功能就是TPM0的Channel4
它是一个PWM的功能
也就说这个引脚 这个IO
是可以当PWM来使用的 对不对
这就是跟我们要的就一致了
那么与之呼应的是什么呢
在这个模块编程的时候
因为这是PTC
所以我们记得把PortC的时钟打开
所以就是SIM这个_SCGC5寄存器
对应我们之前编程过很多次的
这个打红圈的位置
我们要把它置1
把这个比特置1打开PortC的时钟
还有一件事呢就是
在同样的SIM_SCGC6这个寄存器里
有一个比特
我们刚才选了时钟源
这里要记得把对应的TPM0的时钟打开
把这个比特置1
所以合并起来我们就会发现
我们其实一共就是4句话
头两句话对于SIM模块的
SOPT2这个寄存器的两个比特
一个置01 一个置0
选择使用片内默认的这个锁频环
产生的时钟20.97兆
剩下两句话呢
SIM_SCGC5和SIM_SCGC6这两个寄存器
分别把PortC和我们要用到的TPM0
这两个模块的时钟打开
这样我们就完成了三个步骤里头的
第一个步骤
四句话 对吧
那么看看第二个步骤
第二个步骤其实大家也非常熟了
刚才隐隐约约都提到了
就是把刚才要用的这个引脚
配置给TPM模块用
而不是给别的模块用
那我这里如果不翻页
大家回忆一下是哪个寄存器啊
是有一个寄存器每个引脚
都对应的一个对不对
所以我们应该写这么一句话
就是把我们的PortC的第8个引脚
PTC8对应的这个PCR8这个寄存器
配置他中间那三个比特
所以赋值是等于0X0300
使用这个引脚的第三号功能
当TPM0的Channel4
这个PWM模块用
完成这个配置以后
这个引脚时钟也打开了
引脚也配置给PWM模块用了
是不是就是我们编程的第三个步骤
对这个TPM模块的寄存器进行编程
配置它究竟产生怎样的PWM信号
那究竟要产生怎样的PWM信号
能达到我们要的效果呢
那是下一小节我再跟大家讨论
我们先站在寄存器的角度
把刚才提到那些寄存器
串起来给大家讲讲怎么用
我们说过一个TPM模块有17个寄存器
从地址4008开始的那个段里头
17个寄存器用完了TPM1模块
再来17个这么循环
一共3个TPM模块
那么17个寄存器很多
大家不要怕
在我们这门课的范畴里
如果你翻到芯片手册第550页顺着往下看
我们实际上只用到了其中的5个寄存器
就可以完成对TPM模块的
一个最最简单的控制蜂鸣器这样一个编程
当然大家如果以后要使用它更强大的功能
你当然要看芯片手册
把别的寄存器的功能也适当的自己摸一摸
那么我们用到这些寄存器分别是什么含义呢
这五个寄存器我来一个一个给大家讲
首先呢我们建立一个概念
我们这个蜂鸣器
接在了芯片的PTC8这个引脚上
这个引脚上第三号复用功能
我们刚才已经说了是TPM0模块的通道4
也就是TPM0模块第四个通道当PWM使用
我们编程的时候
记住我们所使用的模块号和通道号
那么放在了这个寄存器的这个列表里头
我们仔细再来看的时候
我们会发现在550页这17个寄存器里头
我们只用其中五个
第一个就是TPM0的SC寄存器
Status and Control也就是他的状态
和他的控制都在这一个寄存器里
这一个寄存器是对TPM0的整个模块
所有六个Channel进行统一的
这个状态读取和控制的
那么我们在编程的时候
只使用到了他最低位的这几个比特
那么我们可以注意在最低位的这五个比特
其中CMOD这两个比特呢
是选择我们所使用这个TPM模块时钟是否打开
为00的时候
时钟是关闭的
也就计数器不计数
那么我们现在对它编程
按照芯片手册的解释应该配置为01
也就是使用我们刚才所选择的
片内20.97兆那个时钟
当然设置为10我们还可以选择使用
片外输入的时钟源
那么最低位这三个比特呢
也就是PS这三个比特呢
是对于这个时钟源
比如说20.97兆可能太快了
我们可以把它分一分频
再来当我们的时钟源使用
那么在这里我们将它设置为了111
也就数字7
把它对20.97兆做128倍的分频
所以大家记住我们通过编程
变成这样一句话
也就是TPM0_SC等于0X0008或上0007
也就是选择了片内的20.97兆时钟源
128分频的时钟频率
来作为我们PWM计数的时钟单元
那么它的时钟间隔是多少
大家可以自己算一算 对吧
那么第二个用到的寄存器呢
是我们TPM0的C4SC寄存器
这个寄存器是TPM0这个模块
第通道4所独有的寄存器
它配置通道4这一个引脚的工作模式和功能
那么这个寄存器里头
所能配置的值其实含义非常的复杂
MSB、MSA、ELSB和ELSA这四个比特排列组合
其实会形成对于功能的很多种配置
那么会形成一张表
我们在芯片手册里可以看到
那么我们顺着往功能
也就是mode这一列看的话
会发现我们每一个PWM模块的引脚
其实除了脉冲调制
还可以做输入俘获
输入比较等等
以后大家会用很多功能
我们现在只使用它刚才提到的
最简单的一类功能
也就产生边沿对齐的PWM的周期脉冲信号
那么我们很显然把这两个值
分别配置为10和10
也就是给TPM0_C4SC这个寄存器
写成这样一个赋值语句
就使它工作在我们想要的边沿对齐
PWM模式
那么通过这两个寄存器的设置
我们选择了我们这个模块的时钟源
以及这个引脚这个Channel的工作模式
那么剩下事情就很简单了
我们回顾一下PWM的基本原理
它就是一个累增的计数器
当分别遇到两个计数值的时候
完成边沿的跳转和周期的切换
所以我们实际上
未来就是三个寄存器会要使用
TPM0_CNT Counter寄存器
和TPM0 Modulater TPM0_MOD寄存器
是这样一个PWM模块
整个模块所有引脚共用的
那么Counter寄存器里头
永远存的是当前计数值
也就是数数数到多少了
那么TPM0_MOD寄存器
设置的是当前这个模块总的周期值
也就数到多少就溢出决定了我们的周期
也就决定了我们的频率
然后每个通道有一个独立的
TPMx_CNV寄存器
这个N就比如通道4 就是4 C4V
这样每个通道的寄存器
它决定了这个通道的占空比
也就数数数到这个值的时候
脉冲信号由1变0
那么这三个寄存器很显然都是计数器值
所以他们在地址上占4个字节
但是其内容都是16比特的计数器
高16位是忽略的
我们可以为它们分别设置16位的值
其中TPM0_CNT的值
是一个自动累加的计数值
我们没有办法对它进行写操作
只能读取
对它做写会导致它的值清零
TPM0_MOD寄存器
整个模块共用设定一个值
它根据计数的参考时钟频率
就决定了信号的周期
也就决定了我们输出信号的脉冲频率
TPM0_C4V就决定了我们TPM模块0
第四通道这一个通道的输出翻转值
换言之大家算一算
它就能决定我们脉冲信号的占空比
所以我们对三个计数器的值
进行设置和读取
就可以实现对PWM模块
最终输出信号的脉宽占空比
也就是我们频率的这些控制
那么好了
我们学习了这三个步骤
学习了如何对于一个PWM模块
把它的时钟打开
配置为PWM使用
以及如何对PWM里头
那仅仅不多的五个寄存器
进行配置让它工作起来
设置它的周期 频率
设置它的占空比
我们在下一个单元
来带大家做一点好玩的事情
就是用这个引脚
我们试着让我们这个板子来播放一下音乐吧
所以下节课来给大家讲我们的
实验程序的内容
-1.1 课程概览
--1.1 课程概览
-1.2 如何学好嵌入式系统
-2.1 计算机的基本概念、发展历史
-2.2 从晶体管到CPU
-2.3 概念CPU、微控制器MCU和嵌入式系统
-2.4 八卦计算机史
-2.5 不同领域、不同系列的嵌入式系统
-2.6 ARM历史与MKL25Z128 MCU
--2.6 ARM历史与MKL25Z128 MCU【习题】
-3.1 CPU的基本结构和运行机制
-3.2.1 堆栈的概念
--3.2.1 堆栈的概念【习题】
-3.2.2 堆栈的概念-头脑体操
-3.3.1 ARM的体系结构
--3.3.1 ARM的体系结构【习题】
-3.3.2 ARM的体系结构-头脑体操
-3.4.1 中断的概念和机制
-3.4.2 中断子程的概念和编程
-3.5 复位、时钟、存储器和总线
--3.5 复位、时钟、存储器和总线【习题】
-3.6 小结:MCU的总体结构和程序运行机制
--3.6 小结:MCU的总体结构和程序运行机制【习题】
-4.1 第一种外设:IO
-4.2 IO外设的编程实操-点亮LED
-4.3 IO外设的进阶知识
-4.4 嵌入式开发的基本概念与工具链
-4.5 嵌入式开发的进阶知识
-4.6 嵌入式开发中的C语言(上)
--4.6 嵌入式开发中的C语言(上)【习题】
-4.7 嵌入式开发中的C语言(下)
--4.7 嵌入式开发中的C语言(下)【习题】
-E0.1 实验零 开发板的初步认识与工具链的安装
-E0.2 实验零 体验一个例程的编译与下载
-E0.3 实验零 编写第一个程序:点亮核心板LED
-E1 实验一 点灯秘籍
-5.1 ARM微控制器外设学习概述
-5.2.1 ARM微控制器外设:通讯
-5.2.2 ARM微控制器外设:异步串行通讯UART的原理(上)
--5.2.2 ARM微控制器外设:异步串行通讯UART的原理(上)
--5.2.2 ARM微控制器外设:异步串行通讯UART的原理(上)【习题】
-5.2.3 ARM微控制器外设:异步串行通讯UART的原理(下)
--5.2.3 ARM微控制器的外设:异步串行通讯UART的原理(下)
--5.2.3 ARM微控制器外设:异步串行通讯UART的原理(下)【习题】
-5.2.4 ARM微控制器外设:RS-232串口与USB虚拟串口
--5.2.4 ARM微控制器外设:RS-232串口与USB虚拟串口
-5.2.5 ARM微控制器外设:UART的寄存器编程(上)
--5.2.5 ARM微控制器外设:UART的寄存器编程(上)
-5.2.6 ARM微控制器外设:UART的寄存器编程(下)
--5.2.6 ARM微控制器外设:UART的寄存器编程(下)
--5.2.6 ARM微控制器外设:UART的寄存器编程(下)【习题】
-E2 实验二 UART编程实操
-5.3.1 ARM微控制器外设:IO的中断编程(上)
-5.3.2 ARM微控制器外设:IO的中断编程(下)
-5.4.1 ARM微控制器外设:定时器的原理
-5.4.2 ARM微控制器外设:定时器的编程
--5.4.2 ARM微控制器外设:定时器的编程【习题】
-E3 实验三 定时器中断编程实操
-5.5.1 ARM微控制器外设:PWM的原理
-5.5.2 ARM微控制器外设:PWM寄存器与编程
-5.5.3 ARM微控制器外设:PWM编程实例—电子音乐
--5.5.3 ARM微控制器外设:PWM编程实例—电子音乐
-E4 实验四 数码管显示编程实操
-5.6.1 ARM微控制器外设:SPI通讯简介
--5.6.1 ARM微控制器外设:SPI通讯简介【习题】
-5.6.2 ARM微控制器外设:SPI寄存器与编程
-5.6.3 ARM微控制器外设:SPI编程实例—OLED显示屏驱动
--5.6.3 ARM微控制器外设:SPI编程实例—OLED显示屏驱动
-5.7.1 ARM微控制器外设:I2C通讯简介
-5.7.2 ARM微控制器外设:I2C的通讯协议
-5.7.3 ARM微控制器外设:I2C寄存器与编程
--5.7.3 ARM微控制器外设:I2C寄存器与编程【习题】
-5.7.4 ARM微控制器外设:I2C编程实例—加速度传感器
--5.7.4 ARM微控制器外设:I2C编程实例—加速度传感器
-5.8.1 ARM微控制器外设:ADC简介
-5.8.2 ARM微控制器外设:ADC基础
-5.8.3 ARM微控制器外设:ADC寄存器与编程
-E5 实验五 ADC编程实操
-E6 挑战实验
--E6 挑战实验
-6.1 嵌入式系统的接口与设计
-6.2 嵌入式系统的实例





