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.

[参考译文] MSP432P401R:更新/读取 RTC 值并打印到16x2 LCD 时需要帮助

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/979489/msp432p401r-need-help-updating-reading-rtc-values-and-printing-to-16x2-lcd

器件型号:MSP432P401R

我目前正在编写一个程序、该程序使用 MSP432的内置 RTC 模块在8位模式下的16x2 Hitachi HD44780 LCD 上显示日期和时间。 该程序使用来自 MSP432P4 driverlib 的 RTC_c_calender_interrupt 示例。我正在使用外部库来处理 LCD 的打印。 有关库 https://e2e.ti.com/support/archive/launchyourdesign/m/msp430microcontrollerprojects/666684、请参阅此链接

我目前能够为定时器/日历定义一个初始值、(请见 RTC_C_Calendar CurrentTime)并且能够以正确的格式将这个值写入 LCD。 但是、我完全一直在实际让 RTC 更新、并每秒将当前时间写入 LCD 一次。 我已经尝试声明第二个 RTC_C_Calendar 变量、称为 newTime、这是我要存储当前日期/时间的地方。 然后、我将在每秒更新一次 LCD 时使用这些值。 每当我在写入 LCD 时尝试从 while 循环中的 newTime 中提取 hte 值时、它会读取全0、因此我的时间是00:00:00、我的日期是0/00。 我的代码粘贴在下面。 如果能就我在这里需要做的事情提供一些指导和解释,我将不胜感激。

* MSP432 RTC_C -日历模式
*
*说明:此程序通过触发来演示 RTC 模式
*每分钟中断一次。 日期在执行开始时设置、然后是
*特定时间的附加警报也设置为演示各种警报
RTC_C 模块的警报/事件模式。
*
* MSP432P401
***************************************
*/|\||
*|||
*-|RST P1.0 |-->P1.0 LED
*| PJ.0 LFXIN |---
*|||
*||< 32kHz XTAL >
*|||
*| PJ.1 LFXOUT |---
*
秘书长的报告 /
/* DriverLib 包括*/
#include
#include
#include "HD44780.h"

/*静态*/
静态易失性 RTC_C_Calendar newTime;

uint8_t 次级标志= 1;

字符 timeBuffer[14];
字符 dataBuffer[11];
字符 DAYBuffer[5];

//![简单 RTC 配置]
/*时间为1955年11月12日星期六晚上10:03 *
RTC_C_Calendar CurrentTime =

0x00、//秒
0x03、//分钟
0x22、//hours
0x06、//周中某天
0x12、//月中某天
0x11、//月
0x1955//年
};
//![简单 RTC 配置]

/* Timer_A 向上计数模式配置参数*/
Timer_A_UpModeConfig upConfig =

Timer_A_CLOCKSOURCE_SMCLK、// SMCLK 时钟源(3MHz)
Timer_A_CLOCKSOURCE_DELAG_64、// SMCLK/64 = 46875Hz
50、// 1毫秒计时器的50个节拍周期
Timer_A_TAIE_INTERRUPT_DISABLE、//禁用计时器中断
Timer_A_CCIE_CCR0_INTERRUPT_ENABLE、//**启用** CCR0中断
Timer_A_DO 清除//清除值
};

int main (空)

/*停止 WDT */
MAP_WDT_A_HOLDTimer();

P4DIR = 0xFF;//将 P4.0 (D0)设置为 P4.7 (D7)以输出(HD44780数据线)
MAP_GPIO_setAsOutputPin (GPIO_PORT_P5、GPIO_PIN6);//将 P5.6 (E)和 P5.7 (RS)设置为输出(HD44780控制线- R/W 连接到 GND)
MAP_GPIO_setAsOutputPin (GPIO_PORT_P5、GPIO_PIN7);

MAP_Timer_A_configureUpMode (timer_A1_base、&upConfig);

/*为外设/晶体使用配置引脚、为输出配置 LED */
MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_PJ、
GPIO_PIN0 | GPIO_PIN1、GPIO_PRIMARY_MODULE_FUNCTION);
MAP_GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);

/*设置外部时钟频率。 此 API 是可选的、但会是可选的
*如果用户想使用 getMCLK/getACLK/etc、就来方便
函数
*
cs_setExternalClockSourceFrequency (32000、48000000);

/*在非旁路模式下启动 LFXT 而不超时。 *
CS_startLFXT (CS_LFXT_DRIVE3);

MAP_CS_initClockSignal (CS_SMCLK、CS_HFXTCLK_SELECT、CS_Clock_divider _16);//SMCLK = 3MHz

//![简单 RTC 示例]
/*按照中的时间描述,用当前时间初始化 RTC
*定义部分*/
MAP_RTC_C_initCalendar (&CurrentTime、RTC_C_FORMAT_BCD);


/*设置10:04pm 的日历警报(对于磁通电容器)*/
MAP_RTC_C_setCalendarAlarm (0x04、0x22、RTC_C_ALARMCONDITION_OFF、
RTC_C_ALARMCONDITION_OFF);

/*指定一个中断,每分钟发出一次*/
MAP_RTC_C_setCalendarEvent (RTC_C_CALENDAREVENT_INTOTECHANGE);

/*启用 RTC 就绪状态中断、当 RTC 时该中断有效
*日历寄存器已准备好读取。
*此外,为日历警报和日历事件启用中断。 *
MAP_RTC_C_clearInterruptFlag (
RTC_C_CLOCK 读取就绪中断| RTC_C_TIME_EVENT_INTERRUPT
| RTC_C_CLOCK_ALARM_INTERRUPT);
MAP_RTC_C_enableInterrupt (
RTC_C_CLOCK 读取就绪中断| RTC_C_TIME_EVENT_INTERRUPT
| RTC_C_CLOCK_ALARM_INTERRUPT);
//![简单 RTC 示例]

/*启用中断并进入睡眠模式。 *
MAP_Interrupt_enableInterrupt (INT_RTC_C);
MAP_Interrupt_enableSlepOnIsrExit();
MAP_Interrupt_enableInterrupt (INT_TA1_0);
HD44780_CLEAR_SCREEN ();
MAP_Timer_A_startCounter (timer_A1_base、timer_A_up_mode);
/*启动 RTC 时钟*/
MAP_RTC_C_startClock();
MAP_Interrupt_enableMaster();

while (1)

if (secondFlag = 1){
/*写入时间:HH:MM:ss 至 LCD 的第一行*/
sprintf (timebuffer、"时间:%02d:%02d:%02d"、RTC_C_convertBCDToBinary (newTime.hours)、
RTC_C_convertBCDToBinary (newTime.Minutes)、RTC_C_convertBCDToBinary (newTime.seconds));
HD44780_WRITE_STRING (时间缓冲器、1、1、1);

/*每周的书写日至第二排液晶屏*/
if (CurrentTime.dayOfWeek =0){
sprintf (dayBuffer、"Sun");

否则、if (CurrentTime.dayOfWeek == 1){
sprintf (dayBuffer、"MON");

否则、if (CurrentTime.dayOfWeek == 2){
sprintf (dayBuffer、"Tue、");

否则、if (CurrentTime.dayOfWeek == 3){
sprintf (dayBuffer、"Wed、");

否则、if (CurrentTime.dayOfWeek == 4){
sprintf (dayBuffer、"Thu、");

否则、if (CurrentTime.dayOfWeek == 5){
sprintf (dayBuffer、"星期五");

否则{
sprintf (dayBuffer、"Sat、");

HD44780_WRITE_STRING (DAYBuffer、2、1、1);

/*将日期 mm/dd/yyyy 写入 LCD 的底行一周后*/
sprintf (dataBuffer、"%d/%02d/%d"、RTC_C_convertBCDToBinary (newTime.Month)、
RTC_C_convertBCDToBinary (newTime.dayofmonth)、RTC_C_convertBCDToBinary (newTime.year);
HD44780_WRITE_STRING (数据缓冲区、2、6、1);

/*将辅助标志重置为0*/
次级标志= 0;

MAP_PCM_gotoLPM0 ();

/* RTC ISR */
void RTC_C_IRQHandler (void)

uint32_t status;

STATUS = MAP_RTC_C_getEncableInterruptStatus();
MAP_RTC_C_clearInterruptFlag (status);

IF (STATUS 和 RTC_C_CLOCK_READ_READY_READY_INTERRUPT)

MAP_GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0);
// newTime = MAP_RTC_C_getCalendarTime ();
次级标志= 1;//每秒发生一次,因此使用标志在 while 循环中每秒更新一次 LCD

IF (STATUS & RTC_C_TIME_EVENT_INTERRUPT)

/*每分钟中断一次-在此处设置断点*/
__no_operation();
newTime = MAP_RTC_C_getCalendarTime();

IF (STATUS 和 RTC_C_CLOCK_ALARM_INTERRUPT)

/*在晚上10:04pm 中断*/
__no_operation();

/* Timer A1.0 ISR */
void TA1_0_IRQHandler (void){
HD44780_TIMER_ISR ();
MAP_Timer_A_clearCaptureCompareInterrupt (TIMER_A1_base、//清除中断标志
Timer_A_CAPTURECOMPARE 寄存器_0);

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

    大家好、Mitz、  

    您是否已使 RTC_C 模块正常工作?  

    最好调试 RTC_C 代码并检查 RTC_C 是否能够很好地更新日历寄存器。 如果是、请检查日历数据读数是否正确。  

    谢谢、  

    Lixin  

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

    RTC 寄存器本身正在更新。 但是、我无法使用 newTime 变量从日历中提取数据、而 CurrentTime 只是在初始化期间设置的初始时间、无论何时调用它。

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

    您好!  

    使用以下指令获取 newTime 更新时似乎有问题:newTime = MAP_RTC_C_getCalendarTime();。  

    您是否跟踪 了 MAP_RTC_C_getCalendarTime()并查看发生了什么情况? 为什么日历数据无法读出并发送到 newTime?  

    谢谢、  

    Lixin  

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

    您每秒设置第二个标志(RTCRDYIFG)、但每分钟只获取新时间(RTCTEVIFG)、因此第一分钟的新时间将会错误。

    一个简单的修复方法是在 开始循环之前、先使用 MAP_RTC_C_getCalendarTime 填充 NewTime。

    未经请求:  

    >MAP_Interrupt_enableSlepOnIsrExit();

    我建议您删除此行。 如果它还没有给您带来麻烦、它就会。