【MM32F103开发套件试用体验】6 IWDG独立看门狗

  • 主程序
  • 安全性
  • 寄存器
  • 应用程序
  • 计数器
  • gjianw217
  • LV4工程师
  • |      2016-10-06 01:14:10
  • 浏览量 1112
  • 回复:2
本实验,如果看门狗没有复位,开发板的DS0将常亮,如果WK_UP按键按下,就喂狗,只要WK_UP不停的按,看门狗就一直不会产生复位,保持DS0的常亮,一旦超过看门狗定溢出时间(Tout=1s)还没按,那么将会导致程序重启,这将导致DS0熄灭一次。 1 MM32F103独立看门狗 MM32F103内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。 独立看门狗(IWDG)由专门的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗口看门狗由从APB1 时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。IWDG 最适合应用于那些需要看门狗作为一个正在主程序外,能够完全独立工作,并且对时间精度要求低的场合。WWDG 最适合那些要求看门狗在精确计时窗口起作用的应用程序。 2 MM32F103主要寄存器 1) 键寄存器(IWDG_KR), 在键寄存器(IWDG_KR)中写入0xCCCC。开始启动独立看门狗;此时计数器开始从其复位值0xFFF递减计数。当计数器计数到末尾0x000 时,会产生一个复位信号(IWGD_RESET)。无论何时,只要在键寄存器IWDG_KR中写入0xAAAA,IWDG_RLR 中的值就会被重新加载到计数器,从而避免产生看门狗复位。 IWDG_PR和IWDG_RLR寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR寄存器中写入0x5555。将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入0xAAAA)也会启动写保护功能。 2) 预分频寄存器( IWDG_PR ),该寄存器用来设置看门狗时钟的分频系数,最低为 4,最高位 256 该寄存器是一个 ,该寄存器是一个 32 位的寄存器,但是只用了最低3位,其他都是保留位。预分频寄存器各定义如图所示 : 3)重装载寄存器(IWDG_RLR),该寄存器也是一个 32 位寄存器,低 12 位是有效的,该寄存器各描述如图所示 : 4)状态寄存器 3 操作IWDG步骤 1) 向IWDG_KR写入0x5555,以取消对IWDG_PR和IWDG_RLR的写保护,以方便配置这两个寄存器的值 2 )向IWDG_KR写入0xAAAA,重新加载IWDG_RLR的值到看门狗计数器里,即实现看门狗的喂狗操作 3 )向IWDG_KR写入0xCCCC,来启动MM32的看门狗 4 实现代码 1)IWDG初始化
void IWDG_Init(u8 prer,u16 rlr) 

{

        RCC->CSR|=RCC_CSR_LSION;//打开内部低速时钟

        IWDG->KR=0X5555;        //使能对IWDG_PR和IWDG_RLR的写´                                                                                                   

          IWDG->PR=prer;          //设置分频系数

          IWDG->RLR=rlr;          //从加载寄存器IWDG_RLR

          IWDG_Feed();          //喟狗                                                                                   

          IWDG->KR=0XCCCC;        //使能看门狗        

}
2)喂狗
void IWDG_Feed(void)

{

        IWDG->KR=0XAAAA;//reload                                                                                           

}
3) 主函数
int main(void)

{                        

        delay_init(72);              

        uart_init(72,9600);   

        LED_Init();                            

        KEY_Init();           

        delay_ms(300);             

        IWDG_Init(4,625);       

        LED0=0;                                 

        while(1)

        {

                if(KEY_Scan(0)==WKUP_PRES)IWDG_Feed; //如果WK_UP按下,则喟狗

                delay_ms(10);

        }

}
5 实现结果
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:2
MindMotion 2016-10-08
:handshake
0   回复
举报
发布
amrogue 2016-10-06
学习了,真是好文章!
0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子