OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3054|回复: 4

关于STM32 战舰版 实验7 窗口看门狗实验的几个问题,麻烦大佬们解答

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-9-21
在线时间
6 小时
发表于 2020-10-8 16:37:50 | 显示全部楼层 |阅读模式
int main(void)
{               
        delay_init();                     //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        uart_init(115200);         //串口初始化为115200
        LED_Init();
        KEY_Init();          //按键初始化         
        LED0=0;
        delay_ms(300);          
        WWDG_Init(0X7F,0X5F,WWDG_Prescaler_8);//计数器值为7f,窗口寄存器为5f,分频数为8                
        while(1)
        {
                LED0=1;                                    
        }   
}


void WWDG_IRQHandler(void)
        {

        WWDG_SetCounter(WWDG_CNT);          //当禁掉此句后,窗口看门狗将产生复位

        WWDG_ClearFlag();          //清除提前唤醒中断标志位

        LED1=!LED1;                 //LED状态翻转
        }

问题1:主程序执行到WWDG_Init()会调用其中的WWDG_IRQHandler这个中断服务函数,中断服务函数执行完毕后(即LED1状态翻转)程序应该执行while(1)死循环(LED0灭掉),但是实验现象中为什么LED1还会继续反复翻转呢?

问题2:按照视频里注释掉蓝色代码(不喂狗),实验现象里确实红灯(LED0)闪烁,同时绿灯(LED1)也微弱闪烁-----------【此处有两点疑问:1、视频里说LED1(绿灯)不会亮,但实际情况是绿灯微亮且闪烁,为什么?;2、依然注释掉喂狗代码,在主函数while循环中LED0(紫色加粗代码)的前后行先后依次加入delay_ms(300),红灯闪烁情况不同,在前面加入delay红灯会常亮,后面加入时会闪烁,这里不能理解的是注释掉喂狗后当计数器小于0x3f应该复位,按道理不应该执行while循环才对(debug看了一下确实也没有执行while语句),既然没有执行while为什么加入delay函数位置不同会导致现象不同】


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4477
金钱
4477
注册时间
2013-4-22
在线时间
336 小时
发表于 2020-10-10 14:38:39 | 显示全部楼层
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2020-9-3
在线时间
5 小时
发表于 2020-12-23 23:51:55 | 显示全部楼层
绿灯微亮是因为LED_Init()后LED1为0 所以亮(此时刚刚执行完 GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化  尚未执行GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置高,灯灭)可以打个断点到这里看 闪烁是复位了
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2020-9-3
在线时间
5 小时
发表于 2020-12-23 23:56:20 | 显示全部楼层
绿灯是因为在执行LED_Init()时 执行 GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化   
两个IO口为低  两个灯都亮了  这时尚未执行  GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置高,灯灭
执行后两个灯就灭了  
又没有喂狗  所以就绿灯微亮且闪烁
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2020-9-3
在线时间
5 小时
发表于 2020-12-24 00:11:51 | 显示全部楼层
在前面加入delay: LED0=0;  设置窗口看门狗后 此时LED0=0;  复位的时间小于300ms 所以就不会进 LED0=1; 会复位  复位后执行到 LED_Init()中时 实际上执行到
GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置高,灯灭
这里两个灯应该都是灭的    LED_Init()出来后  执行LED0=0;  中间时间太短了 肉眼看不出来所以才觉得是常亮
在后面加入delay: LED0=0;  设置窗口看门狗后 此时LED0=0;    进入while后LED0=1;   灯灭直到复位(看到闪烁的原因)      复位后执行到 LED_Init()中时 实际上执行到
GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置高,灯灭
这里两个灯应该都是灭的 LED_Init()出来后  执行LED0=0;  中间时间太短了 肉眼看不出来

你可以在我说的地方 打断点就可以看得出来了

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-14 22:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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