我正在尝试使用MSP430F5338微控制器的RTC_B模块设置日期/时间寄存器。 我是这样做的:
RTCCTL0 = 0;
RTCCTL1 |= RTCHOLD +RTCBCD;
RTCHOUR = 0x14;
RTCCTL1 &= ~RTCHOLD;
它不起作用,只是忽略了分配。我不明白为什么。我注意到的唯一奇怪的事情是RTCOFIFG
标志设置。
有什么想法吗?
附录
这是我设置时钟源的方式:
void clk_init(){
SetVcoreUp (0x01);
SetVcoreUp (0x02);
SetVcoreUp (0x03);
UCSCTL3 = SELREF_2; // Set DCO FLL reference = REFO
UCSCTL4 |= SELA_2; // Set ACLK = REFO
__bis_SR_register(SCG0); // Disable the FLL control loop
UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx
UCSCTL1 = DCORSEL_7; // Select DCO range 50MHz operation
UCSCTL2 = FLLD_1 | ((f_SMCLK/f_ACLK) -1); // Set DCO Multiplier for 25MHz
// (N + 1) * FLLRef = Fdco
// (762 + 1) * 32768 = 25MHz
// Set FLL Div = fDCOCLK/2
__bic_SR_register(SCG0); // Enable the FLL control loop
// Loop until XT1,XT2 & DCO stabilizes - In this case only DCO has to stabilize
do{
UCSCTL7 &= ~(XT2OFFG | XT1LFOFFG | DCOFFG);
// Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
}
void SetVcoreUp (unsigned int level)
{
// Open PMM registers for write
PMMCTL0_H = PMMPW_H;
// Set SVS/SVM high side new level
SVSMHCTL = SVSHE | SVSHRVL0 * level | SVMHE | SVSMHRRL0 * level;
// Set SVM low side to new level
SVSMLCTL = SVSLE | SVMLE | SVSMLRRL0 * level;
// Wait till SVM is settled
while ((PMMIFG & SVSMLDLYIFG) == 0);
// Clear already set flags
PMMIFG &= ~(SVMLVLRIFG | SVMLIFG);
// Set VCore to new level
PMMCTL0_L = PMMCOREV0 * level;
// Wait till new level reached
if ((PMMIFG & SVMLIFG))
while ((PMMIFG & SVMLVLRIFG) == 0);
// Set SVS/SVM low side to new level
SVSMLCTL = SVSLE | SVSLRVL0 * level | SVMLE | SVSMLRRL0 * level;
// Lock PMM registers for write access
PMMCTL0_H = 0x00;
}
答案 0 :(得分:1)
我已经解决了在时钟设置之前添加这个问题:
while (BAKCTL & LOCKBAK) BAKCTL &= ~LOCKBAK;
基本上这是因为msp430f5338具有备用电池系统,所以在设置XT1驱动ACLK之前你需要这个代码。
希望这有帮助。
答案 1 :(得分:0)
刚刚浏览了数据表 - 两件事:
通过在RTCBCD
中设置RTCCTL1
标记,您说要使用二进制编码的小数,因此将RTCHOUR
设置为0x0A
是无稽之谈。要为14:47(下午2:47)编写适当的BCD,您可以将小时编号为0x14
和0x47
作为分钟,即按您所见的方式编写。
确保您未处于低功耗模式5(LPM5) - 不保留配置设置。
<强>附录:强>
此外,RTCOFIFG
标志表示您的振荡器出现故障,因此请确认您的电路。