RTC闹钟中断while循环

问题描述 投票:0回答:1

我的问题是,当 rtc 闹钟被激活时,它每 10 秒打印一次中断中的消息,但它停止打印主 while 循环中的消息。

我正在使用platformio和vs code对stm32f103rct6微控制器进行编程。

main.c

int main(void)
{
HAL_Init();
SystemClock_Config();
HardwareInit();
while (1)
{
HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
myprintf("Date: %02d-%02d-%02d\\n", sDate.Date, sDate.Month, 2000 + sDate.Year);

        HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
        myprintf("Time: %02d:%02d:%02d\n", sTime.Hours, sTime.Minutes, sTime.Seconds);
    
        HAL_RTC_GetAlarm(&hrtc, &sAlarm, RTC_ALARM_A, FORMAT_BIN);
        myprintf("Alarm: %02d:%02d:%02d\n", sAlarm.AlarmTime.Hours, sAlarm.AlarmTime.Minutes, sAlarm.AlarmTime.Seconds);
    
    }

}

stm32f1xx_it.c

void RTC_Alarm_IRQHandler(void)
{
    if (__HAL_RTC_ALARM_GET_FLAG(&hrtc, RTC_IT_ALRA) != RESET)
    {
        myprintf("Alarm match\\n");
        HAL_RTC_GetAlarm(&hrtc, &sAlarm, RTC_ALARM_A, FORMAT_BIN);
        sAlarm.AlarmTime.Seconds = sAlarm.AlarmTime.Seconds + 10;
        HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, FORMAT_BIN);
        __HAL_RTC_ALARM_CLEAR_FLAG(&hrtc, RTC_IT_ALRA);
    }
}

RTC_初始化

void RTC_Init(void)
{
    __HAL_RCC_RTC_ENABLE();

    hrtc.Instance = RTC;
    hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
    hrtc.Init.OutPut = RTC_OUTPUTSOURCE_ALARM;
    if (HAL_RTC_Init(&hrtc) != HAL_OK)
    {
        Error_Handler();
    }

    sTime.Hours = 0x13;
    sTime.Minutes = 0x30;
    sTime.Seconds = 0x0;
    if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
    {
        Error_Handler();
    }

    sDate.WeekDay = RTC_WEEKDAY_WEDNESDAY;
    sDate.Month = RTC_MONTH_NOVEMBER;
    sDate.Date = 0x29;
    sDate.Year = 0x23;
    if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
    {
        Error_Handler();
    }

    sAlarm.Alarm = RTC_ALARM_A;
    sAlarm.AlarmTime.Hours = sTime.Hours;
    sAlarm.AlarmTime.Minutes = sTime.Minutes;
    sAlarm.AlarmTime.Seconds = sTime.Seconds + 0x10;
    if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BCD) != HAL_OK)
    {
        Error_Handler();
    }

    HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);

    __HAL_RTC_ALARM_ENABLE_IT(&hrtc, RTC_IT_ALRA);
    __HAL_RTC_ALARM_CLEAR_FLAG(&hrtc, RTC_IT_ALRA);
}

我得到的答案:

.
.
.
Date: 29-11-2023
Time: 13:30:09
Alarm: 13:30:10

Date: 29-11-2023
Time: 13:30:10
Alarm: 13:30:10

Alarm match
Alarm match
Alarm match
Alarm match
.
.
.

我等待的答案:

.
.
.
Date: 29-11-2023
Time: 13:30:09
Alarm: 13:30:10

Date: 29-11-2023
Time: 13:30:10
Alarm: 13:30:10

Alarm match

Date: 29-11-2023
Time: 13:30:11
Alarm: 13:30:20

Date: 29-11-2023
Time: 13:30:12
Alarm: 13:30:20
.
.
.

我尝试清除该标志,我期望它会向我显示 RTC 闹钟中断的消息,但然后按照正常流程进行,直到出现新闹钟。

stm32 interrupt alarm rational-team-concert
1个回答
0
投票

我发现了问题,通过使用宏

__HAL_RTC_ALARM_GET_FLAG
而不是使用常用的函数
HAL_RTC_AlarmIRQHandler(&hrtc)
来执行回调函数,我错过了上一个函数
__HAL_RTC_ALARM_EXTI_CLEAR_FLAG()
中的以下代码行。

© www.soinside.com 2019 - 2024. All rights reserved.