OpenEdv-开源电子网

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

窗口看门狗,

[复制链接]

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2015-10-20
在线时间
18 小时
发表于 2016-9-29 17:58:10 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 手机早晚报 于 2016-9-30 22:54 编辑

[mw_shl_code=c,true]#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "adc.h"
#include "wwdg.h"



int main(void)
{
         u16 adcx;
        float temp;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        delay_init(168);
        uart_init(115200);
        LED_Init();
         LCD_Init();
        Adc_Init();
        KEY_Init();
        WWDG_Init(0x7f,0x50,WWDG_Prescaler_8);

        POINT_COLOR=RED;
        LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");        
        LCD_ShowString(30,70,200,16,16,"ADC TEST");        
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2014/5/6");         
        POINT_COLOR=BLUE;
        LCD_ShowString(30,130,200,16,16,"ADC1_CH5_VAL:");              
        LCD_ShowString(30,150,200,16,16,"ADC1_CH5_VOL:0.000V");
        SWITCH=1;
        while(1)
        {
                adcx=Get_Adc_Average(ADC_Channel_5,20);
                LCD_ShowxNum(134,130,adcx,4,16,0);
                temp=(float)adcx*(3.08/4096);
                adcx=temp;
                LCD_ShowxNum(134,150,adcx,1,16,0);
                temp-=adcx;
                temp*=1000;
                LCD_ShowxNum(150,150,temp,3,16,0X80);
                delay_ms(250);
        }
}


[/mw_shl_code][mw_shl_code=c,true]#include "wwdg.h"





u8 WWDG_CNT=0X7F;



void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{

        NVIC_InitTypeDef NVIC_InitStructure;

        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
        WWDG_CNT=tr&WWDG_CNT;
        WWDG_SetPrescaler(fprer);
        WWDG_SetWindowValue(wr);
        WWDG_SetCounter(WWDG_CNT);
        WWDG_Enable(WWDG_CNT);
        
        NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        
        WWDG_ClearFlag();
  WWDG_EnableIT();
}




void WWDG_IRQHandler(void)
{
        WWDG_SetCounter(WWDG_CNT);
        WWDG_ClearFlag();
}
[/mw_shl_code]

这个窗口看门狗, 在主函数中的wwdg初始化WWDG_Init(0x7f,0x50,WWDG_Prescaler_8);,,现在这个程序只有窗口值与T[6:0]>=计数器值时,才正常;只要窗口值比计数器值小,程序就不断复位, ,问题就在于wwdg初始化时:只要tr>wr,就不断重启;令tr<=wr,就不会重启


但是按照手册,0x40<tr<0x7f,0x40<wr<0x7f,两个并无大小的比较
这个工程是在原子的adc实验库函数工程里直接添加wwdg的文件


实验18 ADC实验.rar

3.98 MB, 下载次数: 67

工程文件

最佳答案

查看完整内容[请看2#楼]

我今晚以解决,在wwdg的中断服务函数中,在喂狗的语句前,加了一句判断if((WWDG->CR&0x7F)==0x40) 解决了wwdg在初始化时,中断标志位被置1,而进中断喂狗(此时计数值就在窗口之上,喂狗必定导致复位) 加了这句语句后,wwdg初始化函数中“WWDG_EnableIT();”与“WWDG_Enable(WWDG_CNT);”的顺序就可以随意呼唤 至于为什么开启中断时,EWIF中断标记位会被置1,我也不清楚
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2015-10-20
在线时间
18 小时
 楼主| 发表于 2016-9-29 17:58:11 | 显示全部楼层

我今晚以解决,在wwdg的中断服务函数中,在喂狗的语句前,加了一句判断if((WWDG->CR&0x7F)==0x40)

解决了wwdg在初始化时,中断标志位被置1,而进中断喂狗(此时计数值就在窗口之上,喂狗必定导致复位)
加了这句语句后,wwdg初始化函数中“WWDG_EnableIT();”与“WWDG_Enable(WWDG_CNT);”的顺序就可以随意呼唤


至于为什么开启中断时,EWIF中断标记位会被置1,我也不清楚
回复

使用道具 举报

10

主题

254

帖子

0

精华

高级会员

Rank: 4

积分
594
金钱
594
注册时间
2015-10-17
在线时间
145 小时
发表于 2016-9-29 19:08:03 | 显示全部楼层
本帖最后由 原_子_哥门徒 于 2016-9-29 22:56 编辑

0x40 的时候产生中断 ,0x3F的时候产生复位,看门狗频率设置的太快的话,中断还没有及时喂狗和重装定时器就会产生复位,将频率调节的低一点中断有足够的时间喂狗就可以了。
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2015-10-20
在线时间
18 小时
 楼主| 发表于 2016-9-29 19:46:37 | 显示全部楼层
原_子_哥门徒 发表于 2016-9-29 19:08
你把两个值搞反了,例程是为演示复位才这样做, 你要让计数值小于窗口值才可以,不然就复位了。

进入0x40的狗中断时才喂狗的啊,
计数器值比窗口值大,它自行向下计数,按手册上说,是没问题的啊,因为并没有在窗口之上喂狗啊
回复

使用道具 举报

352

主题

1473

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
8084
金钱
8084
注册时间
2015-10-15
在线时间
2917 小时
发表于 2016-9-30 12:08:36 | 显示全部楼层
手机早晚报 发表于 2016-9-29 11:46
进入0x40的狗中断时才喂狗的啊,
计数器值比窗口值大,它自行向下计数,按手册上说,是没问题的啊,因为 ...

计数器值比窗口值大,这个肯定是没有问题的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2015-10-20
在线时间
18 小时
 楼主| 发表于 2016-9-30 12:46:06 | 显示全部楼层
@alientek
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2015-10-20
在线时间
18 小时
 楼主| 发表于 2016-9-30 12:49:30 | 显示全部楼层
openedvadmin 发表于 2016-9-30 12:08
计数器值比窗口值大,这个肯定是没有问题的。

对啊,但是实际我的程序就是不停地复位,我也找不到原因
我的程序是在原子的adc工程里添加了wwdg的两个文件
我的全程序就只有我这一个中断,优先级也高
在中断里喂狗,其他地方不喂狗
程序源码在附件,能帮忙看看么?
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2015-10-20
在线时间
18 小时
 楼主| 发表于 2016-9-30 12:50:35 | 显示全部楼层
本帖最后由 手机早晚报 于 2016-9-30 12:52 编辑

@ 正点原子 咱们的qq群管理员下载我的文件也找不出问题,
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-9-30 21:10:12 | 显示全部楼层
手机早晚报 发表于 2016-9-30 12:50
@ 正点原子 咱们的qq群管理员下载我的文件也找不出问题,

国庆后我再看看吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2015-10-20
在线时间
18 小时
 楼主| 发表于 2016-9-30 22:55:58 | 显示全部楼层
C:\Users\asus\Desktop\捕获.PNG
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-10-1 16:36:13 | 显示全部楼层
手机早晚报 发表于 2016-9-30 22:53
我今晚以解决,在wwdg的中断服务函数中,在喂狗的语句前,加了一句判断if((WWDG->CR&0x7F)==0x40)

解 ...

谢谢分享
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-12 17:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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