STM8 вложенная ошибка прерывания, не описанная в текущем листке ошибок ES019

Если основной процесс выполняет WFI с битом AL, установленным в CFG_GCR, изменение битов приоритета I1/I0 в ISR приводит к тому, что CPU застопорился при возникновении вложенного IRQ.

Предпосылки: все регистры ITC_SPR1 имеют значение по умолчанию 0xFF.

Включить TIM4 с генерированием прерываний при переполнении. ISR для TIM4 содержит только код для чистого бита TIM_SR1_UIF в регистре TIM4_SR1. Разблокируйте EEPROM для записи, инициируйте процедуру записи байта и включите IRQ для записи записи EEPROM. В ISR для EEPROM повышайте уровень IRQ с помощью команды RIM или напрямую укажите I1/I0 битов PUSH # 8, POP CC (например). Основной программный набор AL бит в регистр GCR и выполнение команды WFI.

Если на уровне IRQ ISEP IRP, поднятом инструкциями RIM или PUSH/POP CC, а затем произошел IRQ из TIM4, после того, как IRET из ядра TIM4 ISR заглох и ISR EEPROM не будет продолжен.

Обходной путь 1. Очистите бит AL в GCR перед выполнением команды WFI в основном цикле.

Обходной путь 2. Очистить бит AL в GCR в EEPROM ISR перед выполнением инструкций RIM или PUSH/POP CC

Workaround 3. Set IRQ level for EEPROM other than I1=1, I0=1 (for example ITC->ISPR1 = 0b11110111; before initiate EEPROM write operation).

Я не нашел эту ошибку в текущем листке ошибок ES019.

Я вижу эту ошибку на плате STM8L-Discovery с чипом stm8l152c6t6. Может ли кто-нибудь воспроизвести эту ошибку на одинаковых или разных фишках? Пожалуйста, подтвердите или отклоните его.

Пример:

tim4ISR() {
    /* clear UIF */
    TIM4->SR1 &= (uint8_t)(~TIM_SR1_UIF);
}

eepromISR() {
    (void)FLASH->IAPSR; /* or other manner read IAPSR */

    /* Set some pin to indicate in-ISR state */

    __ASM("rim"); /* or __ASM("push #8\npop cc\n"); */

    /* delay into ISR */
    for(int i = 0;i < delayN;i++) ;

    /* clear AL for leave WFI after IRET and initiate next byte write */
    CFG->GCR &= ~CFG_GCR_AL;

    /* Clear some pin to indicate leave ISR */
}

main() {
    /* Set TIM4 for generate periodic IRQ */

    /* Unlock MASS */

    while(1) {
        /* Initiate EEPROM byte or word write operation */

        /* IRET stay on wait mode */
        CFG->GCR |= CFG_GCR_AL; 

       __ASM("wfi");
    }
}
3
de
Покажите фрагмент кода, который демонстрирует эту ошибку, чтобы другие могли помочь вам помочь себе.
добавлено автор dannyf, источник