К1921ВГ015 RTC timer IRQ
Модераторы: ea, dav, bkolbov, Alis, pip, _sva_
-
RabidRabbit
- Сообщения: 136
- Зарегистрирован: 10 июн 2025, 12:11
- Предприятие: HomeWork
Re: К1921ВГ015 RTC timer IRQ
У меня тоже запись в PMURTC->RTC_CFG1 значения с установленным 30-м битом приводит мк в состояние нестояния, из которого его можно извлечь только подачей лог. "1" на вход SERVEN и стирания всей флэш-памяти.
-
RabidRabbit
- Сообщения: 136
- Зарегистрирован: 10 июн 2025, 12:11
- Предприятие: HomeWork
Re: К1921ВГ015 RTC timer IRQ
Причём такой эффект наблюдается, даже если взять свежестёртый с SERVEN камень, подключиться через openocd и сделать так:
PMURTC->RTC_CFG1 - это 0x38011018 согласно РП.
После этого сброс или отключение/включение питания не помогают, нужно опять делать SERVEN="1" и сервисное стирание флэша.
На МК маркировка 2514 (возможно, это дата выпуска).
Кто-нибудь ещё может у себя это проверить?
Код: Выделить всё
(gdb) x/1wx 0x38011018
0x38011018: 0xad0a0117
(gdb) set {int}0x38011018 = 0xed0a0117
После этого сброс или отключение/включение питания не помогают, нужно опять делать SERVEN="1" и сервисное стирание флэша.
На МК маркировка 2514 (возможно, это дата выпуска).
Кто-нибудь ещё может у себя это проверить?
Re: К1921ВГ015 RTC timer IRQ
Спасибо. Написал им в техподдержку.
Re: К1921ВГ015 RTC timer IRQ
Странно. Есть пример rtc_events в примерах. Там тоже есть эта команда и она выполняется многократно и ничего не зависает.
Значит должна быть какая-то комбинация при которой правильно работает установка этого флага. Надо разбираться
Вот здесь main.c
и здесь
Значит должна быть какая-то комбинация при которой правильно работает установка этого флага. Надо разбираться
Вот здесь main.c
void RTC_init()
{
RTC_Event_1S_init(); // Разрешаем односекундное событие
WakeUp_init(); // Разрешаем внешние события WAKEUP0 - WAKEUP2
AntiTamper_init(); // Разрешаем AntiTamper
// enable global IRQ for RTC
PLIC_SetIrqHandler (Plic_Mach_Target, IsrVect_IRQ_PMURTC, RTC_IRQHandler);
PLIC_SetPriority (IsrVect_IRQ_PMURTC, 0x1);
PLIC_IntEnable (Plic_Mach_Target, IsrVect_IRQ_PMURTC);
PMURTC->PMU_IRQEVT = 1;
PMURTC->RTC_CFG1 |= PMURTC_RTC_CFG1_ALARMRST_Msk;
RTC_SetCounter_(timer); //Записать новое значение счетчика
}
и здесь
void RTC_IRQHandler()
{
uint32_t tmp_history;
tmp_history = PMURTC->RTC_HISTORY;
GPIOA->DATAOUTTGL = LED7_MSK;
// Проверяем события AntiTamper
if(tmp_history & RTC_EVENT_ANTITAMPER){
printf("\nAntiTamper ALARM ON: ");
if(tmp_history & PMURTC_RTC_HISTORY_TAMPER0_Msk) { PMURTC->RTC_HISTORY_bit.TAMPER0 = 0; printf("AT_IN0, ");}
if(tmp_history & PMURTC_RTC_HISTORY_TAMPER1_Msk) { PMURTC->RTC_HISTORY_bit.TAMPER1 = 0; printf("AT_IN1, ");}
if(tmp_history & PMURTC_RTC_HISTORY_TAMPER2_Msk) { PMURTC->RTC_HISTORY_bit.TAMPER2 = 0; printf("AT_IN2, ");}
}
// Проверяем события WakeUp
if(tmp_history & RTC_EVENT_WAKEUP){
printf("\nWakeUp ON: ");
if(tmp_history & PMURTC_RTC_HISTORY_WAKE0_Msk) { PMURTC->RTC_HISTORY_bit.WAKE0 = 0; printf("WakeUp0, ");}
if(tmp_history & PMURTC_RTC_HISTORY_WAKE1_Msk) { PMURTC->RTC_HISTORY_bit.WAKE1 = 0; printf("WakeUp1, ");}
if(tmp_history & PMURTC_RTC_HISTORY_WAKE2_Msk) { PMURTC->RTC_HISTORY_bit.WAKE2 = 0; printf("WakeUp2, ");}
}
// Проверяем событие односекундного таймера
if (PMURTC->PMU_WK3STAT_bit.CLK1S){
PMURTC->PMU_WK3STAT_bit.CLK1S = 1; // Сбрасываем событие односекундного таймера
printf("\nEvent 1S\n");
}
PMURTC->RTC_CFG1 |= PMURTC_RTC_CFG1_ALARMRST_Msk;
PMURTC->PMU_IRQEVT = 1;
}
-
RabidRabbit
- Сообщения: 136
- Зарегистрирован: 10 июн 2025, 12:11
- Предприятие: HomeWork
Re: К1921ВГ015 RTC timer IRQ
У Вас именно этот пример собирается и работает?
В любом случае, "штатный" сброс флага не должен окирпичивать камень.
В любом случае, "штатный" сброс флага не должен окирпичивать камень.
Re: К1921ВГ015 RTC timer IRQ
Кажется нашлась причина.
Если этот флаг установить до инициализации RTC то работает стабильно, при сбросе питания не зависает, flash_erase не требуется.
Если этот флаг установить до инициализации RTC то работает стабильно, при сбросе питания не зависает, flash_erase не требуется.
void periph_init()
{
BSP_led_init();
SystemInit();
SystemCoreClockUpdate();
PMURTC->RTC_CFG1 |= PMURTC_RTC_CFG1_REGEN_Msk; // <-- ВОТ ЗДЕСЬ ФЛАГ УСТАНВЛИВАЕТСЯ до RTC_Init(); Если сделать так, то никаких проблем установка этого флага в других местах не дает. Если эту строку здесь закомментировать то возникают вышеописанные проблемы .
BSP_led_init();
retarget_init();
RTC_init();
printf("K1921VG015 SYSCLK = %d MHz\n",(int)(SystemCoreClock / 1E6));
printf(" UID[0] = 0x%X UID[1] = 0x%X UID[2] = 0x%X UID[3] = 0x%X\n",(unsigned int)PMUSYS->UID[0],(unsigned int)PMUSYS->UID[1],(unsigned int)PMUSYS->UID[2],(unsigned int)PMUSYS->UID[3]);
printf(" Start RTC Events Interrupt\n");
}
-
RabidRabbit
- Сообщения: 136
- Зарегистрирован: 10 июн 2025, 12:11
- Предприятие: HomeWork
Re: К1921ВГ015 RTC timer IRQ
Не очень вяжется с viewtopic.php?p=52242#p52242
После сервисной зачистки флэша уж точно никакой инициализации RTC не происходит.
После сервисной зачистки флэша уж точно никакой инициализации RTC не происходит.
Re: К1921ВГ015 RTC timer IRQ
Да. Тут многое что с чем не вяжется. Но установка этого флага работает:
Важно! Это не флаг PMURTC_RTC_CFG1_ALARMRST_Msk , а флаг PMURTC_RTC_CFG1_REGEN_Msk . Я сам немного запутался, но когда
внимательно посмотрел, оказалось это другой флаг. После этого все работает.
Вот ссылки на видео и сам проект.
https://cloud.mail.ru/public/T3mz/kP9VKxgF8
https://cloud.mail.ru/public/Hy5m/3Cs1jQjCh
https://cloud.mail.ru/public/ioGh/P7u7ut7wG
В main.c там краткое описание что и как.
Важно! Это не флаг PMURTC_RTC_CFG1_ALARMRST_Msk , а флаг PMURTC_RTC_CFG1_REGEN_Msk . Я сам немного запутался, но когда
внимательно посмотрел, оказалось это другой флаг. После этого все работает.
Вот ссылки на видео и сам проект.
https://cloud.mail.ru/public/T3mz/kP9VKxgF8
https://cloud.mail.ru/public/Hy5m/3Cs1jQjCh
https://cloud.mail.ru/public/ioGh/P7u7ut7wG
В main.c там краткое описание что и как.
void periph_init()
{
BSP_led_init();
SystemInit();
SystemCoreClockUpdate();
PMURTC->RTC_CFG1 |= PMURTC_RTC_CFG1_REGEN_Msk; // <-- ВОТ ЗДЕСЬ ФЛАГ УСТАНВЛИВАЕТСЯ до RTC_Init(); Если сделать так, то никаких проблем установка этого флага в других местах не дает. Если эту строку здесь закомментировать то возникают вышеописанные проблемы .
BSP_led_init();
retarget_init();
RTC_init();
printf("K1921VG015 SYSCLK = %d MHz\n",(int)(SystemCoreClock / 1E6));
printf(" UID[0] = 0x%X UID[1] = 0x%X UID[2] = 0x%X UID[3] = 0x%X\n",(unsigned int)PMUSYS->UID[0],(unsigned int)PMUSYS->UID[1],(unsigned int)PMUSYS->UID[2],(unsigned int)PMUSYS->UID[3]);
printf(" Start RTC Events Interrupt\n");
}
Re: К1921ВГ015 RTC timer IRQ
Добрый день. А это откуда взято? Похоже на мой случай.RabidRabbit писал(а): ↑25 сен 2025, 10:51 Не это?9. Ошибка формирования односекундного сигнала CLK1S
Описание
При разрешении прерывания по односекундному сигналу CLK1S прерывание PMURTC
возникает непрерывно и его невозможно сбросить.
-
RabidRabbit
- Сообщения: 136
- Зарегистрирован: 10 июн 2025, 12:11
- Предприятие: HomeWork
Re: К1921ВГ015 RTC timer IRQ
Errata на ВГ015.
