大家好、
我一直在编写一些 MSP430代码来编写一些代码来初始化时钟和计时器。 我使用的是 MSP430F5418A。
这是我的时钟代码片段。 在这里、我已经设置了 FLLD 位、以便 DCOCLKDIV = DCOCLK/2。 默认情况下、SMCLK = DCOCLKDIV、因为我根本不更改它。
void clock_init()
{
WDTCTL = WDTPW+WDTHOLD;//停止 WDT
SetVcoreUp (PMMCOREV_3);//针对25MHz 时钟设置 VCORE = 1.9V
P1DIR |= BIT0;// P1.0输出
P11DIR |= 0x07;// ACLK、MCLK、SMCLK 设置为引脚
P11SEL |= 0x07;// P11.0、1、2用于调试。
UCSCTL3 |= SELREF_2;//设置 DCO FLL 基准= REFO
UCSCTL4 |= SELA_2;//设置 ACLK = REFO
_bis_SR_register (SCG0);//禁用 FLL 控制循环
UCSCTL0 = 0x0000;//设置可能的最低 DCOx、MODx
UCSCTL1 = DCORSEL_6;//选择 DCO 范围24MHz 运行
//***** 对于 dcoclockdiv = dcoclock/2*****、FLLD_1 //
UCSCTL2 = FLLD_1 + 731;//将 DCO 乘法器设置为24MHz
//(N + 1)* FLLRef = Fdco
//(731 + 1)* 32768 = 24MHz
//设置 FLL Div = fDCOCLK/2
_BIC_SR_register (SCG0);//启用 FLL 控制环路
// DCO 范围位已经存在时、DCO 的最坏情况稳定时间
//已更改 n x 32 x 32 x f_MCLK / f_FLL_reference。 请参阅5xx 中的 UCS 一章
// UG 进行优化。
// 32 x 32 x 25 MHz/32、768Hz = 819200 = DCO 稳定的 MCLK 周期。 我们再增加一些时间
_DELAY_CYCLES (50000);
_DELAY_CYCLES (50000);
//循环直到 XT1、XT2和 DCO 故障标志被清除
操作
{
UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
//清除 XT2、XT1、DCO 故障标志
SFRIFG1 &=~OFIFG;//清除故障标志
} while (SFRIFG1&OFIFG);//测试振荡器故障标志
}
现在、在计时器初始化中、我已经进行了如下设置。 计时器模块的时钟由 SMCLK 通过设置 TASSEL 位来提供。 那么、计时器时钟应该是 DCOCLKDIV = DCOCLK/2、对吧?
void timer_init()
{
///---------------- 计时器 A1 ------------------------------------------------------- //
TA1CCTL0 = CCIE;// CCR0中断被启用//这设置全局定时器中断
TA1CCR0 = 766;// PWM 周期(~32us)//31khz 间隔
TA1CCTL1 = OUTMOD_7;//reset/set
TA1CCTL2 = OUTMOD_7;//reset/set
TA1CCR1 = 0;//TA1.1
TA1CCR2 = 0;//TA1.2
TA1CTL = tassel_2 + MC_1 + TACLR;// SMCLK、upmode、clear TAR
}
但是、由于我的计时器中断会相应地触发、因此看起来我会得到计时器 clk = DCOCLK = 2 * DCOCLKDIV。 我缺少什么?
提前感谢。