初级会员

- 积分
- 142
- 金钱
- 142
- 注册时间
- 2016-8-12
- 在线时间
- 50 小时
|
首先申明,本人水平菜鸟级别,在你们看来肯定很low,但是毕竟是自己独立完成的第一个程序,所以还是想分享一下。今天下午学习到了独立看门狗,我之前只是把程序下进去之后看了一下现象,觉得程序很短,觉得没什么,但是自己写了以后才发现问题没有那么简单。 刚开始我按照教程把初始化函数写好后,接着写feeddog函数,这一切都没什么问题,也很快完成,接着开始写主函数,我刚开始发现无从下手,除了几个初始化函数以后就什么都不知道,想到以前看到的现象,灯会一直闪,于是就有了设置灯的高低电平互相交换的想法, 要使高低电平交替,则要在程序复位的时候以及喂狗后没有复位的时候各设置一个电平,暂且设复位以后灯为灭,即高电平,喂狗的时候则低电平,即灯的状态是亮的,用wakeup键喂狗,那么现象应该为如果没有按按键,则灯会亮灭交替,如果按键了,即喂狗了,灯则会一直亮着。
于是我就首先在ledinit函数里面把led1=1和led2=1添加进去,编译发现报错了,当我把#include "stm32f10x.h"换成#include "sys.h"就完美解决了(我也不知道为什么,好像和我头文件里面led1=PBout(5)以及led2=PEout(5)有关,不知道有没有大佬知道),然后要想看得到现象,肯定要加延时,让灯多灭一会儿,由于我们的目的是不停喂狗,防止程序复位,所以死循环里面加入feeddog函数,用按键控制,控制灯亮的程序放在喂狗程序前面,延时函数后面,如果放在按键处理函数里和喂狗函数在一起就没有意义了,
当我把所有函数写好以后,程序并没有按照想象中运行,灯几乎一直灭,按键也没有用,完全不受控制,可是反复检查好几遍感觉没有任何问题,后来我跟着例程一句句检查过去,发现在iwdg初始化函数中,我少加了一句 IWDG_ReloadCounter(),为什么这句话会这么重要?直接导致了程序崩溃,刚开始我怎么也想不通,后来经过分析,发现我其实是把这个程序的核心漏掉了 我们都知道,之所以喂狗能防止程序复位,是因为每次喂狗的时候,都会给计数器装入初值,这样看门狗每次都可以从预装载初值开始计数,如果初始化函数中没有这句话,那么程序第一次正常运行之后,寄存器的值就变成了0,虽然有按键喂狗的函数,可是我们知道函数是if(keyup==1) { feeddog(); }这样的,程序运行那么快,要想喂狗成功,可见是何等的困难,所以就出现了灯一直暗的情况,也就是程序几乎不是复位了,就是在复位的路上,即喂狗失败!
所幸最后还是检查出来了,虽然一个小程序,心里还是很高兴,希望大家在以后的编程过程中也万加小心!
|
|