Ваши RCC_GetFlagStatus()
проверки в цепочке if
- else if
обнаружили только первый флаг в упорядоченном списке, но эти флаги не являются взаимоисключающими, вы должны проверить все флаги сброса.
if( RCC_GetFlagStatus(RCC_FLAG_SFTRST) )
{
//GPIO_WriteBit(PIN_52.port, PIN_52.pin, Bit_RESET);
}
if( RCC_GetFlagStatus(RCC_FLAG_PORRST) )
{
//GPIO_WriteBit(PIN_52.port, PIN_52.pin, Bit_RESET);
}
// etc...
Поскольку у вас есть отладчик ST-Link, возможно, у вас есть отладчик на уровне исходного кода? В этом случае вместо того, чтобы пытаться отладить это на одном выводе светодиода, используйте отладчик исходного уровня и поместите точку останова в каждое тело проверки флага состояния. Или проще, но читать весь регистр в одном месте:
uint32_t rcc_status = RCC->CSR ;
RCC->CSR |= RCC_CSR_RMVF ;
while(1) ; // breakpoint here
Затем проверьте значение rcc_status в отладчике.
Если кажется вероятным, что это сброс IWDG, то он либо был включен программно при запуске, либо загрузчиком, либо включен в байтах опций . Вы можете проверить это, прочитав FLASH_OBR
(адрес 0x4002201 C)? Его значение по умолчанию - 0x03FF FFF C - если в вашем случае это какое-то другое значение, то байты опций (которые являются специальной областью памяти fla sh по адресу 0x1FFFF800 - 0x1FFFF80F) были изменены. . В частности, если FLASH_OBR
бит 2 (маска 0x04) равен нулю, то IWDG будет работать после сброса, не будучи специально установленным программным обеспечением. Байты опций описаны не в общем руководстве пользователя STM32F102 UM0008 , а в руководстве по программированию fla sh PM0075 .
Простой тест для демонстрации этого это сброс сторожевого таймера просто для поддержания сторожевого таймера в занятом-l oop:
while(1)
{
IWDG_ReloadCounter() ;
}
Вы также можете установить / сбросить байты опций с помощью ST-Link Utility .
IWDG работает либо от генератора R C 40 кГц (номинальный, но широкий диапазон), либо от внешнего генератора / кристалла на выводах OSC_32KHz. Обычно это 32768 Гц для точного RT C. В любом случае предварительный делитель по умолчанию - / 4, а перезагрузка по умолчанию - 0x0FFF (4096). Таким образом, для частоты 32768 Гц значения IWDG по умолчанию вызовут тайм-аут ровно 500 мс (4096 / (32768/4)), что вы и наблюдали. Осциллятор R C может работать в диапазоне от 30 кГц до 60 кГц, что дает диапазон IWDG по умолчанию от 273 мс до 546 мс.