This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR2311:RTC 间隔不正确

Guru**** 2387080 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/786294/msp430fr2311-rtc-interval-incorrect

器件型号:MSP430FR2311

如果这是我的错误或 driverlib 的问题、我不确定会发生什么情况、但我无法从 RTC 获得预期的中断速率。  下面的代码为我提供了一个2ms 的中断周期。  如果我执行数学1/0.002 = 500Hz。  500Hz *32000=16MHz。  RTC 模块的时钟似乎不正确。

我还会收到   有关 RTC_clearInterrupt (RTC_BASE、RTC_CLOCKSOURCE_SMCLK)的警告;  即"#70-D 整数转换导致截断"

*编辑: 作为另一个数据点、我将 TimerB 配置为以128Hz 的频率进行中断、并将 ACLK 连接为其 CLK 源。  我已验证它是否按预期以128Hz 的频率运行。

int main (void){
//停止 WDT
WDT_A_HOLD (WDT_A_base);

initClockTo16MHz();

//初始化外设*/
initGPIO();
initRTC();

while (1)
{

}



void initGPIO (void){

//输入为0,输出为1

//将 Px.x 设定为输出方向
P1DIR |= 0b00000000;//输入
P2DIR |= 0b00001011;
P2OUT = 0x00;

PMM_enableTempSensor ();//启用温度传感器
PMM_enableInternalReference();

//选择 P2.0作为 PWM 计时器输出功能
P2SEL0 |= GPIO_PIN0;

P1SEL1 &=~(BIT7); // USCI_A0 UART 操作仅发送
P1SEL0 |= BIT7;

// I2C 引脚
P1SEL0 |= BIT2 | BIT3;
P1SEL1 &=~(BIT2 | BIT3);

//ADC 引脚
P1SEL0 |= BIT0 | BIT1;
P1SEL1 |= BIT0 | BIT1;
/*
*禁用 GPIO 上电默认高阻抗模式以激活
*先前配置的端口设置
*
PMM_unlockLPM5 ();
}

void initClockTo16MHz ()
{
//根据 MCLK 的器件数据表的要求配置一个 FRAM 等待状态
//在配置时钟系统之前在8MHz 以上运行。
FRCTL0 = FRCTLPW | NWAITS_1;

_bis_SR_register (SCG0);//禁用 FLL
CSCTL3 |= SELREF_REFOCLK;//将 REFO 设置为 FLL 基准源
CSCTL0 = 0; //清除 DCO 和 MOD 寄存器
CSCTL1 &=~(DCORSEL_7); //首先清除 DCO 频率选择位
CSCTL1 |= DCORSEL_5; //设置 DCO = 16MHz
CSCTL2 = FLLD_0 + 487; //设置为 fDCOCLKDIV =(FLLN + 1)*(fFLLREFCLK/n)
// =(487 + 1)*(32.768 kHz/1)
// = 16MHz

_DELAY_CYCLES (3);
_BIC_SR_register (SCG0); //启用 FLL
while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1)); // FLL 锁定

CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;
}


// RTC 中断服务例程
#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
#pragma vector=RTC_vector
__interrupt RTC_ISR (void)
#Elif defined (__IAR_systems_ICC_)(void


)(void)(void)(n_rtc)(void)(void)(void)
#endif
{

switch (__even_in_range (RTCIV、RTCIV_RTCIF)

){

案例 RTCIV_NONE:中断; //无中断

案例 RTCIV_RTCIF: // RTC 溢出
P2OUT ^= BIT3;
//P2OUT &=~BIT3;
//P2OUT |= BIT3;
中断;

默认值:break;

}



void initrtc()
{
SYSCFG2 |= RTCCKSEL;//配置为使用 ACLK 而不是 SMCLK

RTC_INIT (RTC_BASE、32000、RTC_CLOCKDIVIDER_1);
RTC_clearInterrupt (RTC_BASE、RTC_CLOCKSOURCE_SMCLK);
RTC_enableInterrupt (RTC_BASE、RTC_overflow_interrupt);
RTC_START (RTC_BASE、RTC_CLOCKSOURCE_SMCLK);
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    SYSCFG2 |= RTCCKSEL;//配置为使用 ACLK 而不是 SMCLK 

    您将什么时钟源用于 RTC、ACLK 或 SMCLK?

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为这一行代码告诉它使用 ACLK 而不是 SMCLK。 我是根据图6-1 www.ti.com/.../msp430fr2311.pdf 来假设这一点 的,因此在图中,我假设 SYSCFG2 RTCCKSEL 置位时,使用 ACLK 会覆盖它,我在该 ACLK 中告诉它在 initRTC()函数中使用 SMCLK
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请参阅示例代码:

    /*-版权所有-、BSD_EX
    *版权所有(c) 2014、德州仪器(TI)公司
    *保留所有权利。
    *
    *
    只要
    符合以下条件*、允许以源代码和二进制形式重新分发和使用:
    *
    *源代码的重新分发必须保留上述版权
    声明*、此条件列表和以下免责声明。
    *
    ***二进制形式的再发行必须在
    
    *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
    *
    ***未经
    
    事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *、
    
    不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、COPYRRTCCTLIGHT 所有者或
    *贡献者都不对任何直接、间接、偶然、特殊、
    *模范、 或相应的损害(包括但不限于
    *采购替代产品或服务;丧失使用、数据或利润;
    *或业务中断)、但出于任何责任理论
    、*无论是在合同中、严格责任还是由于
    使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
    、*即使已获悉可能会发生此类损坏。
    *
    ***
    *
    * MSP430代码示例免责声明
    *
    * MSP430代码示例是自包含的低级程序
    ,通常*以
    高度*简明的方式演示单个外设功能或器件功能。 为此、代码可能依赖于器件的加电默认
    值*寄存器值和时钟配置等设置、
    并且在组合多个示例中的代码时必须*小心以避免潜在的副作用
    *。 另请参阅 www.ti.com/grace 了解 GUI、并参阅 www.ti.com/msp430ware
    *了解外设配置的 API 函数库方法。
    *
    *--/版权--*
    //*********
    // MSP430FR231x 演示- RTC、每1次切换 P1.0
    //
    //说明:配置 ACLK 以将 REFO 用作 RTC 源时钟,
    // ACLK = REFO = 32kHz、MCLK = SMCLK =默认 DCODIV =~1MHz。
    //
    // MSP430FR2311
    // --------
    // /|\| |
    // || |
    // -|RST |
    // | |
    // | |
    // | P1.0 |-->LED
    // | |
    //
    // Darren Lu
    // Texas Instruments Inc.
    // 2015年10月
    //使用 IAR 嵌入式工作平台 v6.30和 Code Composer Studio v6.1构建
    //*********
    #include 
    
    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
    
    P1OUT &=~BIT0; //清除已定义加电状态的 P1.0输出锁存器
    P1DIR |= BIT0; //将 P1.0设置为输出方向
    
    PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式
    //激活先前配置的端口设置
    
    
    // RTC 计数重载比较值为32。
    // 1024/32768 * 32 = 1秒
    RTCMOD = 32-1;
    //初始化 RTC
    //源= ACLK = REFO,除以1024
    SYSCFG2 |= RTCCKSEL; //选择 ACLK 作为 RTC 时钟
    RTCCTL = RTCSS_1 | RTCSR | RTCPS__1024 | RTCIE;
    
    _bis_SR_register (LPM3_bits | GIE); //输入 LPM3、启用中断
    }
    
    // RTC 中断服务例程
    #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
    #pragma vector=RTC_vector
    __interrupt void RTC_ISR (void)
    #Elif defined (__GRTC_)
    void __attribute__((((NUC) void)#rTC_vector (void
    
    )#rc!错误!
    #endif
    {
    开关(__evo_in_range (RTCIV、RTCIV_RTCIF))
    {
    案例 RTCIV_NONE:中断; //无中断
    案例 RTCIV_RTCIF: // RTC 溢出
    P1OUT ^= BIT0;
    中断;
    默认值:break;
    }
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我会尝试这个。 它出现在我的代码中、我正在执行完全相同的操作。