• PY32F003F18之独立看门狗


    1、PY32F003F18有一个独立看门狗定时器(IWDT),框图如下:

    2、测试程序如下:

    1. #include "IWDG.h"
    2. /*
    3. 独立看门狗定时器一旦运行,则IWDG不能被停止
    4. */
    5. //函数功能:设置看门狗复位周期为1
    6. IWDG_HandleTypeDef IwdgHandle;
    7. void IWDG_Config(void);
    8. void IWDG_Counter_Reload(void);
    9. void SysRstSrcRecord(void);
    10. //函数功能:设置看门狗复位周期为3.2
    11. void IWDG_Config(void)
    12. {
    13. __HAL_RCC_LSI_ENABLE();//使能LSI时钟,启动"内部RC 32KHz振荡器"
    14. while (READ_BIT(RCC->CSR, RCC_CSR_LSIRDY) == 0U);//等待直到LSI READY置位
    15. IwdgHandle.Instance = IWDG; //选择IWDG
    16. IwdgHandle.Init.Prescaler = IWDG_PRESCALER_32; //配置32分频
    17. IwdgHandle.Init.Reload = (3200); //IWDG计数器重装载值为32003.2
    18. HAL_IWDG_Init(&IwdgHandle);//初始化IWDG
    19. }
    20. //函数功能:喂狗
    21. void IWDG_Counter_Reload(void)
    22. {
    23. _HAL_IWDG_RELOAD_COUNTER(IWDG);
    24. }
    25. //(__FLAG__)=RCC_FLAG_HSIRDY,若返回1,表示HSI振荡器已经准备好
    26. //(__FLAG__)=RCC_FLAG_HSERDY,若返回1,表示HSE振荡器已经准备好
    27. //(__FLAG__)=RCC_FLAG_PLLRDY,若返回1,表示Main PLL时钟已经准备好
    28. //(__FLAG__)=RCC_FLAG_LSERDY,若返回1,表示LSE振荡器已经准备好
    29. //(__FLAG__)=RCC_FLAG_LSIRDY,若返回1,表示LSI振荡器已经准备好
    30. //(__FLAG__)=RCC_FLAG_PWRRST,若返回1,表示是由BOR or POR/PDR产生复位
    31. //(__FLAG__)=RCC_FLAG_OBLRST,若返回1,表示是由Option byte loader产生复位
    32. //(__FLAG__)=RCC_FLAG_PINRST,若返回1,表示是由复位引脚产生复位
    33. //(__FLAG__)=RCC_FLAG_SFTRST,若返回1,表示是由软件产生复位
    34. //(__FLAG__)=RCC_FLAG_IWDGRST,若返回1,表示是由独立看门狗产生复位
    35. //(__FLAG__)=RCC_FLAG_WWDGRST,若返回1,表示是由窗口看门狗产生复位
    36. //函数功能:打印CPU复位原因
    37. void SysRstSrcRecord(void)
    38. {
    39. uint8_t i;
    40. uint8_t Reset_Buffer[11];
    41. for(i=0;i<11;i++) Reset_Buffer[i]=0;//清除
    42. Reset_Buffer[0] = __HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY);//读取"内部部24MHz时钟源稳定标志"
    43. Reset_Buffer[1] = __HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY);//读取"外部4~32MHz时钟源稳定标志"
    44. // Reset_Buffer[2] = __HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY); //读取"PLL时钟稳定标志"
    45. // Reset_Buffer[3] = __HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY);//读取"外部32.768KHz的时钟源稳定标志"
    46. Reset_Buffer[4] = __HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY);//读取"内部RC的32KHz时钟源稳定标志"
    47. Reset_Buffer[5] = __HAL_RCC_GET_FLAG(RCC_FLAG_PINRST); //读取"外部引脚复位标志"
    48. Reset_Buffer[6] = __HAL_RCC_GET_FLAG(RCC_FLAG_PWRRST); //读取"BOR/POR/PDR复位标志"
    49. Reset_Buffer[7] = __HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST); //读取"软件复位标志"
    50. Reset_Buffer[8] = __HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST); //读取"独立看门狗定时器复位标志"
    51. Reset_Buffer[9] = __HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST); //读取"窗口看门狗定时器复位标志"
    52. Reset_Buffer[10] = __HAL_RCC_GET_FLAG(RCC_FLAG_OBLRST); //读取"Option byte loader复位标志"
    53. if( Reset_Buffer[0] ) printf("\r\nHSI OK!");
    54. if( Reset_Buffer[1] ) printf("\r\nHSE OK!");
    55. // if( Reset_Buffer[2] ) printf("\r\nPLL OK!");
    56. // if( Reset_Buffer[3] ) printf("\r\nLXTAL OK!");
    57. if( Reset_Buffer[4] ) printf("\r\nLSI OK!");
    58. if( Reset_Buffer[5] ) printf("\r\nPIN reset!");
    59. if( Reset_Buffer[6] ) printf("\r\nPOR reset!");
    60. if( Reset_Buffer[7] ) printf("\r\nSWR reset!");
    61. if( Reset_Buffer[8] ) printf("\r\nIWDG reset!");
    62. if( Reset_Buffer[9] ) printf("\r\nWWDG reset!");
    63. if( Reset_Buffer[10] ) printf("\r\nOption byte loader reset!");
    64. CLEAR_ALL_RESET_FLAG();//清除所有复位标志位
    65. }
    1. #ifndef __IWDG_H
    2. #define __IWDG_H
    3. #include "py32f0xx_hal.h"
    4. #define _HAL_IWDG_RELOAD_COUNTER(__INSTANCE__) WRITE_REG((__INSTANCE__)->KR, IWDG_KEY_RELOAD)
    5. //0x0000AAAA写入"密钥寄存器IWDG_KR",表示喂狗,防止看门狗计数器计数到0
    6. #define CLEAR_ALL_RESET_FLAG() SET_BIT(RCC->CSR, RCC_CSR_RMVF)
    7. //通过将"控制/状态寄存器RCC_CSR"中的RMVF=1,令WWDGRSTF=0,IWDGRSTF=0,SFTRSTF=0,PWRRSTF=0,PINRSTF=0,OBLRSTF=0
    8. extern void IWDG_Config(void);
    9. extern void IWDG_Counter_Reload(void);
    10. extern void SysRstSrcRecord(void);
    11. #endif /* __IWDG_H */
    1. #include "py32f0xx_hal.h"
    2. #include "SystemClock.h"
    3. #include "delay.h"
    4. #include "LED.h"
    5. #include "SystemClock.h"
    6. #include "USART2.h"
    7. #include "stdio.h" //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
    8. #include "string.h" //使能strcpy(),strlen(),memset()
    9. #include "IWDG.h"
    10. const char CPU_Reset_REG[]="\r\nCPU reset!\r\n";
    11. int main(void)
    12. {
    13. HSE_Config();
    14. // HAL_Init();//systick初始化
    15. delay_init();
    16. HAL_Delay(1000);
    17. USART2_Init(115200);
    18. //PA0是为USART2_TX,PA1是USART2_RX
    19. //中断优先级为0x01
    20. //波特率为115200,数字为8位,停止位为1位,无奇偶校验,允许发送和接收数据,只允许接收中断,并使能串口
    21. printf("%s",CPU_Reset_REG);
    22. SysRstSrcRecord();//系统复位记录
    23. MCU_LED_Init();
    24. TIM1_LED_Init();
    25. IWDG_Config();//设置看门狗复位周期为3.2
    26. while (1)
    27. {
    28. delay_ms(1000);
    29. MCU_LED_Toggle();
    30. IWDG_Counter_Reload();//喂狗
    31. }
    32. }

    3、 测试结果:

    //函数功能:使用软件复位CPU
    void SoftReset(void)
    {
        NVIC_SystemReset();//令CPU复位
    }

    比“官方测试代码”好多了。 

  • 相关阅读:
    1757. 可回收且低脂的产品
    Android 使用 MediaPlayer 播放声音
    /LatestBuild: Operation not permitted
    【社会网络分析第5期】gephi使用指南
    如何从 Pod 内访问 Kubernetes 集群的 API
    QT学习笔记(四)——在QLabel显示的影像上画图形,并和影像同步放大缩小
    使用DeepSpeed/P-Tuning v2对ChatGLM-6B进行微调
    不用加减乘除做加法
    Web前端系列技术之Web APIs基础(从基础开始)②
    (四)DDD之“架构”——没有规矩,不成方圆
  • 原文地址:https://blog.csdn.net/weixin_42550185/article/details/133158233