2024-12-15 17:22:09 +08:00
/*
* @ Author : stark1898y 1658608470 @ qq . com
* @ Date : 2024 - 12 - 15 16 : 13 : 41
* @ LastEditors : stark1898y 1658608470 @ qq . com
2025-05-16 11:39:29 +08:00
* @ LastEditTime : 2025 - 05 - 16 10 : 55 : 30
2025-02-22 18:05:33 +08:00
* @ FilePath : \ BLE_TYQ_CH584M \ BSP \ src \ bsp_iwdg . c
2024-12-15 17:22:09 +08:00
* @ Description :
*
* Copyright ( c ) 2024 by yzy , All Rights Reserved .
*/
2024-12-14 13:31:23 +08:00
# include "bsp_iwdg.h"
# include "bsp_uart.h"
# include "log.h"
2024-12-15 14:30:06 +08:00
// https://www.cnblogs.com/debugdabiaoge/p/17580033.html
// https://www.cnblogs.com/risc5-ble/p/17853714.html
2024-12-14 13:31:23 +08:00
# undef LOG_ENABLE
# define LOG_ENABLE 1
# undef LOG_TAG
# define LOG_TAG "idwg"
2025-04-13 23:18:47 +08:00
uint8_t IWDGTaskId ;
uint16_t IWDG_ProcessEvent ( uint8_t task_id , uint16_t events )
{
if ( events & IWIG_FEED_EVENT )
{
FEED_IWDG ( ) ;
2025-05-15 18:39:49 +08:00
logDebug ( " IWDG feed " ) ;
2025-05-16 11:39:29 +08:00
tmos_start_task ( task_id , IWIG_FEED_EVENT , MS1_TO_SYSTEM_TIME ( IWDG_FEED_MS ) ) ;
2025-04-13 23:18:47 +08:00
return ( events ^ IWIG_FEED_EVENT ) ;
}
return 0 ;
}
2024-12-14 13:31:23 +08:00
// 32k rc
// div 0:4 | 1:8 | 2:16 | 3:32 |
2024-12-15 14:30:06 +08:00
// 4:64 | 5:128 | 6:256 | 7:512(32K分频512, 时钟62.5Hz) |
2024-12-14 13:31:23 +08:00
// reload max 4095
2024-12-15 14:30:06 +08:00
// 独立看门狗( IWDG) 由专用的内部低速时钟( LSI) 驱动, 能够在低功耗模式下正常工作。
2025-04-13 23:18:47 +08:00
// 根据寄存器描述, IWDG最大时间可以是(0xFFF/(32K/512))=65.52s
2024-12-15 14:30:06 +08:00
void IWDG_Init ( uint16_t ms )
2024-12-14 13:31:23 +08:00
{
2024-12-15 14:30:06 +08:00
uint16_t div = 512 ;
2025-05-16 11:39:29 +08:00
// float tick_ms = 1000 / (32000 / 512);
uint8_t tick_ms = 16 ;
2024-12-15 14:30:06 +08:00
uint16_t reload = ( ms / tick_ms ) + 1 ;
// 解除IWDG保护
2024-12-14 13:31:23 +08:00
R32_IWDG_KR = 0x5555 ;
2024-12-15 14:30:06 +08:00
2025-05-16 11:39:29 +08:00
R32_IWDG_CFG = ( RB_PR & ( div < < 12 ) ) | ( RB_STOP_EN ) | ( reload & RB_RLR ) ;
// R32_IWDG_CFG |= (7 << 12); // 32K分频512, 时钟62.5Hz
// R32_IWDG_CFG &= 0xFFFFF000;
// // R32_IWDG_CFG |= 0x7D * 3; // 看门狗时间约6 s( 0x10/(32K/512))
// R32_IWDG_CFG |= reload;
2025-04-13 23:18:47 +08:00
2024-12-15 14:30:06 +08:00
// 开启IWDG保护
R32_IWDG_KR = 0xCCCC ;
2025-05-16 11:39:29 +08:00
logDebug ( " IWDG = %d, %.1f ms " , reload , ( reload * 1000 ) / 62.5 ) ;
2025-04-13 23:18:47 +08:00
IWDGTaskId = TMOS_ProcessEventRegister ( IWDG_ProcessEvent ) ;
2025-05-16 11:39:29 +08:00
// tmos_set_event(IWDGTaskId, IWIG_FEED_EVENT);
tmos_start_task ( IWDGTaskId , IWIG_FEED_EVENT , MS1_TO_SYSTEM_TIME ( IWDG_FEED_MS ) ) ;
2024-12-15 14:30:06 +08:00
}
// #define RB_RESET_FLAG 0x07 // RO: recent reset flag
// #define RST_FLAG_SW 0x00
// #define RST_FLAG_RPOR 0x01
// #define RST_FLAG_WTR 0x02
// #define RST_FLAG_MR 0x03
// //#define RST_FLAG_GPWSM 0x04 // RO, power on reset flag during sleep/shutdown: 0=no power on reset during sleep/shutdown, 1=power on reset occurred during sleep/shutdown
// #define RST_FLAG_GPWSM 0x05
// // RB_RESET_FLAG: recent reset flag
// // 000 - SR, software reset, by RB_SOFTWARE_RESET=1 @RB_WDOG_RST_EN=0
// // 001 - RPOR, real power on reset
// // 010 - WTR, watch-dog timer-out reset
// // 011 - MR, external manual reset by RST pin input low
// // 101 - GRWSM, global reset by waking under shutdown mode
// 1?? - LRW, power on reset occurred during sleep
// 打印复位状态寄存器,显示复位原因
// 最近一次复位状态:
// 000: 软件复位 SR( RB_WDOG_RST_EN=0时软件复位可产生此状态, 否则可复位但不产生此状态) ;
// 001: 上电复位 RPOR;
// 010: 看门狗超时复位 WTR;
// 011: 外部手动复位 MR;
// 101: 从下电模式唤醒时的复位 GRWSM;
// 100/110/111: 唤醒复位 LRW, 且此前的上一次复位分别是 SR/WTR/MR。
void ShowRestartReason ( void )
{
uint8_t reason = R8_RESET_STATUS & 0x07 ;
logDebug ( " R8_RESET_STATUS = %02x " , reason ) ;
switch ( reason )
{
case RST_FLAG_SW :
logDebug ( " RST_FLAG_SW " ) ;
break ;
case RST_FLAG_RPOR :
logDebug ( " RST_FLAG_RPOR " ) ;
break ;
case RST_FLAG_WTR :
logDebug ( " RST_FLAG_WTR " ) ;
break ;
case RST_FLAG_MR :
logDebug ( " RST_FLAG_MR " ) ;
break ;
case RST_FLAG_GPWSM :
logDebug ( " RST_FLAG_GPWSM " ) ;
break ;
case 0x04 :
logDebug ( " LRW, last SR " ) ;
break ;
case 0x06 :
logDebug ( " LRW, last WTR " ) ;
break ;
case 0x07 :
logDebug ( " LRW, last MR " ) ;
default :
break ;
}
2024-12-14 13:31:23 +08:00
}
2024-12-15 14:30:06 +08:00
2025-04-13 23:18:47 +08:00