• 实践6 WDG


    目录

    一、实验目的

    二、实验原理

    三、实验仪器

    四、实验内容

    五.实验结果及改进

    六.实验结论


    一、实验目的

    1.配置独立看门狗(IWDG),通过按键进行喂狗并使用LED进行观察现象;

    2.配置窗口看门狗(WWDG),并且编写看门狗检测清除程序,使用一个LED灯进行结果显示。


    二、实验原理



    1.(1) IWDG有独立的时钟,不需要使用库函数开启;

      (2)向IWDG-KR写入0x5555,之后才能设置分频系数;

      (3)向IWDG-KR写入0XAAAA喂狗;

      (4) IWDG定时器溢出会导致系统复位。

    2. (1)WWDG时钟在APBI总线需要单独开启;

        (2)WWDG需要设置窗口值和重载值;

        (3)过早或过晚地喂狗,都会产生一个中断或复位;

        (4)可以在WWDG中断服务函数中喂狗。

    三、实验仪器

    电脑、开发板、UV5软件、共享文件Tempalte。

    四、实验内容

    1.用UV5软件打开共享文件Template。

    2 (1)IWDG

    添加librares \src文件夹下的stm32f10x_ rcc、stm32f10x_ iwdg.c、stm32f10x_gpio.c到工程

    librares文件夹下,并在stm32f10x_conf.h中去掉相应的注释。

    (2)WWDG

    添加librares \src文件夹下的stm32f10x_ rcc、stm32f10x_gpio.c、stm32f10x_wwdg.c、misc.c到工

    程中的libraries文件夹中,并在stm32f10x_conf.h中去掉相应的注释。

    3.编写程序

    (1)IWDG主程序(main.c)如下:

    1. #include "stm32f10x.h"
    2. void GPIO_Config(void);
    3. void delay(void);
    4. void IWDG_Config(void);
    5. int main(void)
    6. {
    7. GPIO_Config();
    8. GPIO_SetBits(GPIOC,GPIO_Pin_9);
    9. delay();
    10. GPIO_ResetBits(GPIOC,GPIO_Pin_9);
    11. IWDG_Config();
    12. while(1)
    13. {
    14. if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_3)==0)
    15. IWDG_ReloadCounter();
    16. }
    17. }
    18. void GPIO_Config(void)
    19. {
    20. GPIO_InitTypeDef GPIO_InitStructure;
    21. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC,ENABLE);
    22. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
    23. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    24. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    25. GPIO_Init(GPIOC,&GPIO_InitStructure);
    26. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
    27. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    28. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    29. GPIO_Init(GPIOD,&GPIO_InitStructure);
    30. }
    31. void IWDG_Config(void)
    32. {
    33. IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
    34. IWDG_SetPrescaler(IWDG_Prescaler_32);
    35. IWDG_SetReload(625);
    36. IWDG_Enable();
    37. }
    38. void delay(void)
    39. {
    40. uint32_t i;
    41. for(i=0;i<6000000;i++)
    42. {}
    43. }

    (2)WWDG

      主程序(main.c)如下:

    1. #include "stm32f10x.h"
    2. void GPIO_Config(void);
    3. void delay(void);
    4. int main(void)
    5. {
    6. NVIC_InitTypeDef NVIC_InitStructure;
    7. GPIO_Config();
    8. GPIO_ResetBits(GPIOC,GPIO_Pin_8);
    9. delay();
    10. GPIO_SetBits(GPIOC,GPIO_Pin_8);
    11. delay();
    12. RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
    13. WWDG_SetPrescaler(WWDG_Prescaler_8);
    14. WWDG_EnableIT();
    15. WWDG_SetWindowValue(0X50);
    16. WWDG_Enable(0X70);
    17. NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;
    18. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0X70;
    19. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0X70;
    20. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    21. NVIC_Init(&NVIC_InitStructure);
    22. while(1)
    23. {}
    24. }
    25. void GPIO_Config(void)
    26. {
    27. GPIO_InitTypeDef GPIO_InitStructure;
    28. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
    29. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
    30. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    31. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    32. GPIO_Init(GPIOC,&GPIO_InitStructure);
    33. }
    34. void delay(void)
    35. {
    36. uint32_t i;
    37. for(i=0;i<6000000;i++)
    38. {}
    39. }

    中断程序(stm32f10x_it.c)如下:

    1. void WWDG_IRQHandler(void)
    2. {
    3. uint8_t cr;
    4. cr=WWDG->CR;
    5. cr&=0x7f;
    6. if(cr<0x50)
    7. {
    8. WWDG_SetCounter(0x70);
    9. WWDG_ClearFlag();
    10. led=~led;
    11. if(led==0)
    12. GPIO_ResetBits(GPIOC,GPIO_Pin_8);
    13. else
    14. GPIO_SetBits(GPIOC,GPIO_Pin_8);
    15. }
    16. }

    4.编译——>配置ST-Link——>下载——>复位——>观察。



    五.实验结果及改进

    1.IWDG

    按下复位键后,若不按按键,则不会启动喂狗的代码,PC8不停闪烁,说明系统一直在复位;如果

    按下按键,则会喂一次狗,暂停复位一次;如果按键按下不松开,则PC8常亮,说明系统在按下按

    键期间没有复位。

    (2)WWDG

    按下复位键后,观察到PC8管脚置0再置1后,开始快速反转,说明在不断喂狗,系统一直在运

    行。

    窗口判断

    程序和WWDG主程序相同,中断程序(将中断函数中的窗口判断语句注释掉)如下:

    1. void WWDG_IRQHandler(void)
    2. {
    3. uint8_t cr;
    4. cr=WWDG->CR;
    5. cr&=0x7f;
    6. //if(cr<0x50)
    7. //{
    8. WWDG_SetCounter(0x70);
    9. WWDG_ClearFlag();
    10. led=~led;
    11. if(led==0)
    12. GPIO_ResetBits(GPIOC,GPIO_Pin_8);
    13. else
    14. GPIO_SetBits(GPIOC,GPIO_Pin_8);
    15. //}
    16. }

    按下复位键后,可观察到PC8管脚的状态慢速地不停翻转,说明喂狗指令过早或过晚,导致系统不

    断复位。

    六.实验结论

    在进行WWDG窗口看门狗时,编译链接后编译器显示0Enos(S).0 Warning但按下复位键后,开发

    板上的现象是PC8每间隔1S闪烁一次,与该有的实验现象不符,这可是一个难题,因为不是语法

    上的错误,所以不好找。在经过多次的与老师的程序比对后,发现是在中断程序中出了问题,将

    extern uint32_t  led 写成了 uint8_t  led。改过了,再次编译、链接、下载、复位后,现象与预期现

    象相符。











     
       



     

  • 相关阅读:
    Mybatis拦截器
    十天学前端之JS篇(四)
    mac使用vpn时重启 导致百度和app store打不开
    算法训练|交易逆序对的总数、验证二叉搜索树的后序遍历
    PgSQL-添加列、字段的注释
    systemverilog学习--- coverage(覆盖率)
    SQLSERVER基础--存储过程
    国产API管理神器Eolink也太强了吧
    jdk17新特性
    Cesium加载ArcGIS Server4490且orgin -400 400的切片服务
  • 原文地址:https://blog.csdn.net/m0_55048235/article/details/127473339