work.c

Начнем с инициализации порта к которому подключены светодиоды:

    /* enable led port */
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
    /* set led pins to output state */
    LED_PORT->MODER |=
        GPIO_MODER_MODER12_0 | GPIO_MODER_MODER13_0 |
        GPIO_MODER_MODER14_0 | GPIO_MODER_MODER15_0;

После поместим в переменную значение регистра контроля и статуса RCC_CSR:

    /* get reset flags */
    unsigned int flags = RCC->CSR;

После очистим его от значений тех флагов которые нам не нужны:

    /* clear nothing bits */
    flags &= ~(1 << 24 | 1 << 1 | 1 << 0);

В зависимости от активных флагов мы будем зажигать соответствующие светодиоды:

    /* enable led for needed flags */
    switch (flags) {

Для аппаратного сброса:

        /* hardware reset */
        case RCC_CSR_PADRSTF:
            LED_PORT->ODR |= RED_LED;
            break;

Для других случаев:

        /* another reset */
        default:
            LED_PORT->ODR |= ALL_LEDS;
            break;
    }

После проверки очистим флаги сброса:

    /* clear reset flags */
    RCC->CSR |= RCC_CSR_RMVF;