本实验,如果看门狗没有复位,开发板的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 实现结果
本实验,如果看门狗没有复位,开发板的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 实现结果