HC32F460独立看门狗的使用

使用背景

为了防止程序跑飞,MCU特意引入了看门狗,看门狗分为窗口看门狗和独立看门狗,窗口看门狗采用中断实现,其时间更加的精确,独立看门狗大约会在附近1S左右没有喂狗就产生看门狗复位。

具体代码实现

#include "bsp_wdt.h"
#include "hc32_ddl.h"

//复位类型
#define RST_POWER_ON    1
#define RST_EXTERNAL    2
#define RST_BROWN_OUT   4
#define RST_WATCHDOG    8
#define RST_JTAG       16
#define RST_SOFTWARE   32
#define RST_BACKUP     64

typedef enum {
    RST_CAU_POWER_ON    = 0x01,
    RST_CAU_EXTERNAL    = 0x02,
    RST_CAU_BROWN_OUT   = 0x04,
    RST_CAU_WATCHDOG    = 0x08,
    RST_CAU_JTAG        = 0x10,
    RST_CAU_SOFTWARE    = 0x20,
    RST_CAU_BACKUP      = 0x40,
} rst_cause_t;


// pclk = system_clock/div4 = 50M
// max cycle = 65536
// max feed interval = 65536 / (50000000/8192) = 10.7s
void bsp_wdt_init(void)
{
    stc_wdt_init_t stcWdtInit;

    /* configure structure initialization */
    MEM_ZERO_STRUCT(stcWdtInit);

    stcWdtInit.enClkDiv = WdtPclk3Div8192;
    stcWdtInit.enCountCycle = WdtCountCycle65536;
    stcWdtInit.enRefreshRange = WdtRefresh100Pct;
    stcWdtInit.enSleepModeCountEn = Disable;
    stcWdtInit.enRequestType = WdtTriggerResetRequest;
    WDT_Init(&stcWdtInit);
}

void bsp_wdt_refresh(void)
{
    en_result_t enRet = Error;
    enRet = WDT_RefreshCounter();

    if(enRet != Ok) {
        printf("Failed at function: %s, line: %d\n", __FUNCTION__, __LINE__);
    }
}

//获取复位类型
uint8_t rmu_get_reset_flag(void)
{
    uint8_t res;

    stc_rmu_rstcause_t stcRmuRstCause;

    MEM_ZERO_STRUCT(stcRmuRstCause);

    RMU_GetResetCause(&stcRmuRstCause);

    if(Set == stcRmuRstCause.enSoftware) {
        res = RST_CAU_SOFTWARE;
    } else if(Set == stcRmuRstCause.enWdt) {
        res = RST_CAU_WATCHDOG;
    } else if(Set == stcRmuRstCause.enRstPin) {
        res = RST_CAU_EXTERNAL;
    }

    return res;
}

//清除复位标志
void rmu_clear_reset_flag(void)
{
    RMU_ClrResetFlag();
}

int main()
{

while(1)
{
  const byte mcuFlag = rmu_get_reset_flag();
  if (mcuFlag & RST_POWER_ON) 
  	printf("RST_POWER_ON");
  if (mcuFlag & RST_EXTERNAL) 
  	printf("RST_POWER_ON");
  if (mcuFlag & RST_BROWN_OUT)
   	printf("RST_POWER_ON");
  if (mcuFlag & RST_WATCHDOG) 
  	printf("RST_POWER_ON");
  if (mcuFlag & RST_SOFTWARE)
   	printf("RST_POWER_ON");
  rmu_clear_reset_flag();
  }
}

<think>我们参考用户提供的引用内容,特别是引用[1]中关于HC32F460芯片在J-Flash中的设备配置信息,以及引用[3]中关于SWD烧录时可能遇到的速率问题。用户需求:使用JFlash工具烧写HC32F460芯片。步骤:1.准备工作:确保硬件连接正确(SWD接口),安装J-Flash软件,并配置设备文件(添加HC32F460芯片定义)。2.根据引用[1],我们需要在JLinkDevices.xml文件中添加HC32F460的配置。3.根据引用[3],注意烧录速率不宜过高,否则可能出现连接问题。具体操作:一、硬件连接:-使用J-Link调试器的SWD接口连接目标板(HC32F460芯片):J-LinkSWDIO->目标板SWDIOJ-LinkSWCLK->目标板SWCLKJ-LinkGND->目标板GND-给目标板供电(注意电压匹配)二、软件配置(关键步骤):1.安装J-Flash软件(建议最新版)。2.修改JLinkDevices.xml文件(位于J-Flash安装目录下),添加HC32F460芯片定义(根据引用[1]提供的信息):```xml<!--在文件末尾的某个位置(例如在最后一个Device标签之后)添加以下内容--><!--HDSC--><Device><ChipInfoVendor="HDSC"Name="HC32F46x"Core="JLINK_CORE_CORTEX_M4"WorkRAMAddr="0x1FFF8000"WorkRAMSize="0x30000"/><FlashBankInfoName="FLASH"BaseAddr="0x00000000"MaxSize="0x40000"Loader="Devices\HDSC\HC32F46x.FLM"LoaderType="FLASH_ALGO_TYPE_CMSIS"/></Device>```注意:需要确保Flash算法文件(HC32F46x.FLM)存在于J-Flash安装目录下的`Devices\HDSC\`文件夹中。如果没有,需要从华大半导体官网或者KeilMDK安装目录中获取(一般在Keil安装目录下的ARM\Flash目录下可以找到,复制到上述路径)。3.如果找不到.FLM文件,可能需要从华大半导体官网下载HC32F460的SDK,里面可能包含Flash编程算法文件。三、烧写步骤:1.打开J-Flash软件,选择`Createanewproject`(创建新工程)->`StartJ-Flash`。2.在弹出的`CreateNewProject`窗口中:-选择`TargetDevice`:输入`HC32F46x`(或者在下拉列表中找到刚刚添加的芯片)-接口选择`SWD`,速度先选择较低的值(如200kHz,根据引用[3]的提示,避免速率过高导致连接失败)3.点击`OK`,然后连接目标板:点击`Target`->`Connect`。-如果连接失败,尝试降低SWD速率(在`Options`->`Projectsettings`->`TargetInterface`中调整)。4.加载要烧写的文件(HEX或BIN文件):-如果是BIN文件,需要指定烧写地址(根据芯片手册,通常应用程序烧写到0x00000000地址,但注意引用[2]中提到扇区0用于BootLoader,所以如果用户程序包含BootLoader则烧写到0x00000000,否则可能是其他地址,请根据实际情况填写)。-注意:引用[2]中提到,如果应用程序开启了看门狗并且使用硬件启动方式,可能会擦除扇区0(BootLoader区域),导致无法启动。因此,在烧写应用程序时,要确保不会破坏BootLoader区域(如果存在BootLoader)。如果没有BootLoader,则整个Flash(从0x00000000开始)都可以用于应用程序。5.烧写操作:-擦除:`Target`->`EraseChip`(或者可以选择擦除部分扇区)-编程:`Target`->`Program&Verify`(编程并校验)-复位:`Target`->`Reset`四、常见问题:1.连接失败:检查接线,降低SWD速率(如200kHz),检查目标板供电。2.Flash编程失败:检查.FLM文件是否正确,芯片是否写保护(需要解除保护,具体方法参考芯片手册)。3.烧写后无法运行:注意应用程序是否覆盖了BootLoader区域(参考引用[2]),或者应用程序的入口地址是否正确。五、注意事项:-烧写前确保备份重要数据(尤其是BootLoader区域)。-如果使用硬件看门狗,注意其配置可能存储在Flash的特定扇区(如扇区0),避免误擦除。六、进阶操作(可选):-使用J-Flash的脚本功能进行批量烧录。根据以上内容,我们整理出烧写步骤。注意:由于引用[2]中提到看门狗配置会写入扇区0,如果用户程序开启了硬件看门狗并且需要保留BootLoader,则必须避免将看门狗的配置信息写入扇区0(即BootLoader所在扇区)。可以考虑修改程序,将看门狗的配置信息写入其他非BootLoader扇区,或者调整BootLoader和应用程序的存储区域划分。相关问题:1.如何获取HC32F460的Flash算法文件(.FLM)?2.烧写HC32F460时如何避免擦除BootLoader?3.J-Flash连接HC32F460时出现“invalidromtable”错误怎么办?</think>### J-Flash烧写HC32F460芯片操作指南 #### **一、关键配置步骤** 1. **添加芯片支持** 在J-Flash安装目录下的 `JLinkDevices.xml` 文件中添加以下配置(根据引用[1]): ```xml <!-- HDSC --> <Device> <ChipInfo Vendor="HDSC" Name="HC32F46x" Core="JLINK_CORE_CORTEX_M4" WorkRAMAddr="0x1FFF8000" WorkRAMSize="0x30000" /> <FlashBankInfo Name="HC32F46x" BaseAddr="0x00000000" MaxSize="0x40000" Loader="Devices/HDSC/HC32F46x.FLM" LoaderType="FLASH_ALGO_TYPE_CMSIS" /> </Device> ``` - **注意**:确保`.FLM`文件路径正确(从Keil安装目录或华大SDK获取) - 路径示例:`C:\Keil_v5\ARM\Flash\HDSC\HC32F46x.FLM` 2. **硬件连接** - SWD接口接线: | J-Link引脚 | 目标板引脚 | |------------|------------| | SWDIO | SWDIO | | SWCLK | SWCLK | | GND | GND | - 目标板供电电压:3.3V(±5%) #### **二、烧写流程** 1. **创建工程** - 打开J-Flash → `Create new project` → `Start J-Flash` - 设备选择:`HDSC HC32F46x` - 接口设置: - Type: **SWD** - Speed: **200 kHz**(根据引用[3],高速可能导致连接失败) 2. **连接目标芯片** ```mermaid graph TD A[点击 Target > Connect] --> B{连接状态} B -->|成功| C[显示 Connected to target] B -->|失败| D[检查接线/降速/供电] ``` 3. **烧写固件** - 加载文件:`File > Open data file` → 选择HEX/BIN文件 - **关键地址设置**: - 应用程序地址:`0x00000000` - 避开扇区0(`0x00000400-0x0000041F`)防止擦除Bootloader(引用[2]) - 操作顺序: 1. `Target > Erase Chip`(全片擦除) 2. `Target > Program & Verify`(烧写+校验) 3. `Target > Reset`(复位芯片) #### **三、特殊注意事项** 1. **看门狗问题处理**(引用[2]) - 若启用硬件看门狗(SWDT),会向扇区0写入配置数据 - **解决方案**: - 方案1:修改程序,将看门狗配置写入非Bootloader扇区 - 方案2:物理隔离Bootloader区(扇区0不用于应用程序) 2. **速率优化**(引用[3]) - 初始连接使用200kHz低速 - 连接成功后可逐步提高至1MHz(通过`Options > Project Settings > Target Interface`) 3. **Flash保护机制** - 若出现写保护错误: - 检查芯片选项字节(Option Bytes) - 使用华大官方工具解除保护 - 连接时按住复位键再释放 #### **四、常见问题解决** | 问题现象 | 解决方案 | |---------------------------|-----------------------------------| | **"invalid rom table"** | 降速至200kHz + 检查SWD线长<10cm | | **编程失败** | 检查.FLM文件路径 + 重装J-Link驱动 | | **校验错误** | 供电不足时禁用板载外设 | | **无法复位** | 检查nRST引脚连接 + 电源稳定性 | > **安全提示**:烧写前务必备份原始固件!避免看门狗配置覆盖Bootloader导致系统瘫痪[^2]。 #### **五、自动化脚本示例** ```batch :: 批量烧录脚本 JFlash.exe -openprj"HC32F46x.jflash" -open"firmware.hex" -auto -exit ``` 参数说明: - `-openprj`:加载预配置工程 - `-auto`:自动执行连接/擦除/烧写/校验 - `-exit`:完成后退出 --- ### 相关问题 1. 如何获取HC32F460的Flash算法文件(.FLM)? 2. 烧写时如何避免覆盖HC32F460的Bootloader区域? 3. J-Flash连接HC32F460时出现"invalid rom table"错误该如何解决? 4. 如何配置HC32F460看门狗才能不破坏扇区0的Bootloader? [^1]: 需在JLinkDevices.xml中添加华大芯片定义 [^2]: 看门狗配置可能破坏扇区0的Bootloader [^3]: SWD速率过高会导致连接失败
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路过的大熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值