查看: 1635|回复: 0
收起左侧

第五章:CH32V103应用教程——IWDG

[复制链接]

  离线 

  • TA的每日心情
    慵懒
    2021-7-23 17:16
  • 签到天数: 17 天

    [LV.4]

    发表于 2021-4-22 22:11:10 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 草帽王子 于 2021-9-10 16:21 编辑

    上一章
    下一章

    本章教程通过给PA0引脚置高电平进行喂狗,并通过串口调试助手打印显示程序运行状态,具体如下:

    当PA0引脚有连接高电平,即有喂狗,串口打印显示:Feed dog success;
    当PA0引脚未连接高电平,即无喂狗,串口打印显示:Feed dog fail,Reset。


    1、IWDG简介及相关函数介绍

    独立看门狗(IWDG)通常用来检测逻辑错误和外部环境干扰引起的软件故障,其时钟源来自于LSI,可独立于主程序之外运行,适用于对精度要求低的场合。独立看门狗可看作为一个12位递减计数器,当计数器的值从某个值递减到0后,系统会产生一个复位信号;若在计数器未递减到0之前刷新计数器的值,则不会产生复位信号,此过程即是喂狗。

    CH32V103独立看门狗的时钟来源 LSI 时钟分频,其功能在停机和待机模式时仍能正常工作。其具有12位自减型计数器,当看门狗计数器自减到 0 时,将产生系统复位,所以超时时间为(重装载值+1)个时钟,最大可达 26.2s,最小可达 100us。关于CH32V103 独立看门狗具有说明,可参考CH32V103应用手册。

    独立看门狗相关函数和定义分布在文件ch32v10x_iwdg.c和ch32v10x_iwdg.h文件中,关于这两文件的函数具体介绍如下:

    1. void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);
    2. void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);
    3. void IWDG_SetReload(uint16_t Reload);
    4. void IWDG_ReloadCounter(void);
    5. void IWDG_Enable(void);
    6. FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);
    复制代码

    1.1、void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess)
    功  能:启用或禁用对IWDG_PSCR和IWDG_RLDR寄存器的写入访问。
    输  入:WDG_WriteAccess:对IWDG_PSCR和IWDG_RLDR寄存器的写入访问的新状态。IWDG_WriteAccess_Enable:启用对IWDG_PSCR和IWDG_RLDR寄存器的写入访问;IWDG_WriteAccess_Disable:禁用对IWDG_PSCR和IWDG_RLDR寄存器的写入访问。

    1.2、void IWDG_SetPrescaler(uint8_t IWDG_Prescaler)
    功  能:设置IWDG预分频器值。
    输  入:IWDG_Prescaler:指定IWDG预分频器值(4、8、16、34、64、128、256)。

    1.3、void IWDG_SetReload(uint16_t Reload)
    功  能:设置IWDG重新加载值。
    输  入:Reload:指定IWDG Reload值。此参数必须是介于0和0x0FFF之间的数字。

    1.4、void IWDG_ReloadCounter(void)
    功  能:使用重新加载寄存器中定义的值重新加载IWDG计数器。
    输  入:无

    1.5、void IWDG_Enable(void)
    功  能:启用IWDG(已禁用对IWDG_PSCR和IWDG_RLDR寄存器的写入访问)
    输  入:无

    1.6、FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG)
    功  能:检查是否设置了指定的IWDG标志。
    输  入:IWDG_FLAG:指定要检查的标志。IWDG_FLAG_PVU:正在进行预分频器值更新。IWDG_FLAG_RVU:正在进行重新加载值更新。

    在进行IWDG相关程序编写时,若需用到上述函数,直接在程序进行调用即可。


    2、硬件设计

    本教程通过PA0引脚接VCC引脚进行喂狗,连接方式如下:
    用杜邦线将PA0引脚与开发板VCC引脚连接喂狗。


    3、软件设计

    独立看门狗喂狗操作步骤如下:
    • 取消寄存器写保护;
    • 设置独立看门狗的预分频系数和重装载值;
    • 重载计数值喂狗;
    • 启动看门狗。

    根据上述步骤,编写相关程序,具体如下:

    iwdg.h文件

    1. #ifndef __IWDG_H
    2. #define __IWDG_H

    3. #include "ch32v10x_conf.h"

    4. #define PA0 GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_0)  //PA0

    5. void GPIOx_Init(void);
    6. u8 GPIOx_Connet(void);
    7. void IWDG_Feed_Init( u16 prer, u16 rlr );

    8. #endif
    复制代码
    iwdg.h文件主要用于保存相关函数的定义声明。

    iwdg.c文件
    1. #include "iwdg.h"

    2. void GPIOx_Init(void)
    3. {
    4.     GPIO_InitTypeDef GPIO_InitStructure;

    5.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE ); //使能GPIOA时钟

    6.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;        //配置GPIO引脚,PA0
    7.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;    //配置GPIO模式为下拉输入
    8.     GPIO_Init( GPIOA, &GPIO_InitStructure);          //GPIO初始化
    9. }

    10. u8 GPIOx_Connet(void)
    11. {
    12.     if(PA0 == 1)        //当PA0引脚连接高电平,返回值为1,否则返回0;
    13.     {
    14.         Delay_Ms(10);
    15.         return 1;
    16.     }
    17.     return 0;
    18. }

    19. void IWDG_Feed_Init( u16 prer, u16 rlr )
    20. {
    21.     IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能取消IWDG_PR和IWDG_RLR寄存器的写保护,
    22.     IWDG_SetPrescaler(prer);                      //设置预分频器值
    23.     IWDG_SetReload(rlr);                          //设置重装载寄存器的值
    24.     IWDG_ReloadCounter();                         //将重装载寄存器的值放入到计数器中
    25.     IWDG_Enable();                                //使能IWDG
    26. }
    复制代码

    iwdg.c文件是独立看门狗的配置程序,其具体配置流程如下:


    1、使能GPIOA时钟;
    1. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE ); //使能GPIOA时钟
    复制代码

    2、初始化对应GPIO口;
    1. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;        //配置GPIO引脚,PA0
    2. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;    //配置GPIO模式为下拉输入
    3. GPIO_Init( GPIOA, &GPIO_InitStructure);          //GPIO初始化
    复制代码

    3、启用对IWDG_PSCR和IWDG_RLDR寄存器的写入访问;
    1. IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能取消IWDG_PR和IWDG_RLR寄存器的写保护,
    复制代码

    4、设置独立看门狗的预分频系数和重装载值;
    1. IWDG_SetPrescaler(prer);                      //设置预分频器值
    2. IWDG_SetReload(rlr);                          //设置重装载寄存器的值
    复制代码

    5、重载计数值喂狗;
    1. IWDG_ReloadCounter();                         //将重装载寄存器的值放入到计数器中
    复制代码

    6、启动看门狗;
    1. IWDG_Enable();                                //使能IWDG
    复制代码

    7、编写判断函数,用于判断是否连接高电平喂狗。
    1. u8 GPIOx_Connet(void)
    2. {
    3.     if(PA0 == 1)        //当PA0引脚连接高电平,返回值为1,否则返回0;
    4.     {
    5.         Delay_Ms(10);
    6.         return 1;
    7.     }
    8.     return 0;
    9. }
    复制代码

    iwdg.c文件主要进行独立看门狗的相关配置。


    main.c文件
    1. int main(void)
    2. {
    3.     USART_Printf_Init(115200);                 //打印串口初始化,波特率为115200
    4.     Delay_Init();                              //延时函数初始化
    5.     GPIOx_Init();                              //相应引脚初始化
    6.     IWDG_Feed_Init( IWDG_Prescaler_32, 4000 ); // 3.2s IWDG reset

    7.     while(1)
    8.     {
    9.         if( GPIOx_Connet() == 1 )              //PA0==1,即PA0连接高电平
    10.         {
    11.            IWDG_ReloadCounter();               //Feed dog
    12.            printf("Feed dog success\r\n");
    13.            Delay_Ms(10);
    14.         }
    15.         else
    16.         {
    17.            printf("Feed dog fail,Reset\r\n");
    18.            Delay_Ms(1000);
    19.         }
    20.     }
    21. }
    复制代码
    main.c文件主要是进行相关函数初始化以及进行喂狗操作。


    4、下载验证

    将编译好的程序下载到开发板并复位,打开串口调试助手,可看到串口调试助手一直在打印输出:Feed dog fail,Reset,如图所示:

    CH32V CH573单片机芯片-第五章:CH32V103应用教程——IWDGrisc-v单片机中文社区(1)

    当用杜邦线将PA0引脚与高电平连接进行喂狗操作,串口打印显示:Feed dog success,具体如图所示:

    CH32V CH573单片机芯片-第五章:CH32V103应用教程——IWDGrisc-v单片机中文社区(2)

    4.IWDG.rar附件下载
    .
    CH32V CH573单片机芯片-第五章:CH32V103应用教程——IWDGrisc-v单片机中文社区(3) 4、IWDG.rar (520.3 KB, 下载次数: 12)
    链接:https://pan.baidu.com/s/1X2xY0JSFFQI9prjHf0UysA
    提取码:w2e6
    复制这段内容后打开百度网盘手机App,操作更方便哦







    上一篇:第四章:CH32V103应用教程——EXTI
    下一篇:第六章:CH32V103应用教程——WWDG
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-4-27 02:52 , Processed in 0.775361 second(s), 48 queries .

    快速回复 返回顶部 返回列表