看门狗分两种
1.独立看门狗,IWDG
只是简单的设置一个数,然后递减,减到0之前,还没有喂狗,狗就死了,系统重启。
没有中断。只有自己代码里去喂狗。
频率是内部时钟40K,可以分频。
2.窗口看门狗,WWDG
频率是PLCK1 我这是36M最多8分频,然后呢除以4096,就是WWDG的时钟
有个2个值比较重要,
1.一个是窗口值,W,在这个值之前不能喂狗,喂了狗就撑死了,reset。
2.一个是临界值,0x3F到这个值还没喂狗,狗就饿死了,reset。
我也不知道为什么设置是0x3F,挺奇怪的,为什么不设0x00?
WWDG有一个中断函数HAL_WWDG_WakeupCallback,在倒计时到0x40的时候会掉这个,你得赶紧Refresh一下。
这些都是基本的,我搞的时候遇到2个问题:
1.
一个是Hal库版本的问题,HAL库升级到1.6版本后WWDG只有init函数,没有StartIT接口了,不知道是不是Bug,还是ST有新的用法,折腾我半天。后来我退回到1.4版本就OK了,但是新版本的Cube用就版本的HAL库竟然也有Bug,哎。无语。
2.
我自己项目需求是,板子USB通信,然后将内容与I2C进行读写,但是当接线不当的时候(比如没有接GND),I2C会挂掉,Systick不更新,然后就While死循环了,板子也就挂掉了,所以我就用了一个看门狗。
然后我发现就算这样也不行,好像USB的中断级别比WWDG高(在Cube里设的时候是一样都是0),USB当数据量大的时候,只用中断喂狗,来不及,所以特别容易死机。
后来我把窗口值设成126,每次刷新就刷到125,在我自己的逻辑代码里也增加了喂狗程序,然后就OK了。
关键字:STM32F103 看门狗 使用记录
引用地址:
STM32F103看门狗使用记录
推荐阅读最新更新时间:2024-11-04 23:29
单片机看门狗程序
*此程序实现单片机 看门狗 WDT的功能*/ #include p18f458.h unsigned long i; /*系统初始化子程序*/ void initial() { TRISD = 0X00; /*D口设为输出*/ } /*延时子程序*/ void DELAY() { for (i=19999;--i;) continue; } /*主程序*/ main () { initial(); /*初始化,设定看门狗的相关寄存器*/ PORTD = 0X00; /*D口送00H,发光 二极管 亮*/ DELAY(); /*给予一定时间的延时*/ PORTD = 0XFF; /*D口送FFH,发光
[单片机]
ucos ii 移植到STM32f103ze上
简介:在移植UCOS时,需要编写的函数文件有includes.h、os_cpu.c、os_cpu_a.asm、os_cpu.h、需要配置的文件有os_cgf.h、中断和启动代码。 采用别人移植好的代码。即所需函数已写好。 准备工作: 1、ucos ii源码 2、stm32库 步骤: 1、建工程。 工程目录为: 2、配置ucos ii 在os_cfg.h中配置相关功能 3、修改相关函数 ucos ii需要一个定时器,在stm32中采用systick定时器,因此需要配置systick定时器 void SysTick_Configuration(void) { //关计数
[单片机]
基于stm32f103zet6之UC/OS_II的学习1(初步移植OS--点灯大法)
代码这里可以下载 http://download.csdn.net/detail/king_bingge/5353528 一、uc/OS的实时性是靠什么实现的? 1、uC/OS的实时性就是靠定时中断来完成。 2、每个时钟节拍到来,就会产生一次定时中断,中断后进行任务调度,运行就绪表中优先级最高的任务(非抢先型内核中断后继续运行被中断任务)。 即过一段时间就检测是否有重要任务需要运行,是的就转而运行更重要的任务,从而确保实时性(裸机程序就无法这样做了)。 当然这里没有把系统调用考虑进去。 二、首先整体把握一下在M3上运行ucosII的架构 这就是整个系统各模块之间的关系,好的接下来就按照手册来分析一下移植的时候需要注意的地
[单片机]
利用stm32f103的TIM2实现精确延时
void TIM_ResetCounter(TIM_TypeDef * TIMx) { TIMx- CNT = 0; } void TIM2_Delay_ms(unsigned int cms) { unsigned short temp = 0; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = 36000 - 1; TIM_TimeBaseStructure.TIM_CounterMo
[单片机]
stm32f103——按键检测(轮询方式)
我们下面来讲一讲,GPIO在输入模式下检测按键是否被按下: 首先我们来看看按键按下时,K1处电压的变化情况是什么: 我们看到,按键按下时,K1处的电压并不是立马就下降为0v,因为按键有机械的弹性形变,导致按键被按下时,会发生抖动。我们用GPIO来读取K1处的电压是否为0,如果为低电平,则表示按键被按下。被按下后,如果为高电平,则表示按键被抬起来了。 但是,在这个按键抖动的过程中,电平有上升沿也有下降沿,电压有高电平也有低电平。所以,在这一段抖动的部分的时间段内,如果我们用GPIO去判断,由于电平忽高忽低,我们的程序就会识别出来,按键在被按下后马上就抬起来了。但是,实际上并不是这样。所以,我们需要跳过按键被按下时的前50
[单片机]
基于stm32f103zet6的DS1302学习
由于硬件出了问题,也就是外部低速晶振没用,震不起来,然后查看了网上的帖子,STM32的RTC果然口碑不怎么样,所以果断换DS1302,在移植的过程中还算顺利,记录下来吧,也算对自己的总结吧! 1、所谓的DS1302 这里面也指明了简单的SPI协议 然后就直接上代码了,注释很详细的!基本实现单行注释 1、主函数main #include stm32f10x.h #include SysTick.h #include Delay.h #include Usart.h #include stdio.h #include DS1302.h /*******由于没有做外设测试的程序是:按键P
[单片机]
错误解决:STM32F103串口1与串口3相同代码却结果不同
在前几天调试openmv时发现同样的代码串口1和串口3的结果却是不一样的,当时着实是把我坑了很久,怎么都找不到原因,用示波器看波形也是没有问题的,在Openedv网站上有位网友指出是我初始化代码的问题,在翻阅参考手册后终于发现了问题。 下列代码为我原本的初始化代码: #include sys.h #include usart.h #include led.h #include usart3.h int theta_err,rho_err; int main(void) { Stm32_Clock_Init(9); //=====系统时钟设置 delay_init(72); //
[单片机]
如何实现模拟看门狗?
对于看门狗大家或许不陌生,但对于模拟看门狗有的朋友可能就不甚了解了。本文来聊聊模拟看门狗,旨在梳理相应的概念,理解模拟看门狗原理、与常规看门狗的异同点以及工程应用价值。 啥是看门狗? 一般来讲,单片机的看门狗可简单看成相对独立的两部分,即计时单元和监控单元。计时单元实现计数与重装。在计数过程中,软件可以适时对计数器的初始值进行重装,以防溢出。监控单元监视计时器的溢出事件,若计数器因未被软件适时重装而发生溢出,看门狗通常会执行复位动作,比如复位处理器。 以STM32F4系列单片机独立看门狗IWDG( Independent watchdog)为例,看看其计时电路的功能架构: 我们再结合STM32的复位逻辑模块,来大致看看
[单片机]