吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

“看門狗“VS“打狗棒”,誰勝誰負?(STM32篇)—MCU抗干擾實驗系列專題(3)

jf_09510355 ? 來源:jf_09510355 ? 作者:jf_09510355 ? 2023-02-08 09:15 ? 次閱讀

后臺有許多讀者留言說先弄點干貨。今天應(yīng)讀者要求,我們先來一篇干貨。大家有什么要求,歡迎留言,關(guān)于MCU的應(yīng)用、測試要求,我們都會盡量滿足。

在上兩期文章和視頻中,為了公平起見,所有的MCU使用的是同一個工程程序,(不同的MCU,時鐘和GPIO的配置略有不同,使用宏定義區(qū)分MCU),除了使用滴答時鐘和基本GPIO操作外,沒有任何抗干擾手段,全靠MCU內(nèi)部自身的抗干擾能力進行的測試。結(jié)果,只有芯源CW32MCU沒有徹底死機外,其它均有死機現(xiàn)象。

這種死機現(xiàn)象,在我們實際開發(fā)產(chǎn)品時,是禁止發(fā)生的。為了對付這種干擾,除了硬件上有些技術(shù)對策,那軟件上又有些什么呢?

當然是我們最熟悉的看門狗了?!翱撮T狗”這個神器在“古老的年代”51時期,那是沒有的,需要在外面加一個“昂貴”的芯片來實現(xiàn)。當然,現(xiàn)在新時代,所有的ARM MCU基本上都標配了看門狗外設(shè)。

看門狗是啥,我們來看一下,STM32芯片的用戶手冊,關(guān)于看門狗的介紹。

poYBAGPC2hqAB2FxAATprU4H4t4143.png

▲圖1

這里我們就不詳細展開其內(nèi)容了。直接來看核心代碼。

 
//摘要:
/*
系統(tǒng)時鐘,使用內(nèi)部高速HSI倍數(shù),系統(tǒng)時鐘為48M。
*/
//Programed by Cache.Lee 2023.1.4

#include "stm32f0xx.h"
#include "stm32f0xx_gpio.h"

//GPIOA
#define SEGA GPIO_Pin_10
#define SEGB GPIO_Pin_9
#define SEGC GPIO_Pin_8

//GPIOB
#define SEGD GPIO_Pin_14
#define SEGE GPIO_Pin_15

//GPIOA
#define SEGF GPIO_Pin_11
#define SEGG GPIO_Pin_12

//GPIOB
#define SEGDP GPIO_Pin_13

//num:需要顯示的數(shù)字,no:0顯示左邊數(shù)碼管,1顯示右邊數(shù)碼管
void SEG_DisplayNum(unsigned int num, unsigned int no)  
{
    GPIO_ResetBits(GPIOA,0xffff);//關(guān)段碼、位碼
    GPIO_ResetBits(GPIOB,0xffff);//關(guān)段碼、位碼
  
    switch(num) //開段碼
    {
        case 0: //ABCDEF
            GPIO_SetBits(GPIOA,SEGA|SEGB|SEGC|SEGF);
            GPIO_SetBits(GPIOB,SEGD|SEGE);
            break;        
        case 1: //BC
            GPIO_SetBits(GPIOA,SEGB|SEGC);
            break;        
        case 2: //ABDEG
            GPIO_SetBits(GPIOA,SEGA|SEGB|SEGG);
            GPIO_SetBits(GPIOB,SEGD|SEGE);
            break;        
        case 3: //ABCDG            
            GPIO_SetBits(GPIOA,SEGA|SEGB|SEGC|SEGG);
            GPIO_SetBits(GPIOB,SEGD);      
            break;
        case 4://BCFG
             GPIO_SetBits(GPIOA,SEGF|SEGB|SEGC|SEGG);         
            break;
        case 5://ACDFG
            GPIO_SetBits(GPIOA,SEGA|SEGC|SEGG|SEGF);
            GPIO_SetBits(GPIOB,SEGD);              
            break;
        case 6: //ACDEFG
            GPIO_SetBits(GPIOA,SEGA|SEGC|SEGG|SEGF);
            GPIO_SetBits(GPIOB,SEGD|SEGE);   
            break;
        case 7: //ABC
            GPIO_SetBits(GPIOA,SEGA|SEGB|SEGC);
           break;
        case 8: //ABCDEFG
            GPIO_SetBits(GPIOA,SEGA|SEGB|SEGC|SEGG|SEGF);
            GPIO_SetBits(GPIOB,SEGD|SEGE); 
            break;
        case 9: //ABCDFG
            GPIO_SetBits(GPIOA,SEGA|SEGB|SEGC|SEGG|SEGF);
            GPIO_SetBits(GPIOB,SEGD); 
           break;
        case 10: //DP 顯示DP  
           GPIO_SetBits(GPIOB,SEGDP); 
           break;
        default:
            break;          
    }
    if(no==1)
       GPIO_SetBits(GPIOB,GPIO_Pin_12);
    else 
       GPIO_SetBits(GPIOB,GPIO_Pin_11);//關(guān)位碼
}

void GPIOInit(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;

  //數(shù)碼管斷碼位碼 IO初始化
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);   
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}


int main(void)
{
  unsigned long i;
  unsigned int num=0;

  for(i=0;i<60000;i++);   //上電延時
  GPIOInit();  

  /* IWDG timeout equal to 250 ms (the timeout may varies due to LSI frequency
     dispersion) */
  /* Enable write access to IWDG_PR and IWDG_RLR registers */
  IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

  /* IWDG counter clock: LSI/32 */
  IWDG_SetPrescaler(IWDG_Prescaler_32);

  /* Set counter reload value to obtain 250ms IWDG TimeOut.
     Counter Reload Value = 250ms/IWDG counter clock period
                          = 250ms / (LSI/32)
                          = 0.25s / (LsiFreq/32)
                          = LsiFreq/(32 * 4)
                          = LsiFreq/128
   */
  IWDG_SetReload(40000/128);
  /* Reload IWDG counter */
  IWDG_ReloadCounter();
  /* Enable IWDG (the LSI oscillator will be enabled by hardware) */
  IWDG_Enable();
  SEG_DisplayNum(10,1);
  for(i=0;i<60000;i++);  

  while(1)
  {


     num++;
     if(num>=100)num=0;
      SEG_DisplayNum(num/10,0);
      for(i=0;i<60000;i++);   //延時

      SEG_DisplayNum(num%10,1);
      for(i=0;i<60000;i++);   //延時

      SEG_DisplayNum(num/10,0);
      for(i=0;i<60000;i++);   //延時    
      IWDG_ReloadCounter(); //喂狗 

      SEG_DisplayNum(num%10,1);
      for(i=0;i<60000;i++);   //延時

      SEG_DisplayNum(num/10,0);       
      for(i=0;i<60000;i++);   //延時

      SEG_DisplayNum(num%10,1);
      for(i=0;i<60000;i++);   //延時
      IWDG_ReloadCounter();  //喂狗 
  }
}

這里的代碼與上期代碼不同,我們使用官方標準庫來重新編寫。其中數(shù)碼管的動態(tài)掃描沒有使用滴答時鐘,而是在主程序中直接用延時來完成。區(qū)別于之前的代碼,我們增加了獨立看門狗的功能。看門狗的喂狗操作在MAIN函數(shù)的大循環(huán)里,數(shù)碼管的動態(tài)掃描中實現(xiàn)。

當程序發(fā)生死機時,MAIN函數(shù)的大循環(huán)將暫停運行,數(shù)碼管隨機顯示最近一次數(shù)值,不進行動態(tài)掃描,所以,只有一位數(shù)碼管顯示。同時,喂狗暫停。當看門狗時間到,將發(fā)生看門狗復(fù)位操作,系統(tǒng)將重新復(fù)位運行。這樣程序就實現(xiàn)了看門狗復(fù)位功能。

在實驗中,由于打狗棒電壓干擾的威力巨大,STM32芯片被打壞了幾個引腳。驅(qū)動A、F、G的端口功能異常,而且芯片略燙,應(yīng)該是引腳被打壞了。但不影響下載,其它位碼顯示正常。

除了看門狗復(fù)位,還有一種軟件復(fù)位方式。當MCU發(fā)生硬件失效時,會進入Hardfault中數(shù)函數(shù)。Hardfault是優(yōu)先級別為-1的固定類型中斷,無需初始化設(shè)置。常常在MCU死機時,不知明的會進入Hardfault中斷。因此,在Hardfault中斷函數(shù)中,添加軟件復(fù)位功能也是一種防死機現(xiàn)象的方法。代碼如下



void HardFault_Handler(void)
{
  unsigned int j;
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
        SEG_DisplayNum(10,0);
        for(j=0;j<60000;j++);
        for(j=0;j<60000;j++);
        for(j=0;j<60000;j++);
        for(j=0;j<60000;j++);
        for(j=0;j<60000;j++);
        for(j=0;j<60000;j++);

        NVIC_SystemReset();  
  }
}

審核編輯黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17324

    瀏覽量

    352657
  • 看門狗
    +關(guān)注

    關(guān)注

    10

    文章

    566

    瀏覽量

    70949
  • STM32
    +關(guān)注

    關(guān)注

    2272

    文章

    10924

    瀏覽量

    357594
  • 時鐘
    +關(guān)注

    關(guān)注

    11

    文章

    1747

    瀏覽量

    131803
  • 抗干擾
    +關(guān)注

    關(guān)注

    4

    文章

    319

    瀏覽量

    34679
收藏 人收藏

    評論

    相關(guān)推薦

    看門狗VS打狗棒”,?(CW32)——MCU抗干擾實驗系列專題(4)

    為了公平起見,所有的MCU使用的是同一個工程程序,(不同的MCU,時鐘和GPIO的配置略有不同,使用宏定義區(qū)分MCU),除了使用滴答時鐘和基本GPIO操作外,沒有任何抗干擾手段,全靠
    的頭像 發(fā)表于 01-17 13:16 ?3578次閱讀
    “<b class='flag-5'>看門狗</b>”<b class='flag-5'>VS</b>“<b class='flag-5'>打狗棒</b>”,<b class='flag-5'>誰</b><b class='flag-5'>勝</b><b class='flag-5'>誰</b><b class='flag-5'>負</b>?(CW32<b class='flag-5'>篇</b>)——<b class='flag-5'>MCU</b><b class='flag-5'>抗干擾</b><b class='flag-5'>實驗</b><b class='flag-5'>系列</b><b class='flag-5'>專題</b>(4)

    STM32中的獨立看門狗和窗口看門狗是什么

    在早期的MCU中是沒有看門狗這種東西的,所以產(chǎn)品就很容易出現(xiàn)死機,跑飛的情況。為了避免這種情況的出現(xiàn),后期的MCU都集成了看門狗的功能。但是目前看門
    的頭像 發(fā)表于 02-20 17:47 ?2885次閱讀
    <b class='flag-5'>STM32</b>中的獨立<b class='flag-5'>看門狗</b>和窗口<b class='flag-5'>看門狗</b>是什么

    MCU獨立看門狗和窗口看門狗的區(qū)別

    早期的MCU沒有看門狗,就容易引起有些產(chǎn)品死機了不能重啟工作。為了避免這個問題,后期的MCU在內(nèi)部集成了看門狗的功能。
    發(fā)表于 03-03 09:18 ?815次閱讀

    關(guān)于獨立看門狗的一點經(jīng)驗

    stm32基本都內(nèi)置兩種看門狗(另外還有外置的看門狗芯片),窗口看門狗和獨立看門狗,兩種看門狗
    發(fā)表于 05-09 11:18 ?676次閱讀
    關(guān)于獨立<b class='flag-5'>看門狗</b>的一點經(jīng)驗

    什么是stm32看門狗?獨立看門狗和窗口看門狗工作原理解析

    stm32有兩個看門狗,獨立看門狗和窗口看門狗,其實兩者的功能是類似的,只是喂狗的限制時間不同。 獨立看門狗
    的頭像 發(fā)表于 11-06 11:48 ?2.8w次閱讀
    什么是<b class='flag-5'>stm32</b><b class='flag-5'>看門狗</b>?獨立<b class='flag-5'>看門狗</b>和窗口<b class='flag-5'>看門狗</b>工作原理解析

    STM32看門狗配置(獨立看門狗IWDG和窗口看門狗WWDG)

    stm32自帶兩個看門狗模塊,獨立看門狗IWDG和窗口看門狗WWDG。看門狗主要作用是可用來檢測和解決由軟件錯誤引起的故障;當計數(shù)器達到給定
    發(fā)表于 11-09 17:17 ?8476次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>看門狗</b>配置(獨立<b class='flag-5'>看門狗</b>IWDG和窗口<b class='flag-5'>看門狗</b>WWDG)

    獨立看門狗實驗-IWDG-M3

    關(guān)于STM32獨立看門狗實驗文檔
    發(fā)表于 11-27 15:30 ?3次下載

    MCU獨立看門狗與窗口看門狗的區(qū)別

    早期的MCU沒有看門狗,就容易引起有些產(chǎn)品死機了不能重啟工作。為了避免這個問題,后期的MCU在內(nèi)部集成了看門狗的功能。為了滿足更多使用場景,現(xiàn)在很多
    發(fā)表于 10-28 20:06 ?8次下載
    <b class='flag-5'>MCU</b>獨立<b class='flag-5'>看門狗</b>與窗口<b class='flag-5'>看門狗</b>的區(qū)別

    MCU獨立看門狗與窗口看門狗的區(qū)別

    關(guān)注+星標公眾號,不錯過精彩內(nèi)容素材來源 | STM32早期的MCU沒有看門狗,就容易引起有些產(chǎn)品死機了不能重啟工作。為了避免這個問題,后期的MCU在內(nèi)部集成了
    發(fā)表于 10-29 10:51 ?2次下載
    <b class='flag-5'>MCU</b>獨立<b class='flag-5'>看門狗</b>與窗口<b class='flag-5'>看門狗</b>的區(qū)別

    MCU】基于STM32CubeMX 實現(xiàn)窗口看門狗 WWDG

    ”表示看門狗遞減計數(shù)器只能在一個窗口時間內(nèi)完成刷新,否則MCU將復(fù)位。(2)窗口看門狗一般用來監(jiān)測由外部干擾或不可預(yù)見的邏輯條件造成的應(yīng)用背離正常運行序列而產(chǎn)生的軟件故障。(
    發(fā)表于 11-01 16:24 ?10次下載
    【<b class='flag-5'>MCU</b>】基于<b class='flag-5'>STM32</b>CubeMX 實現(xiàn)窗口<b class='flag-5'>看門狗</b> WWDG

    STM32學(xué)習(xí)心得十六:獨立看門狗實驗

    記錄一下,方便以后翻閱~主要內(nèi)容:1) 獨立看門狗概述;2) 常用寄存器和庫函數(shù)配置;3) 獨立看門狗實驗代碼解讀。官方資料:《STM32
    發(fā)表于 12-27 18:44 ?6次下載
    <b class='flag-5'>STM32</b>學(xué)習(xí)心得十六:獨立<b class='flag-5'>看門狗</b><b class='flag-5'>實驗</b>

    STM32:獨立看門狗、窗口看門狗的配置

    STM32單片機的看門狗有獨立看門狗和窗口看門狗之分,這兩者的工作原理卻完全不同。
    發(fā)表于 02-08 16:15 ?18次下載
    <b class='flag-5'>STM32</b>:獨立<b class='flag-5'>看門狗</b>、窗口<b class='flag-5'>看門狗</b>的配置

    STM32中的獨立看門狗和窗口看門狗

    一、前言 在早期的MCU中是沒有看門狗這種東西的,所以產(chǎn)品就很容易出現(xiàn)死機,跑飛的情況。為了避免這種情況的出現(xiàn),后期的MCU都集成了看門狗的功能。但是目前
    的頭像 發(fā)表于 12-22 16:58 ?2230次閱讀

    STM32中的獨立看門狗和窗口看門狗

    在早期的MCU中是沒有看門狗這種東西的,所以產(chǎn)品就很容易出現(xiàn)死機,跑飛的情況。為了避免這種情況的出現(xiàn),后期的MCU都集成了看門狗的功能。但是目前看門
    的頭像 發(fā)表于 01-30 14:38 ?1436次閱讀
    <b class='flag-5'>STM32</b>中的獨立<b class='flag-5'>看門狗</b>和窗口<b class='flag-5'>看門狗</b>
    德州百家乐扑克桌| 百家乐官网新规则| 百家乐必胜软件下载| 六合彩特码开奖结果| 永利博百家乐官网的玩法技巧和规则 | 大发888官方pt老虎机大咖炸金花网页扎金花| 赌博百家乐官网游戏| 总统百家乐的玩法技巧和规则| 百家乐官网视频金币| 赌场百家乐赌场| 百家乐官网庄家赢钱方法| 海王星百家乐的玩法技巧和规则| 钱大发888扑克| 反赌百家乐官网的玩法技巧和规则 | 德州扑克英文| 择日自学24| 天天乐娱乐| 百家乐技巧何为百家乐之路| 易胜博百家乐官网下载| 最新百家乐网评测排名| 大玩家百家乐官网游戏| 百家乐蓝盾在线现| 七胜百家乐官网娱乐平台| 大发888老虎机下载免费| 乐宝百家乐官网的玩法技巧和规则 | 惠来县| 百家乐试玩1000元| 百家乐官网庄闲比| 云顶娱乐| 玩百家乐如何看路| 澳门百家乐官网心德| 新锦江百家乐的玩法技巧和规则| 圣安娜百家乐官网代理| 华人棋牌游戏| 哪个百家乐投注平台信誉好| 百家乐官网棋牌交友| 大发888官方正版网| 百家乐官网扑克桌布| 大发8888娱乐场| 百家乐怎么投注| 百家乐官网打大必赢之法|