Проверил код на другой плате, где нормальная разводка земли
полигоном и шумов питания должно быть меньше, нашел обещанный
гистерезис в положенных зонах.
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
Inputs_Init();
PVD_Init(PWR_PVDLevel_MODE7); //Instead supervisor
if(PWR_GetFlagStatus(PWR_FLAG_PVDO) == SET) software_reset(); // If low power supply
.......
}
Ранее определил функции:
volatile uint8_t Voltage_ThresFlag=0;
// Function to perform a software reset for RISC-V CH32
void software_reset(void) {
// Clear all reset status flags (RMVF = 1) - optional but good practice
// This register might vary by model, check the datasheet/reference manual
RCC->RSTSCKR |= (1 << 24);
// Perform software reset by writing specific keys to PFIC->CFGR
// KEYCODE = 0xBEEF, RESETSYS = 1 (bit 7)
PFIC->CFGR = 0xBEEF0080;
}
void PVD_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void PVD_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line16) != RESET) //Откуда пришло прерывание
{
Voltage_ThresFlag = !PWR_GetFlagStatus(PWR_FLAG_PVDO);
if (Voltage_ThresFlag == RESET) software_reset();
//printf("Run at EXTI\r\n");
EXTI_ClearITPendingBit(EXTI_Line16);
}
}
/*********************************************************************/
void PVD_Init(uint32_t Level_Mode)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
EXTI_InitTypeDef EXIT_InitStructure = {0};
NVIC_InitTypeDef NVIC_InitStructure = {0};
EXIT_InitStructure.EXTI_Line = EXTI_Line16;
EXIT_InitStructure.EXTI_LineCmd = ENABLE;
EXIT_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXIT_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_Init(&EXIT_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
PWR_PVDLevelConfig(Level_Mode);
PWR_PVDCmd(ENABLE);
}