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.

[参考译文] MSP430FR5994:RTC 计数器模式中断、以秒为单位

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1199882/msp430fr5994-rtc-counter-mode-interrupt-in-seconds

器件型号:MSP430FR5994

您好!  

对于下面的 RTC 示例、如何每1秒触发一次中断? 如果我正确地进行了数学运算、RT1PS 的输出为250Hz: 34KHz /4 (RTCPS0CTL 除以4)/16  (RTCPS1CTL 除以16)。  

因此、在250Hz 时、周期将为.004秒。 代码如何使 LED 每1秒切换一次?

/*-版权所有-、BSD_EX
*版权所有(c) 2012、德州仪器(TI)公司
*保留所有权利。
*
*
只要
符合以下条件*、允许以源代码和二进制形式重新分发和使用:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
***二进制形式的再发行必须在

*随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
***未经

事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*、

不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
*贡献者都不对任何直接、间接、偶然、特殊、
*模范、 或相应的损害(包括但不限于
*采购替代产品或服务;丧失使用、数据或利润;
*或业务中断)、但出于任何责任理论
、*无论是在合同中、严格责任还是由于
使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
、*即使已获悉可能会发生此类损坏。
*
***
*
* MSP430代码示例免责声明
*
* MSP430代码示例是自包含的低级程序
,通常*以
高度*简明的方式演示单个外设功能或器件功能。 为此、代码可能依赖于器件的加电默认
值*寄存器值和时钟配置等设置、
并且在组合多个示例中的代码时必须*小心以避免潜在的副作用
*。 另请参阅 www.ti.com/grace 了解 GUI、并参阅 www.ti.com/msp430ware
*了解外设配置的 API 函数库方法。
*
*--/版权--*
//*********
// MSP430FR69xx 演示-计数器模式下的 RTC 每1次切换 P1.0
//
//此程序演示配置为 ACLK 源的计数器模式下的 RTC
//每1次切换 P1.0 LED。
//
// MSP430FR6989
// --------
// /|\| |
// || XIN|--
// ---|RST | 32768Hz
// | XOUT|--
// | |
// | P1.0|->LED
//
William Goh
// Texas Instruments Inc.
// 2014年8月
//使用 IAR 嵌入式工作平台 V5.60和 Code Composer Studio V6.0构建
//*********

#include 

int main (void)
{
WDTCTL = WDTPW | WDTHOLD; //停止 WDT

P1OUT &=~BIT0;
P1DIR |= BIT0;

PJSEL0 = BIT4 | BIT5; //初始化 LFXT 引脚

//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;

//配置 LFXT 32kHz 晶振
CSCTL0_H = CSKEY >> 8; //解锁 CS 寄存器
CSCTL4 &=~LFXTOFF; //启用 LFXT
操作
{
CSCTL5 &=~LFXTOFFG; //清除 LFXT 故障标志
SFRIFG1 &=~OFIFG;
} while (SFRIFG1和 OFIFG); //测试振荡器故障标志
CSCTL0_H = 0; //锁定 CS 寄存器

//设置 RTC 计时器
RTCCTL0_H = RTCKEY _H; //解锁 RTC

RTCCTL0_L = RTCTEVIE; // RTC 事件中断使能
RTCCTL1 = RTCSSEL_2 | RTCTEV_0 | RTCHOLD;//计数器模式、RTC1PS、8位 OVF
RTCPS0CTL = RT0PSDIV1; // ACLK、/8
RTCPS1CTL = RT1SSEL1 | RT1PSDIV0 | RT1PSDIV1;//从 RT0PS 输出、/16

RTCCTL1 &=~(RTCHOLD); //启动 RTC

_bis_SR_register (LPM3_bits | GIE); //在启用中断的情况下进入 LPM3模式
__no_operation();

返回0;
}

#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
#pragma vector=RTC_vector
__interrupt void RTC_ISR (void)
#Elif defined (__GNU__)
void __attribute__((interrupt (RTC_vector)))) RTC_ISR (void

编译器#else 不支持!
#endif
{
switch (__evo_in_range (RTCIV、RTCIV_RT1PSIFG))
{
案例 RTCIV_NONE: 中断; //无中断
案例 RTCIV_RTCOFIFG:中断; // RTCOFIFG
案例 RTCIV_RTCRDYIFG:中断; // RTCRDYIFG
案例 RTCIV_RTCTEVIFG: // RTCEVIFG
P1OUT ^= BIT0; //切换 P1.0 LED
中断;
案例 RTCIV_RTCAIFG:中断; // RTCAIFG
案例 RTCIV_RT0PSIFG:中断; // RT0PSIFG
案例 RTCIV_RT1PSIFG:中断; // RT1PSIFG
默认值:break;
}
} 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    RTCCTL1 = RTCSSEL_2 | RTCTEV_0 | RTCHOLD;//计数器模式、RTC1PS、8位 OVF 
    8位溢出意味着当计数器计数到0xFF = 255时、它将生成溢出中断。
    RTCPS0CTL = RT0PSDIV1; // ACLK、/8
    RT0PS = 32768/8 = 4096 RTCPS1CTL = RT1SSEL1 | RT1PSDIV0 | RT1PSDIV1;//从 RT0PS 输出、/16
    RT1PS = RT0PS/16 = 4096/16=256

    这就是您获取1秒中断的方式。
    此致、
    现金 Hao
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢您的澄清。 1/256 =.0039s、这次255 =.996s。  

    最后一个问题是、如果 RT1IPx 默认为零、这是否意味着中断间隔被2分频? 这是否会以任何方式影响代码?

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

    您好!

    我之前没有注意到这个 RT1IPx 寄存器。 它不应影响代码的默认值。 我可以在本周对此进行研究。  

    此致、

    现金 Hao