历史上的今天
返回首页

历史上的今天

今天是:2024年09月05日(星期四)

正在发生

2018年09月05日 | stm32CubeMx中实现窗口看门狗功能

2018-09-05 来源:eefocus

stm32CubeMx..........多数嵌入式编程人员可能已程习惯使用stm32的库开发方式来实现功能,库版本v3.5.0本人之前也一直使用,开始使用stm32CubeMx开发方式,发现和原先库开发方式与很多不同,实现方法也有区别。本文旨在将个人在stm32CubeMx开发方式中总结的一些经验写出来,供大家参考。


对于看门狗而言,stm32中有两种,分为独立看门狗(IWDG)和窗口看门狗(WWDG),在此大概介绍下两条警犬,本文重点介绍窗口看门狗。


独立看门狗:独立看门狗(IWDG)由专用的40kHz的低速时钟驱动,即使主时钟发生故障它也仍然有效。IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。


窗口看门狗:窗口看门狗通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。通俗说就是会产生两个复位。复位条件:(1)当计数器的数值从0x40减到0x3F;(2)当刷新看门狗时计数器的数值大于窗口上限值时。满足任何一条都可以产生复位信号。通常情况下设置窗口上限值为0x7F,下限值默认为0x40,计数器向下数到0x40就会产生中断,下个910us后变为0x3F就会复位系统。也就是喂狗操作不能早喂,即大于窗口值时会发生复位;喂的晚了,即计数器的数值从0x40减到0x3F时没有及时喂狗,也会产生复位。


实验说明:板子型号为stm32F103VET6, 每次喂狗并通过串口打印出来

下面来看下在stm32CubeMx中窗口看门狗的实现。

1、在stm32cubemx中设值

我们设置分频系数为8;窗口值为0x5f;计数值为0x7f;其中窗口默认下限值为0x40。并打开中断,打开中断后,会置1中断位,如图:

(2)写WWDG初始化函数

void WWDG_Init(void)
{
__WWDG_CLK_ENABLE(); //使能WWDG时钟
   
MX_WWDG_Init(); //调用系统初始化函数,也就是我们在图形界面设置好值后,会将我们刚才设置的值转化为代码。在本函数里直接调用即可


__HAL_WWDG_CLEAR_FLAG(&hwwdg, WWDG_FLAG_EWIF);  // 开启中断前,先清除中断标志位

HAL_WWDG_Start_IT(&hwwdg);   //设置中断标志位,并开启中断,

}

(3)我们再来开下在中断函数,cubemx的中断函数处理和库开发方式还是有区别的。

/**
* @brief This function handles Window watchdog interrupt.
*/
void WWDG_IRQHandler(void)
{
  /* USER CODE BEGIN WWDG_IRQn 0 */


  /* USER CODE END WWDG_IRQn 0 */
  HAL_WWDG_IRQHandler(&hwwdg);
  /* USER CODE BEGIN WWDG_IRQn 1 */


  /* USER CODE END WWDG_IRQn 1 */
}

我们看到在它的中断函数里调用了一个函数, HAL_WWDG_IRQHandler(&hwwdg); 我们再来看这个函数,在该函数里出现了一个在cubemx方式里独有的,回调函数,当中断开启,并且中断标志位满足后将会调用该函数,而我们的操作将会在这里实现。


void HAL_WWDG_IRQHandler(WWDG_HandleTypeDef *hwwdg)

  /* Check if Early Wakeup Interrupt is enable */
  if(__HAL_WWDG_GET_IT_SOURCE(hwwdg, WWDG_IT_EWI) != RESET)
  {
    /* Wheck if WWDG Early Wakeup Interrupt occurred */
  if(__HAL_WWDG_GET_FLAG(hwwdg, WWDG_FLAG_EWIF) != RESET)
  {
    /* Early Wakeup callback */ 
    HAL_WWDG_WakeupCallback(hwwdg);
    
    /* Change WWDG peripheral state */
    hwwdg->State = HAL_WWDG_STATE_READY; 
    
      /* Clear the WWDG Early Wakeup flag */
    __HAL_WWDG_CLEAR_FLAG(hwwdg, WWDG_FLAG_EWIF);
    
    /* Process Unlocked */
    __HAL_UNLOCK(hwwdg);
  }

}

(4)下面我们来讨论看门狗的喂狗时间,很容易计算在stm32f103系列里窗口看门狗的最大喂狗时间也就58ms,在一些程序里我们没必要这么密集的去喂狗。那么如何增大喂狗时间呢。搜集了网上的一些方法后,本人根据具体事例实现了一个增大看门狗喂狗时间的方法:就是在中断函数中再做一个额外计数器,如果计数器没有达到设定值,就就行喂狗操作,同时使设定值加1,当计数器达到设定值时,就不加载喂狗定时器初值,这时看门狗定时器就会从从0x40减到0x3F产生系统复位。使用这个方法可以将定时时间拓展到 58ms*额外计数器设定值,定个几十秒都不是问题。 当达到计数值后如果我们清零计数值,那么看门狗系统就会复位,所以我们只要在主函数里定期的将该计数值清零,也就是变相的增大了喂狗时间。下面具体看事例:

每次产生看门狗中断都会调用回调函数,我在回调函数里做如下操作:

/*****************************看门狗回调函数********************************/
void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg)
{
if(time <=50)
{
HAL_WWDG_Refresh(hwwdg, WWDG_CNT); //喂狗函数
printf("喂狗\r\n");    //每喂一次狗,打印一次,无实际作用
time++;
}
}


/**************************main函数中部分函数********************************/

  while (1)
  {
if(time > 50)
{
time = 0;
printf("time清零 \r\n");
}
  }


我设置看门狗最大喂狗时间为58ms,那么计数50次,大概是2.9s时间,也就是我在主函数中必须在2.9s内,只要对计数器清零,系统就不会复位了。相应的可以把计数值设置更大,这就根据个人需要了。这样是不是变相的增大喂狗时间了。

下面是我的串口打印效果:



大家看一下是不是每喂一次狗就会打印一个“喂狗”,同时在11点55分20秒有一次time清零,到11点55分23秒有一次time清零,是不是间隔大概3秒了。



好了,本人也是刚开始使用stm32CubeMx开发,如果内容中有问题,希望指出来,共同进步


推荐阅读

史海拾趣

中电熊猫(CEC)公司的发展小趣事

技术创新是中电熊猫持续发展的关键。公司不断深化技术改革,加大研发投入,推动产业升级。例如,在液晶面板生产线上,中电熊猫采用了世界一流的技术和设备,不仅提高了屏幕分辨率和良品率,还降低了生产成本。此外,中电熊猫还积极参与国家重大科研项目和行业标准制定工作,为行业发展做出了积极贡献。

ADDtek公司的发展小趣事

2007年,中电熊猫母公司中国电子信息集团公司(CEC)对熊猫电子进行了重组,全面推进平板显示全产业链发展。2015年,中电熊猫投资291.5亿元建设的8.5代液晶面板生产线投产,成为全球首条应用金属氧化物IGZO技术的超高分辨率液晶面板生产线。这一举措标志着中电熊猫在液晶面板产业中占据了重要地位,为后续的发展奠定了坚实基础。

Charcroft Electronics Ltd公司的发展小趣事

随着产品线的不断丰富和技术实力的提升,Charcroft Electronics Ltd公司开始积极拓展国内外市场。公司加强与国际知名企业的合作,通过参加国际电子展会、举办技术研讨会等方式,提升品牌知名度和影响力。同时,公司还针对不同地区的市场需求,推出定制化的产品和服务,进一步巩固和扩大市场份额。

Euroquartz公司的发展小趣事

Euroquartz自创立之初,就将产品质量和客户满意度置于公司运营的核心。为了确保这一点,公司引入了完整的AS9100 Rev D质量体系,并通过了相应的认证。这一体系要求Euroquartz在制造程序和可追溯性方面保持完整的记录,审批机关会定期进行审核,确保品质始终如一。这种对品质的执着追求,为Euroquartz赢得了客户的信赖,也为公司的发展奠定了坚实的基础。

GISMA Steckverbinder GmbH公司的发展小趣事

GISMA深知客户需求的重要性,因此始终将客户需求放在首位。公司拥有一支专业的研发团队和客户服务团队,能够根据客户的具体需求量身定制产品,提供从设计到生产的全方位服务。这种定制化服务模式不仅赢得了客户的广泛赞誉,也进一步巩固了GISMA在电子行业中的市场地位。通过深入了解客户需求,GISMA不断优化产品设计和生产流程,为客户提供更加优质的产品和服务。

Hittite Microwave(ADI)公司的发展小趣事

随着技术的不断进步,GISMA持续加大研发投入,不断推出新产品以满足市场需求。其产品线从最初的几个系列扩展到如今的16个系列,涵盖了超过15000种不同类型的连接器。这些连接器不仅具有高电气性能和出色的防水性能,还能够在恶劣的水下环境中保持稳定的工作状态。GISMA的技术创新能力和产品线拓展策略,为其在电子行业中的持续发展奠定了坚实基础。

问答坊 | AI 解惑

运算放大器的增益误差对DAC性能的影响

假设DAC使用了一个反相运算放大器,C1=C2,A(0)=1000,若VREF=1V,问DAC在最怀情况下的最大精度? 反相放大器的环路增益=0.5×1000=500,因此增益误差为1/501=0.002。增益误差应该小于±0.5LSB,表示为: 增益误差=0.002…

查看全部问答>

驳关于STC89的一些咵噪

网上对STC的评价并不是很好,于是斗胆尝试了一把,到现在还是没有发现什么问题 我用的是89C58…

查看全部问答>

PXA300(Monahans) 能否支持1024x768分辨率?

PXA300(Monahans) 能否支持1024x768分辨率?…

查看全部问答>

求问关于WINCE 键盘锁定和解锁的问题

wince提供解锁某个键的函数API么? 解锁方面的API有么? 谢谢…

查看全部问答>

帮忙出主意,我的前途该往哪里走

  大家好,迷茫了很久,还是看不到方向,请有智慧的您帮忙吧,诚心请教   我毕业直接来到深圳,工作两年,第一年几乎虚度了,第二年用三星八位单片机汇编语言做了点简单的事(按键,led,定时器,i/o口发音,固定显示的液晶之类,硬件电路也 ...…

查看全部问答>

在CE下怎么对光驱进行操作?

如题,我想用EVC编程对光驱在CE下进行操作。…

查看全部问答>

【讨论】关于FLASH的问题

我在做写入flash的时候写入的是113个字节的数据,A段的从1000开始写的!!! 我把要写入的数据建立在一个结构里了!!! 可是写完以后读的时候总是后写入的两个读出的是0;如果写入的少的话,比如我写50个字节那么 就有最后1个读出是0;我想问问 ...…

查看全部问答>

求助!!MPS430F149驱动电机时候总死机

用F149驱动继电器结合驱动380V三相电机 利用两极继电器 中间采用光耦驱动第一级继电器 第一级继电器再控制第二级380继电器 上高压电时继电器结合 电机转 然后单片机就死机 求助!!!…

查看全部问答>

看到一款平板电脑,用TI的OMP4430----居然只要¥1500元

下面是那个厂家的广告单........如果又要买平板的兄弟真的可以考虑   …

查看全部问答>

为什么我的开发板下载郭天祥的程序没用

这个开发板是去年在淘宝上买的,放那里一直没动,最近想学了,所以拿出来看看,在百度文库里有这个开发板的详细介绍,下面是地址http://wenku.baidu.com/view/0878e189680203d8ce2f249a.html单片机的型号是STC 90C516RD+郭天祥视频教程里面的程序下 ...…

查看全部问答>