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.

[参考译文] CCS/MSP430FR2311:RTC RTCCNT 寄存器不清零

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/869337/ccs-msp430fr2311-rtc-rtccnt-register-not-clearing

器件型号:MSP430FR2311

工具/软件:Code Composer Studio

这是一个重贴。 如果有人发现代码有问题、请告诉我。 如果有人可以在另一个 FR LaunchPad 上运行该程序、请告诉我结果。 RTC 运行正常、中断正常、甚至可以设置和复位中断、如调试器中所示。 我无法复位 RTCCNT 寄存器。 RTCCTL 的位6应复位计数、但不会复位计数。

我假设在位6保持高电平的情况下、它将保持计数器复位、直到该位被释放。 我不知道,因为我根本不能重置计数器!!

我使用的是 CCS9.3、并且从 笔记本电脑中删除了所有其他版本以及所有 TI 内容。 当我转移项目时、只有文本被转移。 这纯粹是 CCS9.3、并且总的来说、该程序比我之前的程序稳定得多。 我无法使 RTC 复位。

即使调试器执行 RTCCTL|= BIT6、也不会发生任何情况。 当单步执行 InitRTC()时,同样不会发生任何情况。 当 InitRTC()中的位0被置位时、RTCCTL 的值和中断状态一样发生变化。 但 RTCCNT 寄存器不会发生任何情况。

下面是一些代码;

空 Init_rtc ()

   SYSCFG2|= BITA;                                 针对 ACLK 的/*配置                                                           *
   RTCCTL = 0b0000000001000000;            //停止 RTC、ACLK、预分频器= 1、32768计数/秒                  *
   RTCMOD= 10000;                                /* 656=20ms                                                                       *

 要重置计数、  

RTCCTL|= BIT6;

为了启动和停止 RTC、

define rtcSTART   RTCCTL&=~BIT6、RTCCTL|= BIT1、RTCCTL|= BITC

define rtcSTOP    RTCCTL&&=~BITC、RTCCTL|= BIT6、RTCCTL&&=~BIT1

请提供任何帮助。

作为侧注、我已经放弃了"~"符号来指示反转。 我犯了这么多错误、忘记输入、现在我这么做了、

define bit0   ~BIT0
define bit1   ~BIT1
define bit 2   ~BIT2
define bit 3   ~BIT3
define bit 4   ~BIT4
#define Bit5   ~BIT5
#define bit 6   ~BIT6
define bit 7   ~BIT7
define bit 8   ~BIT8
define bit 9   ~BIT9
#define BITA   ~BITA
#define bitB   ~BITB
#define BITC   ~BITC
define bitD   ~BITD
#define Bite   ~Bite
#define bitF   ~BITF

代码现在看起来像这样、

define rtcSTART   RTCCTL&= bit6、RTCCTL|= BIT1、RTCCTL|= BITC

define rtcSTOP    RTCCTL&&= BITC、RTCCTL|= BIT6、RTCCTL&&位1

它更易于编写、更易于阅读、而且不太容易遗漏。

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

    我认为这里的关键是[参考用户指南(SLAU445I)第15.2.1节]:"如果计数器由软件复位、 影子寄存器在分频时钟的下一个周期由模数寄存器中的值更新"[强调已添加]观察到的行为是、计数器在更新影子寄存器的相同操作中被清除、即直到下一个时钟节拍才会发生。 (这一句话本可以更好地表述。)

    您的 rtcSTOP 会在停止时钟后设置 RTCSR、以便永远不会发生该事件。 此外、它甚至不会立即发生、而是在(假设更慢)时钟周期时发生。

    下面是一个示例。 当在 Launchpad 上运行时、您应该会看到 LED1每秒闪烁一次、表示 RTC 正在计数、LED2保持(几乎)稳定、表示 RTCSR (最终)工作正常。

    该程序的大部分内容是演示内容、密钥位于替换 rtcSTOP 中、这是(a) RTCSR (b)等待 RTCCNT 变为0 (ACLK 节拍)(c)关闭时钟。 实际上、您可能不需要像这样等待、因为您不关心 RTC 停止时 RTCCNT=0是否停止。

    #include 
    define Hz 1000000UL //更多或更少
    #if 0
    #define rtcSTART RTCCTL&=~BIT6、RTCCTL|= BIT1、RTCCTL|= BITC // IE=1、CSS=1 (ACLK)
    #define rtcSTOP RTCCTL&=~BITC、RTCCTL|= BIT6、RTCCTL&=~BIT1 // CSS=0 (停止)、IE=0
    #else
    #define rtcSTARRT DO{RTCCTL |= RTCIE;RTCCTL |= RTCSS_1;}while (0)// IE=1、cSS=1 (
    定义 rtcSTOP) DO{RTCCTL |=RTCSR;while (RTCCNT!=0);RTCCTL &&~RTCSS;RTCCTL &&~RTCIE;}while (
    
    
    0)#endif #define LED1CFG () DO{P1OUT &=~
    ~
    ~BIT0;P1DIR |= BIT0;}while (0)#define B1OUT (while)=
    1 TOP0);= 1 TOP0 (while (while = 1)= 1 OFF (while = 1)| BIT0 (while 1)(while = 1)(while = 1 TO_OFF;= 1) 否则 P2OUT &=~BIT0;}while (0)
    
    void Init_RTC ()
    {
    SYSCFG2|= RTCCKSEL; //////*配置 ACLK *
    RTCCTL = 0b0000000001000000;////////*停止 RTC、ACLK、预分频器=1、32768计数/秒 *
    RTCMOD= 10000; ///* 656=20ms */
    }
    
    unsigned rtccnt1、rtccnt2;
    int
    main (void)
    {
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    
    LED1CFG();
    LED2CFG();
    PM5CTL0 &=~LOCKLPM5;
    Init_RTC ();
    LED1SET (1); // blip
    __delay_cycles (5*50);// REFO 启动
    LED1SET (0);
    while (1)
    {
    LED1SET (0);
    LED2SET (0);
    rtcSTART;
    如果(RTCCNT = 0){LED1SET (1);}//确保将其清除
    __DELAY_CYCLLES (3*32);//三个 ACLK 周期(SORTA)
    rtccnt1 = RTCCNT;
    如果(RTCCNT!= 0){LED1SET (0);}//确保它已计数
    rtcSTOP;
    __delay_cycles (3*32);// APX 3 ACLK 周期以确保它停止
    rtccnt2 = RTCCNT;
    如果(RTCCNT = 0){LED2SET (1);}//确保将其清除
    _DELAY_CYCLES (Hz); //暂停以获取所有内容
    }
    /*NOTREACHED*/
    返回0;
    }
    

    [编辑:编辑了代码的第8行、所以显示时看起来不是很糟糕。 还修复了技术。]

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

    您好、Bruce、

    感谢您的快速回复和新年快乐!

    在过去几天里,我读过你多次描述的段落,但我仍然看不到你对它的解释。 如果精密实时计数器不从零开始、那么它有什么优点?

    很明显、该段规定先重置 RTCCNT、然后更新影子寄存器。 图15.1显示了到影子寄存器和 RTCCNT 的 RTCSR 线 OR。 所以您的解释是正确的。 该段需要完全改写。

    我使用 timer_A 尝试了相同的过程、重置计数器时没有问题。 但是、不仅已使用 TIMER_A、最大计时周期也太短。

    如果(RTCCNT=0)需要工作、我只是不确定如何实现这一点。

    感谢你能抽出时间!

    Robert。

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

    大家好、Bruce、

    第一次读取您的响应时、我假设您所提到的附加时钟节拍是在 RTC 再次启动后进行的。 读取代码后、任何其他时钟功能都会清除 RTC。 我将立即对其进行测试。

    更多内容...

    Robert。

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

    您好、Bruce、

    当我单步执行定时器_A 时、计数器会明显复位。

    当我单步执行 RTC 时,即使通过 InitRTC(),计数器也不会复位。 步进调试时、时钟是否关闭?

    是否确定 RTC 在关闭时通过时钟节拍复位? 或者在启动后是否需要一个节拍?

    如果后者为 true、if (RTCCNT=0)将永远不起作用!

    Robert。

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

    您好、Bruce、

    好的、这是 RTC 打开时的下一个时钟周期。 修改后的 rtcSTOP 将对我有效、但设计此时钟结构的任何人都应得到 F

    Robert。

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

    您好、Bruce、

    我忘了 说谢谢!

    谢谢!

    Robert。

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

    我很高兴您能正常工作。 我认为我所使用的每个 RTC 都有某种时钟边界查询或另一种时钟边界查询(大多数情况更糟)。