当MSP430 5xx/6xx 系列外部接入32768Hz的低频晶振时,满足不了需要高速运行的应用。所以需要通过MCU内部的DCO(数字控制振荡器)和FLL(锁相环)将低速时钟32768Hz进行倍频,达到需要的目标频率。
DCO是一个集成的数字控制振荡器。DCO频率可以通过软件使用UCSCTL1.DCORSEL、UCSCTL0.DCO和UCSCTL0.MOD位进行调整。DCO频率可由FLL选择性地稳定到FLLREFCLK/n的多个倍频。FLL可以接受由UCSCTL3.SELREF位选择的不同参考时钟源。参考时钟源包括XT1CLK、REFOCLK或XT2CLK(如果可用)。n的值由UCSCTL3.FLLREFDIV位(n=1、2、4、8、12或16)定义。默认值为n=1。在某些情况下,可能不需要或不希望FLL操作;在这些情况下,不需要FLLREFCLK。这可以通过设置UCSCTL3.SELREF={7}来实现。
倍频器(N+1)和分频器值D定义了DCOCLK和DCOCLKDIV频率。倍频器(N+1)可使用UCSCTL2.FLLN位设置,其中N>0。可以使用的最小乘数(N+1)是2。如果无意中写入FLLN=0h,逻辑将导致FLLN=1h。因此,设置FLLN=0h也相当于设置FLLN=1h,并将产生乘2。所有其他FLLN设置的行为如下所述;例如,FLLN=2h导致乘3,或FLLN=3h导致乘4。
DCO频率区间选择参考
当选择适当的DCO频率范围(UCSCTL1.DCORSEL)时,目标DCO频率fDCO应设置为在fDCO(n,0)、MAX≤fDCO≤fDCO(n,31)、MIN范围内,其中:
fDCO(n,0),MAX代表:DCORSEL=n、DCO=0指定的最大频率,
fDCO(n,31)、MIN代表:DCORSEL=n、DCO=31指定的最小频率
工程介绍: 选择 REFOCLK 作为 DCO 参考时钟源
MCU型号: MSP430F6736A
编译平台: IAR for MSP430 6.40.1
实验项目: UCS时钟系统: 测试 DCO
选择 ACLK = REFOCLK = 32768 Hz
SMCLK = DCOCLKDIV = 262144 Hz
MCLK = DCOCLK = 524288 Hz
并将 ACLK SMCLK MCLK 输出到外部管脚, 以方便测试验证
#include "msp430.h"
#include "msp430f6736a.h"
// 延时1秒: 延时524288个MCLK时钟周期,因为MCLK=DCOCLK=524288Hz
#define DELAY_1s __delay_cycles(524288)
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 禁止看门狗
__bic_SR_register(GIE); // 禁止所有中断
// REFOCLK作为DCO输入, 启动DCO
UCSCTL3 |= SELREF__REFOCLK; // DCO的输入参考时钟源 FLLRef = REFOCLK = 32768 Hz
__bis_SR_register(SCG0); // 禁止 FLL 控制
UCSCTL0 = 0x0000; // DCO=0, MOD=0
UCSCTL1 = DCORSEL_0; // DCO 范围: 0.2MHz - 0.7MHz
UCSCTL2 = FLLD_1 | 7 ; // FLLD = 1(fDCO分频系数D = 2), N = 7
// fDCOCLK = D * (N + 1) * FLLRef = 2 * (7 + 1) * 32768 = 524288 Hz
// fDCOCLKDIV = fDCOCLK / D = 524288 / 2 = 262144 Hz
__bic_SR_register(SCG0); // 允许 FLL 控制
// DCO稳定时间 = UCSCTL3.FLLREFDIV(默认=1) * 32 * 32 个FLLRef周期 = 1 * 32 * 32 / 32768 (s)
// 因为 MCLK 默认为fDCOCLKDIV, 所以 MCLK = 262144 Hz
// 所以延时函数__delay_cycles()的参数(主时钟数量) = MCLK * DCO稳定时间 = 262144 * 1 * 32 * 32 / 32768 = 8192
__delay_cycles(8192);
// 循环检测 DCO 错误标志, 直至其消除
do
{
UCSCTL7 &= ~(DCOFFG); // 清除 DCO 错误标志
} while (UCSCTL7 & DCOFFG); // 检查 DCO 错误标志
// ACLK = REFOCLK = 32768 Hz, SMCLK = DCOCLKDIV = 262144 Hz, MCLK = DCOCLK = 524288 Hz
UCSCTL4 = SELA__REFOCLK | SELS__DCOCLKDIV | SELM__DCOCLK;
/************************
* MCU管脚96 : PJ.0 | SMCLK | TDO 包含 SMCLK 外围模块功能
* MCU管脚97 : PJ.1 | MCLK | TDI | TCLK 包含 MCLK 外围模块功能
* MCU管脚99 : PJ.3 | ACLK | TCK 包含 ACLK 外围模块功能
* 所以将 PORT J.0 J.1 J.3 的功能选择: 外围模块功能, 所以就可以输出对应的时钟信号
* PJ.0 功能选择: SMCLK
* PJ.1 功能选择: MCLK
* PJ.3 功能选择: ACLK
************************/
PJSEL = BIT3 | BIT1 | BIT0;
PJDIR = 0xff; // PJ输出模式
PJOUT = 0xff; // PJ输出0xff
// PORT 3 : P3.7 P3.6 P3.5 P3.4用作流水灯输出, 管脚功能:I/O 模式:输出
P3SEL = 0;
P3DIR = 0xf0;
P3OUT = 0xf0;
// 流水灯循环间隔时间=1s, 用来指示程序运行状态
char LampValue;
LampValue = 0x10;
while(1)
{
P3OUT = ~LampValue;
LampValue = LampValue<<1;
if (LampValue == 0x00) LampValue = 0x10;
DELAY_1s;
}
}
工程介绍: 选择 XT1CLK 作为 DCO 参考时钟源
MCU型号: MSP430F6736A
编译平台: IAR for MSP430 6.40.1
实验项目: UCS时钟系统: 测试 DCO
选择 ACLK = XT1CLK = 32768 Hz
SMCLK = DCOCLKDIV = 524288 Hz
MCLK = DCOCLK = 2097152 Hz
并将 ACLK SMCLK MCLK 输出到外部管脚, 以方便测试验证
#include "msp430.h"
#include "msp430f6736a.h"
// 延时1秒: 延时2097152个MCLK时钟周期,因为MCLK=DCOCLK=2097152Hz
#define DELAY_1s __delay_cycles(2097152)
//*************************************************************************************************
// 主流程
//*************************************************************************************************
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 禁止看门狗
__bic_SR_register(GIE); // 禁止所有中断
// 初始化XT1, 并使其正常工作
UCSCTL6 &= ~(XT1OFF+XT1BYPASS+XTS); // XT1开启 + XT1来源于外部晶体 + XT1低频模式
UCSCTL6 |= XT1DRIVE_3; // XT1低频模式的最大驱动能力和最大电流消耗
UCSCTL6 |= XCAP_3; // 负载电容=12pf
// 循环检测 XT1 错误标志, 直至其消除, XT1正常工作
do
{
UCSCTL7 &= ~XT1LFOFFG; // 清除 XT1 错误标志
} while (UCSCTL7 & XT1LFOFFG); // 检测 XT1 错误标志
// XT1CLK作为DCO输入, 启动DCO
UCSCTL3 |= SELREF__XT1CLK; // DCO的输入参考时钟源 FLLRef = XT1CLK = 32768 Hz
__bis_SR_register(SCG0); // 禁止 FLL 控制
UCSCTL0 = 0x0000; // DCO=0, MOD=0
UCSCTL1 = DCORSEL_1; // DCO 范围: 0.36MHz - 1.47MHz
UCSCTL2 = FLLD_2 | 15 ; // FLLD = 2(fDCO分频系数D = 4), N = 15
// fDCOCLK = D * (N + 1) * FLLRef = 4 * (15 + 1) * 32768 = 2097152 Hz
// fDCOCLKDIV = fDCOCLK / D = 2097152 / 4 = 524288 Hz
__bic_SR_register(SCG0); // 允许 FLL 控制
// DCO稳定时间 = UCSCTL3.FLLREFDIV(默认=1) * 32 * 32 个FLLRef周期 = 1 * 32 * 32 / 32768 (s)
// 因为 MCLK 默认为fDCOCLKDIV, 所以 MCLK = 524288 Hz
// 所以延时函数__delay_cycles()的参数(主时钟数量) = MCLK * DCO稳定时间 = 524288 * 1 * 32 * 32 / 32768 = 16384
__delay_cycles(16384);
// 循环检测 DCO 错误标志, 直至其消除
do
{
UCSCTL7 &= ~(DCOFFG); // 清除 DCO 错误标志
} while (UCSCTL7 & DCOFFG); // 检查 DCO 错误标志
// ACLK = XT1CLK = 32768 Hz, SMCLK = DCOCLKDIV = 524288 Hz, MCLK = DCOCLK = 2097152 Hz
UCSCTL4 = SELA__XT1CLK | SELS__DCOCLKDIV | SELM__DCOCLK;
/************************
* MCU管脚96 : PJ.0 | SMCLK | TDO 包含 SMCLK 外围模块功能
* MCU管脚97 : PJ.1 | MCLK | TDI | TCLK 包含 MCLK 外围模块功能
* MCU管脚99 : PJ.3 | ACLK | TCK 包含 ACLK 外围模块功能
* 所以将 PORT J.0 J.1 J.3 的功能选择: 外围模块功能, 所以就可以输出对应的时钟信号
* PJ.0 功能选择: SMCLK
* PJ.1 功能选择: MCLK
* PJ.3 功能选择: ACLK
************************/
PJSEL = BIT3 | BIT1 | BIT0;
PJDIR = 0xff; // PJ输出模式
PJOUT = 0xff; // PJ输出0xff
// PORT 3 : P3.7 P3.6 P3.5 P3.4用作流水灯输出, 管脚功能:I/O 模式:输出
P3SEL = 0;
P3DIR = 0xf0;
P3OUT = 0xf0;
// 流水灯循环间隔时间=1s, 用来指示程序运行状态
char LampValue;
LampValue = 0x10;
while(1)
{
P3OUT = ~LampValue;
LampValue = LampValue<<1;
if (LampValue == 0x00) LampValue = 0x10;
DELAY_1s;
}
}
上一篇:MSP430 5xx/6xx 定时器A增计数模式编程实例
下一篇:MSP430 5xx/6xx 外部晶振XT1(32.768kHz)编程实例
推荐阅读最新更新时间:2024-11-12 23:15
设计资源 培训 开发板 精华推荐
- RP602ZxxxA 1500mA 降压-升压 DC/DC 转换器与同步整流器的典型应用
- 使用 AD9051、10 位、60 Msps A/D 转换器实现单电源、单端、直流耦合的典型应用
- NCP12510B65GEVB:65 W 笔记本适配器评估板
- 使用 Richtek Technology Corporation 的 RT8560A 的参考设计
- 使用 Analog Devices 的 LTC3119EUFD 的参考设计
- ESP32 电子留言簿:别具一格的结婚礼物
- 3.7转12VMAX同步升压板,低纹波
- ESP32-WROOM-32
- MC33174DR2G 有源带通滤波器的典型应用
- EVAL-ADM1041EB,评估板允许在开关电源应用中快速评估 ADM1041