• nRF52832看门狗WDT使用(SDK17.1.0)


    陈拓 2022/10/29-2022/10/31

    1. 开发环境

    • 操作系统: Window10、WSL
    • 编译环境: ARM GCC
    • IDE: VSCode
    • SDK版本: SDK_17.1.0
    • 硬件开发板: 定制
    • 开发环境构建

    WSL构建nRF5 SDK + ARM GCC开发环境》

    https://blog.csdn.net/chentuo2000/article/details/125933307?spm=1001.2014.3001.5502

    《WSL构建nRF5 SDK + ARM GCC开发环境 – RTT打印调试日志》

    https://blog.csdn.net/chentuo2000/article/details/126104346?spm=1001.2014.3001.5502

    2. 看门狗WDT概述

    • 硬件的看门狗,防止应用程序锁定。
    • 使用32.768kHz低频时钟源(LFCLK)

    看门狗启动后,若芯片外部没有焊接32.768kHz的晶体,芯片会自动启动内部RC振荡器。

    • CRV寄存器指定计数值
    • 看门狗启动后加载 CRV 寄存器中的值
    • 倒计时,向下计数器到0后,会溢出产生 TIMEOUT 事件。看门狗 TIMEOUT 事件会导致系统复位 或者 TIMEOUT 中断。
    • 在程序正常运行时,应该在向下计数器数还未到0时重置计数器(喂狗)
    • 当CPU在低功耗模式处于睡眠状态时,或调试过程中暂停CPU运行时,看门狗可以暂停
    • 看门狗的超时时间由以下公式给出

    timeout [s] = ( CRV + 1 ) / 32768

    3. 看门狗WDT使用

    3.1 sdk_config.h设置

    ~/nrf/nRF5_SDK_17.1.0_ddde560/examples/peripheral/wdt/pca10040/blank/config/sdk_config.h

    1. // NRFX_WDT_ENABLED - nrfx_wdt - WDT 外设驱动
    2. //==========================================================
    3. #ifndef NRFX_WDT_ENABLED
    4. #define NRFX_WDT_ENABLED 1
    5. #endif
    6. // NRFX_WDT_CONFIG_BEHAVIOUR - CPU SLEEP或HALT模式下的WDT行为
    7. // <1=> 在睡眠状态下运行,在挂起状态下暂停
    8. // <8=> 在睡眠状态下暂停,在挂起状态下运行
    9. // <9=> 在睡眠和挂起状态下运行
    10. // <0=> 在睡眠和挂起状态下暂停
    11. #ifndef NRFX_WDT_CONFIG_BEHAVIOUR
    12. #define NRFX_WDT_CONFIG_BEHAVIOUR 0
    13. #endif
    14. // NRFX_WDT_CONFIG_RELOAD_VALUE - 重新加载值(毫秒) ms <1-131072000>
    15. #ifndef NRFX_WDT_CONFIG_RELOAD_VALUE
    16. #define NRFX_WDT_CONFIG_RELOAD_VALUE 2000
    17. #endif
    18. // NRFX_WDT_CONFIG_NO_IRQ - 从WDT驱动中删除WDT IRQ处理
    19. // <0=> 包括WDT IRQ中断处理
    20. // <1=> 删除WDT IRQ中断处理
    21. #ifndef NRFX_WDT_CONFIG_NO_IRQ
    22. #define NRFX_WDT_CONFIG_NO_IRQ 0
    23. #endif
    24. // NRFX_WDT_CONFIG_IRQ_PRIORITY - 中断优先级
    25. // <0=> 0 (highest)
    26. // <1=> 1
    27. // <2=> 2
    28. // <3=> 3
    29. // <4=> 4
    30. // <5=> 5
    31. // <6=> 6
    32. // <7=> 7
    33. #ifndef NRFX_WDT_CONFIG_IRQ_PRIORITY
    34. #define NRFX_WDT_CONFIG_IRQ_PRIORITY 6
    35. #endif
    36. // NRFX_WDT_CONFIG_LOG_ENABLED - 启用模块中的日志记录。
    37. //==========================================================
    38. #ifndef NRFX_WDT_CONFIG_LOG_ENABLED
    39. #define NRFX_WDT_CONFIG_LOG_ENABLED 0
    40. #endif
    41. // NRFX_WDT_CONFIG_LOG_LEVEL - 默认日志级别
    42. // <0=> Off
    43. // <1=> Error
    44. // <2=> Warning
    45. // <3=> Info
    46. // <4=> Debug
    47. #ifndef NRFX_WDT_CONFIG_LOG_LEVEL
    48. #define NRFX_WDT_CONFIG_LOG_LEVEL 3
    49. #endif
    50. // NRFX_WDT_CONFIG_INFO_COLOR - ANSI转义代码前缀。
    51. // <0=> Default
    52. // <1=> Black
    53. // <2=> Red
    54. // <3=> Green
    55. // <4=> Yellow
    56. // <5=> Blue
    57. // <6=> Magenta
    58. // <7=> Cyan
    59. // <8=> White
    60. #ifndef NRFX_WDT_CONFIG_INFO_COLOR
    61. #define NRFX_WDT_CONFIG_INFO_COLOR 0
    62. #endif
    63. // NRFX_WDT_CONFIG_DEBUG_COLOR - ANSI escape code prefix.
    64. // <0=> Default
    65. // <1=> Black
    66. // <2=> Red
    67. // <3=> Green
    68. // <4=> Yellow
    69. // <5=> Blue
    70. // <6=> Magenta
    71. // <7=> Cyan
    72. // <8=> White
    73. #ifndef NRFX_WDT_CONFIG_DEBUG_COLOR
    74. #define NRFX_WDT_CONFIG_DEBUG_COLOR 0
    75. #endif

    3.2 头文件

    1. #include "nrf_drv_wdt.h"
    2. #include "nrf_drv_clock.h"

    在nrfx_wdt.h中有头文件nrf_wdt.h的引用:

    #include 
    • Makefile文件添加
      $(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_wdt.c \

    3.3 官方例程

    • 使用sdk_config.h设置的默认值初始化
    1. //Configure WDT.
    2. nrf_drv_wdt_config_t config = NRF_DRV_WDT_DEAFULT_CONFIG;
    3. err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
    4. APP_ERROR_CHECK(err_code);
    5. err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
    6. APP_ERROR_CHECK(err_code);
    7. nrf_drv_wdt_enable();
    • wdt_event_handler是事件触发回调处理函数

    看门狗计数器溢出时触发。

    1. /**
    2. * @brief WDT events handler.
    3. */
    4. void wdt_event_handler(void)
    5. {
    6. bsp_board_leds_off();
    7. //NOTE: The max amount of time we can spend in WDT interrupt is two cycles of 32768[Hz] clock - after that, reset occurs
    8. }
    • 喂狗nrf_drv_wdt_channel_feed(m_channel_id);

    在BSP事件触发回调处理函数中:

    1. nrf_drv_wdt_channel_id m_channel_id;
    2. /**
    3. * @brief BSP events callback.
    4. */
    5. void bsp_event_callback(bsp_event_t event)
    6. {
    7. switch (event)
    8. {
    9. case BSP_EVENT_KEY_0:
    10. nrf_drv_wdt_channel_feed(m_channel_id);
    11. break;
    12. default :
    13. //Do nothing.
    14. break;
    15. }
    16. }
    • BSP事件触发回调处理函数注册
    1. err_code = bsp_init(BSP_INIT_BUTTONS, bsp_event_callback);
    2. APP_ERROR_CHECK(err_code);

    3.4 非官方例程

    可以在初始化时修改某些sdk_config.h的设置。

    1. //Configure WDT.
    2. NRF_LOG_DEBUG("main Configure WDT.");
    3. nrf_drv_wdt_config_t config = {
    4. .behaviour = NRF_WDT_BEHAVIOUR_PAUSE_SLEEP_HALT,
    5. .reload_value = 60000,
    6. .interrupt_priority = 7,
    7. };
    8. nrf_drv_wdt_config_t wdt_config = config;
    9. err_code = nrf_drv_wdt_init(&wdt_config, NULL);
    10. APP_ERROR_CHECK(err_code);
    11. err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
    12. APP_ERROR_CHECK(err_code);
    13. nrf_drv_wdt_enable();

    其中:

    • 函数f_drv_wdt_init(&wdt_config, NULL);

    NULL表示不使用事件触发回调处理函数。

    • 宏RF_WDT_BEHAVIOUR_RUN_SLEEP_HALT

    在nrf_wdt.h中定义:

    1. /** @brief WDT behavior in the SLEEP or HALT CPU modes. */
    2. typedef enum
    3. {
    4. NRF_WDT_BEHAVIOUR_RUN_SLEEP = WDT_CONFIG_SLEEP_Msk, /**< WDT will run when CPU is in SLEEP mode. */
    5. NRF_WDT_BEHAVIOUR_RUN_HALT = WDT_CONFIG_HALT_Msk, /**< WDT will run when CPU is in HALT mode. */
    6. NRF_WDT_BEHAVIOUR_RUN_SLEEP_HALT = WDT_CONFIG_SLEEP_Msk | WDT_CONFIG_HALT_Msk, /**< WDT will run when CPU is in SLEEP or HALT mode. */
    7. NRF_WDT_BEHAVIOUR_PAUSE_SLEEP_HALT = 0, /**< WDT will be paused when CPU is in SLEEP or HALT mode. */
    8. } nrf_wdt_behaviour_t;
    • 喂狗

    在主循环中喂狗

    1. NRF_LOG_INFO("main loop..........");
    2. for (;;) {
    3. nrf_drv_wdt_channel_feed(m_channel_id);

    参考文档

    nRF52832 Product Specification v1.3

  • 相关阅读:
    全职独立开发经验分享
    LLM模型-讯飞星火与百度文心api调用
    开源语言大模型演进史:向LLaMA 2看齐
    Linux C/C++ 学习笔记(七):DNS协议与请求
    【笔记】电商订单数据分析实战
    Halcon 2D-Transformation 相关算子(一)
    css中新型的边框设置属性border-inline
    网络赚钱项目 - 虚拟项目如何选择产品
    C语言每日一题(34)链表的回文结构
    redis-哨兵模式&集群(无中心化)
  • 原文地址:https://blog.csdn.net/chentuo2000/article/details/127613011