【普中DSP28335开发攻略】-- 第 7 章 F28335时钟及控制系统

(1)实验平台:

普中DSP28335开发板https://item.taobao.com/item.htm?id=594649003982 (2)资料下载:普中科技-各型号产品资料下载链接


本章将向大家介绍 F28335 的时钟及控制系统, 重点分析系统及外设时钟来源及控制, 只要理解好时钟系统, F28335 一切时钟的来龙去脉就会非常清楚。 通过介绍 F28335 时钟配置过程, 让大家学会如何修改系统时钟频率, 本章最后通过一个简单的 LED 闪烁程序来讲述如何自定义系统时钟。 学习本章可以参考"tms320f28335(中文版).pdf" "3.6 系统控制" 章节内容, 若结合视频学习效果更佳。 本章分为如下几部分内容:

[7.1 F28335 系统时钟来源](#7.1 F28335 系统时钟来源)

[7.2 F28335 系统控制及外设时钟](#7.2 F28335 系统控制及外设时钟)

[7.3 时钟单元常用寄存器](#7.3 时钟单元常用寄存器)

[7.3.1 外设时钟控制寄存器 PCLCCR0/1/3](#7.3.1 外设时钟控制寄存器 PCLCCR0/1/3)

[7.3.2 高/低速外设时钟预分频寄存器 HISPCP/LOSPCP](#7.3.2 高/低速外设时钟预分频寄存器 HISPCP/LOSPCP)

[7.3.3 锁相环状态寄存器(PLLSTS)](#7.3.3 锁相环状态寄存器(PLLSTS))

[7.3.4 锁相环控制寄存器(PLLCR)](#7.3.4 锁相环控制寄存器(PLLCR))

[7.4 自定义系统时钟](#7.4 自定义系统时钟)

[7.5 实验现象](#7.5 实验现象)


7.1 F28335 系统时钟来源

时钟信号对于单片机来说是非常重要的, 它为单片机工作提供一个稳定的机器周期从而使系统能够正常运行。 时钟系统犹如人的心脏, 一旦有问题整个系统就崩溃。 我们知道 DSP 属于数字信号处理器, 也可以说是一种高级单片机, 若要它正常工作也必须为其提供时钟信号。 那么这个时钟信号从何而来呢? 时钟信号自然是由时钟信号的源头(简称时钟源) 产生, 下面我们就来分析下 F28335 内部的时钟电路。 如图 7.1.1 所示:
图 7.1.1 F28335 时钟来源

我们按照图中标号顺序分别介绍, 从上图可以看到, F28335 的时钟源有两种:

(1) 采用外部振荡器作为时钟源(简称外部时钟) , 即在 XCLKIN 引脚提供一定频率的时钟信号, 也可以通过复用的 X1 引脚提供, 即由其他数字系统或外部振荡器引入。

(2) 采用 F28335 内部振荡器作为时钟源(简称内部时钟) , 在 X1 和 X2 引脚之间连接一个晶体就可以产生时钟源。

①外部时钟源信号接入方法有 2 种, 分别针对的是电压为 3.3V 的外部时钟和 1.9V 的外部时钟。

(A) 外部时钟信号接入方式 1, 即采用 3.3V 的外部时钟。 如图 7.1.2 所示:
图 7.1.2 3.3V 外部时钟信号接入

3.3V 外部时钟信号直接接入 XCLKIN 引脚, X1 引脚接 GND, X2 引脚悬空, 系统内高电平不能超过 VDDIO, 即 3.3V。

(B) 外部时钟信号接入方式 2, 即采用 1.9V 的外部时钟。 如图 7.1.3 所示:
图 7.1.3 1.9V 外部时钟信号接入

1.9V 外部时钟信号直接接入 X1 引脚, XCLKIN 引脚接 GND, X2 引脚悬空, 系统内高电平不能超过 VDD, 即 1.9V。

②内部时钟源信号接法如图 7.1.4 所示:
图 7.1.4 内部时钟信号

从上图可以看到 XCLKIN 引脚接地, X1 和 X2 引脚间接入了一个晶振。

在实际的应用中, 我们一般不采用外部振荡器方式, 直接采用内部振荡器的方式更多一些。典型的接法是在 X1 和 X2 引脚间接入一个 30MHz 晶振, 选择 30MHZ晶振是因为若直接采用更高频率晶振, 不仅价格会上升, 而且晶振电路还需要做EMC 处理, 即需要设计特殊的晶振电路, 而 30MHZ 晶振目前是比较容易获取的。

(3) 我们知道 F28335 工作的最高主频是 150MHz, 但实际提供的晶振是30MHZ, 我们希望 CPU 能工作在最高主频上, 这时怎么能让这 30M 转变成 150M供 CPU 工作呢? 这就需要提到 F28335 内部的 PLL 锁相环了。 从上图可以看到,内部信号时钟源与外部信号时钟源通过异或门后选择接入成为 OSCCLK 即振荡器时钟信号, 该信号受到寄存器 PLLSTS(OSCOFF) 位控制, 该位置 1 即开关合上,振荡器信号允许通过, 然后分两路传输, 一路直接过去, 另一路经过 PLL 锁相环模块。 一般不能直接使用 OSCCLK 信号, 该信号的频率是由石英晶体产生, 频率不够高, 需要进入锁相环倍频和分频后才能使用, 所以要使能 PLL 锁相环, 即对寄存器 PLLSTS(PLLOFF) 位控制。 使能后通过寄存器 PLLCTR 来设置倍频数, 倍频值最大可设置为 10, 通常我们就设置倍频数为 10, 这样通过 PLL 后的时钟信号 VCOCLK 即为 300MHZ。 因为 F28335 芯片最高工作频率是 150MHZ, 所以此时还不能直接 CPU 内核使用, 还需要对其分频处理, 可通过寄存器 PLLSTS(DIVSEL)位来设置分频系数, 为了使 CPU 工作在最高频率下, 通常设置分频系数为 2, 即最终时钟信号 CLKIN 为 150MHZ 供给 CPU。

7.2 F28335 系统控制及外设时钟

锁相环模块除了为 C28X 内核提供时钟外, 还通过系统时钟输出提供快速和慢速 2 种外设时钟。 如果使能内部 PLL 电路, 那么可以通过控制寄存器 PLICR软件设置系统的工作频率。 但是要注意, 在通过软件改变工作频率时, 必须等待系统时钟稳定后才可以继续完成其他操作。 此外, 还可以通过外设时钟控制寄存器使能外部时钟。 在具体应用中, 为了降低系统功耗, 不使用的外设最好将其外设时钟禁止。 外设时钟包括快速外设和慢速外设两种, 分别通过 HISPCP 和LOSPCP 寄存器进行设置。 系统控制及外设时钟结构图如图 7.2.1 所示:
图 7.2.1 系统控制及外设时钟

从上图可以看到, C28X 内核时钟输出通过 LOSPCP 低速时钟寄存器设置预分频, 可设置成低速时钟信号 LSPCLK、 SPI、 I2C、 MCBSP 这些串口通信协议都使用低速时钟信号。 通过 HISPCP 高速时钟寄存器设置预分频, 可设置成高速时钟信号 HSPCLK ,A/D 模块采用的是高速时钟信号, 方便灵活设置 A/D 采样率。 通过 1/2 分频给了 eCAN 模块, 直接输出给了系统控制寄存器模块、 DMA 模块、 EPWM模块、 ECAP 模块、 EQEP 模块这些高速外设模块。 当然这些外设基本都有自己的预定标时钟设置寄存器, 如果预定标寄存器值为 0, 那么 LSPCLK 等时钟信号就成为了外设实际使用时钟信号。 当然, 要使用这些信号需要在外设时钟寄存器PCLKCR 中设置对应外设使能。 从上图也可以看出, DSP 除了提供基本的锁相环电路外, 还可以根据处理器内部外设单元的工作要求配置需要的时钟信号。 处理器还将集成的外设分成高速和低速两种, 可以方便的设置不同模块的工作频率, 从而提高处理器的灵活性和可靠性。 所以 DSP 时钟及控制系统是相当灵活的。

7.3 时钟单元常用寄存器

与时钟单元有关的如振荡器、 锁相环、 看门狗以及处理器工作模式选择等控制电路的配置寄存器如图 7.3.1 所示:

F28335 的 CPU 是 32 位寻址, 所以在上图中列出的各寄存器地址都是以 8 个十六进制位表示。

下边介绍几个常用或相对比较重要的寄存器的相关设置, 在 F28335 中各控制寄存器基本都以 16 位为主。

7.3.1 外设时钟控制寄存器 PCLCCR0/1/3

外设时钟控制寄存器 PCLKCR0/1/3 控制片上各种外设时钟的工作状态, 使能或者禁止。 各位功能定义如下所示:

(1) 外设时钟控制寄存器 PCLKCR0 各位定义

(2) 外设时钟控制寄存器 PCLKCR1 各位定义

(3) 外设时钟控制寄存器 PCLKCR3 各位定义

根据自己所使用的外设来使能或失能相应的时钟。 比如使能 GPIO 时钟, 其设置语句如下: (至于为什么这样写将在后面介绍)

cpp 复制代码
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;

7.3.2 高/低速外设时钟预分频寄存器 HISPCP/LOSPCP

HISPCP 和 LOSPCP 控制寄存器分别控制高/低速的外设时钟, 具体功能描述如下所示:

(1) HISPCP 寄存器

(2) LOSPCP 寄存器

7.3.3 锁相环状态寄存器(PLLSTS)

锁相环状态寄存器功能描述如下:

7.3.4 锁相环控制寄存器(PLLCR)

锁相环控制寄存器用于控制芯片 PLL 的倍数, 在向 PLL 控制寄存器进行写操作之前, 需要具备以下两个条件。

(1) 在 PLL 完全锁住后, 即 PLLSTS[PLLLOCKS]=1。

(2) 芯片不能工作在 LIMP 模式, 即 PLLSTS[MCLKSTS]=0。

锁相环控制寄存器的具体功能描述如下:

其中分频数是除以 2 还是除以 4, 由锁相环状态寄存器的 DIVSEL 位控制, 上图为 DIVSEL 位为 10 情况, DIVSEL 位为 0 或 1 的时候进行 4 分频, 当 DIVSEL 位为 11 时进行 1 分频即不分频。

上述提到的系统控制相关寄存器在 TI 提供的 DSP2833x_SysCtrl.c 和DSP2833x_SysCtrl.h 文件中, 所以要想知道寄存器如何操作可打开文件查看,后面我们也会具体教大家如何在程序中操作寄存器。

7.4 自定义系统时钟

通过前面小节的介绍, 我们可以知道系统时钟 150MHZ 是如何得来。 那么怎么在程序中来修改系统时钟呢?

(1) 首 先 在 前 面 创 建 的 DSP 工 程 文 件 夹 目 录 下 新 建 一 个 名 为"DSP2833x_Example" 文件夹, 该文件夹用于存放我们编写的应用程序。 创建完成后如下所示:

(2) 然后我们将已创建好的工程模板复制一份到"DSP2833x_Example" 文件夹内, 并将其名修改为"Example01_DSP2833x_ClockSystem" (这些命名自己都可以定义, 但一定不能使用中文或特殊符号, 通常我们会使用中文意义单词或单词缩写来命名) 。 如下所示:

(3) 打开 CCS6 软件, 将"Example01_DSP2833x_ClockSystem" 程序添加至工程中, 然后编译, 我们知道该工程其实就是之前创建的工程模板, 所以编译是不会有错误的, 假如你的工程出现错误, 请按照对应的错误查找原因。 工程添加编译后如下所示:

我们看到 main 函数开始处首先调用 InitSysCtrl()函数, 该函数是 TI 公司提供的库文件 DSP2833x_SysCtrl.c 内, 功能是按照需求配置系统控制寄存器值,默认将看门狗关闭( 看门狗功能在后面章节会详细介绍) , 系统时钟配置为150MHZ, 并分出高速时钟和低速时钟以及使能 DSP 各外设时钟。 具体代码如下:

cpp 复制代码
// 这段函数的功能就是将系统控制寄存器初始化到想要的状态;
//具体步骤可以分成四部分:
// - 禁止看门狗电路
// - 给 PLLCR 寄存器赋值以获得想要的系统时钟频率
// - 给高、 低速外设时钟预定标寄存器赋值以获得想要的高、 低速外设时钟频率
// - 对需要使用的外设时钟进行使能
void InitSysCtrl(void)
{
    // Disable the watchdog
    DisableDog();
    // Initialize the PLL control: PLLCR and DIVSEL
    // DSP28_PLLCR and DSP28_DIVSEL are defined in DSP2833x_Examples.h
    InitPll(DSP28_PLLCR,DSP28_DIVSEL);
    // Initialize the peripheral clocks
    InitPeripheralClocks();
}

函数内又调用了相关函数, 大家可以通过按下键盘 Ctrl+鼠标左键快速进入想要查看的函数体内。 比如进入 DisableDog()函数, 我们可以看到其函数内代码如下:

cpp 复制代码
void DisableDog(void)
{
    EALLOW;
    SysCtrlRegs.WDCR= 0x0068;
    EDIS;
}

在对系统控制寄存器及后面介绍的 PIE 等修改时, 首先要加上 EALLOW 语句开启保护, 修改完后再加上 EDIS 语句关闭保护。

然后我们再看下核心的函数 InitPll, 该函数内主要实现了对 PLLCR 寄存器的 DIV 及 PLLSTS 寄存器的 DIVSEL 位设置, 默认 DIV 值为 10, DIVSEL 值为 2,

它们分别使用宏 DSP28_PLLCR 和 DSP28_DIVSEL 预先定义, 再将这两个宏传入函数。 在前面寄存器介绍时已说过对应值的含义, 因此系统时钟默认为 150MHZ。如果我们想修改系统时钟频率, 可以修改宏 DSP28_PLLCR 和 DSP28_DIVSEL 的值。函数内最后调用的函数为 InitPeripheralClocks(), 大家可按照相同方法进入该函数内查看对应寄存器的设置, 默认已使能几乎所有 DSP 外设时钟, 外设开启的越多, 芯片功耗也就越多, 发热也会越大, 所以我们建议把工程中未用到的外设时钟尽量关闭, 当然对于初学者可以先不用管。

回到刚才的话题, 我们如何来修改系统时钟频率呢? 通过上面的介绍相信大家都已知道, 只需要修改宏 DSP28_PLLCR 和 DSP28_DIVSEL 的值, 这两个值在" DSP2833x_Examples.h " 头 文 件 内 定 义 了 , 默 认 DSP28_PLLCR 是 10 , DSP28_DIVSEL 是 2, 即对振荡时钟 10 倍频后再 2 分频, 所以等于 150MHZ。 如下所示:

如果我们把 DSP28_PLLCR 设置为 3, DSP28_DIVSEL 设置为 1, 这样系统时钟频率即为 90MHZ, 整体速度慢了很多, 所以后面我们可以直观的看到 LED 闪烁速度变慢现象。 文件内已经给我们定义好了每个寄存器位可取值范围, 所以只需要把所需要设置的值前面的"//" 取消即可。 如下所示:

7.5 实验现象

到这里我们就把系统时钟频率修改好了, 使用仿真器将开发板和电脑连接成功后, 把编写好的程序编译后, 如果没有报错即可将点击仿真调试, 程序即会写入到芯片的 RAM 内, 运行结果是: 可以看到 LED 闪烁速度明显变慢, 这就说明系统时钟频率修改成功。 当系统断电后, 程序不会继续执行, 因为我们现在使用 的是仿真调试, 即程序写入到 RAM 内, 而非 FLASH, 至于如何写入到 FLASH这个 我们后面会介绍, FLASH 的误操作可能就会将芯片锁死, 所以建议初学者先将自己编写的程序先在 RAM 内仿真调试。

相关推荐
IT_阿水8 小时前
RA-Eco-RA4M2之RTC电子钟
单片机·嵌入式硬件·实时音视频
清风66666612 小时前
基于单片机的水塔液位检测与智能调节报警系统设计
数据库·单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
某zhuan13 小时前
STM32中PB4引脚作普通GPIO使用的一个小问题
stm32·单片机·嵌入式硬件
蓝天居士14 小时前
PY32F040单片机介绍(2)
单片机·国产mcu
点灯小铭16 小时前
基于单片机的人体红外传感的步进电机调速自动门智能控制系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
一月千帆16 小时前
STM32 串口 Bootloader 固件升级方案实现
stm32·单片机·嵌入式硬件
朱嘉鼎17 小时前
GPIO引脚操作方法概述
单片机·嵌入式硬件
小+不通文墨19 小时前
GPIO口输入
stm32·单片机·嵌入式硬件
zzywxc78720 小时前
解锁 Rust 开发新可能:从系统内核到 Web 前端的全栈革命
开发语言·前端·python·单片机·嵌入式硬件·rust·scikit-learn