From a33e16c68f4bd99fe74e5ae47aa5fdcb762071c2 Mon Sep 17 00:00:00 2001 From: zhyinch <zhyinch@gmail.com> Date: 星期二, 06 四月 2021 12:12:38 +0800 Subject: [PATCH] 增加独立看门狗,修改恢复出厂设置方式 --- 源码/核心板/Src/main.c | 76 ++++++++++++++++++++++++++++++-------- 1 files changed, 60 insertions(+), 16 deletions(-) diff --git "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/main.c" "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/main.c" index 664f759..f1c5bcf 100644 --- "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/main.c" +++ "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/main.c" @@ -12,7 +12,51 @@ #include "ADC.h" //#define DEBUG_MODE +/* + * 设置 IWDG 的超时时间 + * Tout = prv/40 * rlv (s) + * prv可以是[4,8,16,32,64,128,256] + * prv:预分频器值,取值如下: + * @arg IWDG_Prescaler_4: IWDG prescaler set to 4 + * @arg IWDG_Prescaler_8: IWDG prescaler set to 8 + * @arg IWDG_Prescaler_16: IWDG prescaler set to 16 + * @arg IWDG_Prescaler_32: IWDG prescaler set to 32 + * @arg IWDG_Prescaler_64: IWDG prescaler set to 64 + * @arg IWDG_Prescaler_128: IWDG prescaler set to 128 + * @arg IWDG_Prescaler_256: IWDG prescaler set to 256 + * + * 独立看门狗使用LSI作为时钟。 + * LSI 的频率一般在 30~60KHZ 之间,根据温度和工作场合会有一定的漂移,我 + * 们一般取 40KHZ,所以独立看门狗的定时时间并一定非常精确,只适用于对时间精度 + * 要求比较低的场合。 + * + * rlv:重装载寄存器的值,取值范围为:0-0XFFF + * 函数调用举例: + * IWDG_Config(IWDG_Prescaler_64 ,625); // IWDG 1s 超时溢出 + * (64/40)*625 = 1s + */ +void IWDG_Config(uint8_t prv ,uint16_t rlv) +{ + // 使能 预分频寄存器PR和重装载寄存器RLR可写 + IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable ); + + // 设置预分频器值 + IWDG_SetPrescaler( prv ); + + // 设置重装载寄存器值 + IWDG_SetReload( rlv ); + + // 把重装载寄存器的值放到计数器中 + IWDG_ReloadCounter(); + + // 使能 IWDG + IWDG_Enable(); +} +void IWDG_Feed(void) +{ + IWDG_ReloadCounter(); +} void Device_Init(void) { RCC_Configuration(); @@ -27,7 +71,8 @@ Uart1_Init(); Spi_Init(); ADC_Configuration(); - + IWDG_Config(IWDG_Prescaler_128 ,4095); //10s + IWDG_Feed(); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); } u8 anchor_type; @@ -73,7 +118,7 @@ g_com_map[COM_INTERVAL]=100; } - g_com_map[VERSION] = 0x012a; + g_com_map[VERSION] = 0x012b; dist_threshold = (g_com_map[SPEEDFILTER_THRES]*10)/(1000/g_com_map[COM_INTERVAL]); if(dist_threshold<300) {dist_threshold = 300;} @@ -163,15 +208,15 @@ if(flag_newsecond) { uint32_t temp23; - temp23 = dwt_read32bitreg(CHAN_CTRL_ID) ; - if(temp23!=0x4A480022) - { - temp23 = dwt_read32bitreg(CHAN_CTRL_ID) ; - if(temp23!=0x4A480022) - { - NVIC_SystemReset(); - } - } +// temp23 = dwt_read32bitreg(CHAN_CTRL_ID) ; +// if(temp23!=0x4A480022) +// { +// temp23 = dwt_read32bitreg(CHAN_CTRL_ID) ; +// if(temp23!=0x4A480022) +// { +// NVIC_SystemReset(); +// } +// } flag_newsecond=0; tagpos_binary=0; memcpy(ancidlist_send,ancidlist_rec,ancidlist_num*2); @@ -214,11 +259,9 @@ // Delay_ms(100); SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //软复位回到bootloader } - if(g_com_map[CNT_REBOOT]==1) + if(g_com_map[CNT_REBOOT]==1) { - g_com_map[CNT_REBOOT]=0; - g_com_map[MAP_SIGN_INDEX]=0; - save_com_map_to_flash(); + FactorySettings(); delay_ms(100); SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //软复位回到bootloader } @@ -229,12 +272,13 @@ delay_ms(100); SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //软复位回到bootloader } - if(g_com_map[MAP_SIGN_INDEX]!=0x55AA||g_com_map[COM_INTERVAL]==0) + if(g_com_map[MAP_SIGN_INDEX]!=0x55AA||g_com_map[COM_INTERVAL]==0) { SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //软复位回到bootloader } } + int main(void) { -- Gitblit v1.9.3