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.
工具/软件:Code Composer Studio
您好!
我使用的是 MSP430FR6972。
我正在传输一个数据(我们说:'A')。
我希望每2小时传输一次数据。
为此:我可以使用 RTC 中断吗?
(我想在 MSP430FR6972中仅使用内置 RTC)
我通过 RTC 知道这一点。 日期、时间是可能的。
是否可以在特定间隔后使用 RTC 来持续传输数据。
请告诉我。。 如何做到这一点。
(在程序中,给定的 C 代码,数据正在传输...仅每1秒一次...我需要较长的持续时间)
请告诉我。
此致、
Srijit
到目前为止、您有哪些产品? 示例 msp430fr6x7x_rtc_02.c 给出了总体设置:
https://dev.ti.com/tirex/explore/node?node=AMqRzK8tUCmNb7bzAweYxg__IOGqZri__LATEST
这种情况下 RTCTEV=0、每分钟、每分钟、每分钟触发一次 RTCTEVIFG。 [参考用户指南(SLAU367P)表29-7]。 您可以使用 RTCTEV=1来在这个小时内每小时触发一次(并且计数为2)。
要从现在开始每2小时触发一次(而不是在此时)、请不要使用 RTCEVIFG、而是 RTCAIFG (警报)。
1) 1)要开始、在 RTCHOUR 的当前内容中添加2 (小时)、设置 AE 位(0x80)并将其存储在 RTCAHOUR 中。[参考 UG 表29-30]。 然后获取 RTCMIN 的内容、设置 AE 位、并将其存储在 RTCAMIN 中。 然后启用 RTCAIE。
2) 2)每次中断(RTCIV_RTCAIFG)时、向 RTCAHOUR (模24)添加2 (小时)、设置 AE 位并将其放回 RTCAHOUR。
系统复位通常不会清除 RTC 寄存器、因此您应该填写大部分内容。 UG 第29.2.3节给出了一些注意事项
[编辑:也添加了设置 RTCAMIN ]
您好!
非常感谢您的回复。
我现在制作一个节目只需5分钟。
可以检查一下。
RTC 中断: #pragma vector=RTC_vector __interrupt void RTC_ISR (void) { switch (__evo_in_range (RTCIV、RTCIV_RT1PSIFG)) { 案例 RTCIV_NONE: 中断; //无中断 案例 RTCIV_RTCOFIFG:中断; // RTCOFIFG 案例 RTCIV_RTCRDYIFG: // RTCRDYIFG // putchar ('R'); // LPM3_EXIT; 中断; 案例 RTCIV_RTCTEVIFG: // RTCEVIFG // __no_operation(); //每分钟中断一次 // putchar ('R'); // LPM3_EXIT; 中断; 案例 RTCIV_RTCAIFG: putchar ('R'); LPM3_EXIT; 中断; // RTCAIFG 案例 RTCIV_RT0PSIFG:中断; // RT0PSIFG 案例 RTCIV_RT1PSIFG:中断; // RT1PSIFG 默认值:break; } } 主程序: int main (void) { WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器 PJSEL0 = BIT4 | BIT5; //对于 LFXT // PJSEL0 |= BIT6 | BIT7; //对于 LFXT //================================ 中断触控按键========================================= // P1IES = BIT1; // P1.2高/低边沿 // P1IFG = 0; //清除所有 P1中断标志 // P1IE = BIT1; // P1.2中断被启用 //==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== PM5CTL0 &=~LOCKLPM5; // XT1设置 CSCTL0_H = CSKEY >> 8; //解锁 CS 寄存器 CSCTL1 = DCOFSEL_0; //将 DCO 设置为1MHz CSCTL2 = SELA_LFXTCLK | SELESS__DCOCLK | SELM_DCOCLK; CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1; //将所有分频器设置为1 CSCTL4 &=~LFXTOFF; //启用 LFXT1 操作 { CSCTL5 &=~LFXTOFFG; //清除 XT1故障标志 SFRIFG1 &=~OFIFG; } while (SFRIFG1&OFIFG); //测试振荡器故障标志 CSCTL0_H = 0; //锁定 CS 寄存器 //======================================================== GPIO_init(); lcd_init(); UART_INIT(); lcd_display_buf (); //======================================== INTERRUPT================== P1IES |= 0x02; // P1.1 P1IFG &=~0x02; // P1.1 P1IE |= 0x02; //P1.1 //================================ timer================================= TA0CCTL0 |= CCIE; TA0CCR0 = 32768; TA0CTL |= tassel_1 | MC_1; //=================== rtc========================================= RTCCTL0_H = RTCKEY _H; //解锁 RTC // RTCCTL0_L = RTCOFIE | RTCAIE | RTCRDYIE | RTCTEVIE; //启用 RTC 读取就绪中断 //启用 RTC 时间事件中断 RTCCTL0_L = RTCAIE; // RTCCTL1 = RTCBCD | RTCHOLD | RTCMODE;// RTC 使能、BCD 模式、RTC 保持 RTCCTL1 = RTCBCD | RTCHOLD | RTCMODE | RTCTEV_0; ////现在尝试几分钟(5分钟) RTCYEAR = 0x2010; //年= 0x2010 RTCMON = 0x4; //月= 0x04 =四月 RTCDAY = 0x05; //天= 0x05 =第5个 RTCDOW = 0x01; //周中某天= 0x01 =星期一 RTCHOUR = 0x10; //小时= 0x10 RTCMIN = 0x32; //分钟= 0x32 RTCSEC = 0x45; //秒= 0x45 RTCAHOUR = 0x12; //0b10000010 RTCAMIN = 0x15; //0b10000101 RTCCTL1 &=~(RTCHOLD); //启动 RTC putchar ('5'); while (1) { _bis_SR_register (LPM3_bits | GIE); } //返回0; } 注:我还在使用 UART、端口中断、计时器、LCD。(这些都正常工作)
我正在尝试 几分钟,但它不起作用。(在'RTCIV_RTCTEVIFG'中:只工作1分钟)
此致、
Srijit
>
RTCAMIN = 0x15;
//0b10000101
这不会设置 AE 位。 它也是(在 BCD 中)(15+60-32)=43分钟到 RTCMIN、而不是5分钟。 尝试如下操作:
>
RTCAMIN = 0x37 | MINAE; // 5 minutes from xx:32:00, Alarm set
您好!
>RTCAMIN = 0x15;
这不会设置 AE 位。 它也是(在 BCD 中)(15+60-32)=43分钟到 RTCMIN、而不是5分钟。 :
您能解释一下吗?
>>“RTCAMIN = 0x37 | MINAE;” :请说明这个!!
正在等待您的回复。
此致、
Srijit
>>"RTCAMIN = 0x37 | MINAE;" :
MINAE 在编译中显示错误。
结果为 :“MINFAE”未定义。
尝试添加:
>#define MINAE 0x80 //启用报警
[编辑:很显然、我选择了错误的头文件。 请尝试:
> RTCAMIN = 0x37 | RTCAE;
这两种方式都可以正常工作。]
您好!
1)
">RTCAMIN = 0x37 | RTCAE;"
我已更改 RTCAMIN 值。
2)在 ISR 部分中:
案例 RTCIV_RTCAIFG:
putchar ('R');
LPM3_EXIT;
中断;
此时数据不传输。
当我运行这个时、我观察到 RTCADAY 和 RTCADOW 已设置 AE (0x80)位、所以警报永远不匹配。 这就是我之前提到的关于填写所有字段的内容。 [参考 UG 第29.2.3节]我添加了以下内容后运行正常:
>RTCADAY = RTCDAY;
>RTCADOW = RTCDOW;