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.

[参考译文] MSP430F1611:RTC

Guru**** 2390755 points
Other Parts Discussed in Thread: MSP430FR4133, MSP430F1611

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/665170/msp430f1611-rtc

部件号:MSP430F1611
主题中讨论的其他部件:MSP430FR4133

尊敬的各位:

我正在尝试将TelosB与名为smartmesh motewww.linear.com/.../4330"的外部设备连接。

在这里,它们用于连接到mote的示例是MSP430fr4133发射台,它与TelosB(msp430f1611)有很大不同。

根据代码,LCD功能与初始化主板无关,可以使用我的现有代码单独完成。  

我被卡住的部分是代码的这一部分:

void fsm_scheduleEvent(uint16_t delay, fsm_timer_callback CB){

//记住调用
app_vars.fsmCb的函数 = CB;

//配置/启动RTC
RTCCTL = 0;
RTCMOD =延迟; //延迟(以32kHz时钟周期)
RTCCTL |= RTCIE; //启用中断
RTCCTL |= RTCPS_0; //分隔器/1
RTCCTL |= RTCSS_2; //时钟源为XT1CLK
RTCCTL |= RTCSR; //重置RTC
}

如果我错了,请更正我,但据我所知,MSP430f1611没有可用的RTC库。

有人能告诉我如何处理这个问题吗?

完整代码附在本帖子中。

谢谢你

此致

e2e.ti.com/.../8461.main.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    F1611本身没有RTC模块,但您可以使用普通计时器提供一些RTC式功能。 如果TelosB具有32kHz (XT1)晶体,我建议使用ACLK运行计时器。

    此代码片段表明,代码的其余部分对RTC的要求不大,实际上只是一触式延迟;这对TimerA或TimerB来说并不困难。 (您可能需要检查当前的代码库,以查看该函数是否已存在。)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的帖子。

    这是我为TelsoB写的,用来执行RTC的功能。

    void fsm_scheduleEvent(uint16_t delay, fsm_timer_callback CB){
    
    //记住调用
    app_vars.fsmCb的函数 = CB;
    
    //配置/启动RTC
    RTCCTL = 0;
    RTCMOD =延迟; //延迟(以32kHz时钟周期)
    RTCCTL |= RTCIE; //启用中断
    RTCCTL |= RTCPS_0; //分隔器/1
    RTCCTL |= RTCSS_2; //时钟源为XT1CLK
    RTCCTL |= RTCSR; //重置RTC
    
    //为TelosB
    TACCTL0配置= CCIE;//捕获/比较中断启用
    TACTL = Tassel_1 | MC_1;//选择ACLK,'Counting Up (计数)模式,输入分配器(1)
    TACCR0 = 3.2786万;//延迟一秒以模拟RTC
    TACCTL0的延迟模式= OUTMOD_5 //重置计时器,但不确定是否需要,因为计数到3.2786万后,计时器将重置。
    } 
    #pragma vector = rtc_vector
    __interrupt void rtc_isr (void){
    volatile uint16_t iv;
    iv = RTCIV;
    
    app_vars.fsmCb();
    }//
    
    简要当TimerA中断触发TelosB以替换RTC_vector
    #pragma vector = TIMERA0_vector
    __interrupt void TIMARA0_ISR (void){
    volatile uint16_t iv;时调用此函数;
    IV = TAIV;
    
    app_vars.fsmCb();
    }
    
    如果您认为我漏掉了一些东西,请告诉我 
    谢谢你
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为您走的是正确的道路(根据我对意图的理解),但是

    1)无需设置OUTMOD。 (同时,您的操作方式也会清除CCIE。)
    2)将CCR0设置为="delay",而不是3.2768万。

    > TACTL0 = CCIE;//捕获/比较中断启用
    > TACR0 =延迟;//此多个(32kHz)刻度的延迟,模拟RTC的延迟模式
    > TACTL = Tassel_1 | MC_2|TALCLR;//选择ACLK,连续模式,输入分配器(1),在0重新启动。

    我还做了一个细微的改变:通过使用连续模式(MC_2),您可以相当肯定地及时停止计时器,即使是非常短的延迟。

    3)在ISR中,不要读取TAIV (它不相关),但要使用停止计时器
    > TACTL= 0;
    RTC代码不执行此操作似乎有点奇怪。 也许他们认为在不到1秒的时间内将再次调用此函数?