在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

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

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

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

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

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

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

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

poYBAGPC2hqAB2FxAATprU4H4t4143.png

▲圖1

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

 
//摘要:
/*
系統時鐘,使用內部高速HSI倍數,系統時鐘為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:需要顯示的數字,no:0顯示左邊數碼管,1顯示右邊數碼管
void SEG_DisplayNum(unsigned int num, unsigned int no)  
{
    GPIO_ResetBits(GPIOA,0xffff);//關段碼、位碼
    GPIO_ResetBits(GPIOB,0xffff);//關段碼、位碼
  
    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);//關位碼
}

void GPIOInit(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;

  //數碼管斷碼位碼 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();  //喂狗 
  }
}

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

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

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

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



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();  
  }
}

審核編輯黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17370

    瀏覽量

    352914
  • 看門狗
    +關注

    關注

    10

    文章

    566

    瀏覽量

    70979
  • STM32
    +關注

    關注

    2273

    文章

    10928

    瀏覽量

    357895
  • 時鐘
    +關注

    關注

    11

    文章

    1748

    瀏覽量

    131878
  • 抗干擾
    +關注

    關注

    4

    文章

    319

    瀏覽量

    34716
收藏 人收藏

    評論

    相關推薦

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

    為了公平起見,所有的MCU使用的是同一個工程程序,(不同的MCU,時鐘和GPIO的配置略有不同,使用宏定義區分MCU),除了使用滴答時鐘和基本GPIO操作外,沒有任何抗干擾手段,全靠
    的頭像 發表于 01-17 13:16 ?3590次閱讀
    “<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中是沒有看門狗這種東西的,所以產品就很容易出現死機,跑飛的情況。為了避免這種情況的出現,后期的MCU都集成了看門狗的功能。但是目前看門
    的頭像 發表于 02-20 17:47 ?2918次閱讀
    <b class='flag-5'>STM32</b>中的獨立<b class='flag-5'>看門狗</b>和窗口<b class='flag-5'>看門狗</b>是什么

    MCU獨立看門狗和窗口看門狗的區別

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

    關于獨立看門狗的一點經驗

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

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

    stm32有兩個看門狗,獨立看門狗和窗口看門狗,其實兩者的功能是類似的,只是喂狗的限制時間不同。 獨立看門狗
    的頭像 發表于 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。看門狗主要作用是可用來檢測和解決由軟件錯誤引起的故障;當計數器達到給定
    發表于 11-09 17:17 ?8483次閱讀
    <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

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

    MCU獨立看門狗與窗口看門狗的區別

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

    MCU獨立看門狗與窗口看門狗的區別

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

    MCU】基于STM32CubeMX 實現窗口看門狗 WWDG

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

    STM32學習心得十六:獨立看門狗實驗

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

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

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

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

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

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

    在早期的MCU中是沒有看門狗這種東西的,所以產品就很容易出現死機,跑飛的情況。為了避免這種情況的出現,后期的MCU都集成了看門狗的功能。但是目前看門
    的頭像 發表于 01-30 14:38 ?1442次閱讀
    <b class='flag-5'>STM32</b>中的獨立<b class='flag-5'>看門狗</b>和窗口<b class='flag-5'>看門狗</b>
    主站蜘蛛池模板: 成年人网站免费观看 | www天天操| 午夜人成| 中文字幕久久精品波多野结 | 182tv免费视视频线路一二三 | 日韩a无吗一区二区三区 | 亚洲综合色就色手机在线观看 | 亚洲欧美国产高清va在线播放 | 奇米小说| 一级特黄色毛片免费看 | 男人日女人的网站 | 亚洲欧美天堂网 | 美女黄视频免费 | 人人免费操| 伊人久久大香线蕉综合高清 | 日韩一级欧美一级一级国产 | 亚洲一区二区三区免费看 | 在线观看色视频网站 | 性夜影院爽黄a爽免费视频 性瘾高h姚蕊全文免费阅读 | h免费视频 | 久久婷婷一区二区三区 | 三级黄色一级视频 | 二级黄绝大片中国免费视频 | 资源种子在线观看 | 天天爽天天爽天天片a久久网 | 欧美三级色图 | 日韩三级观看 | 亚洲一本视频 | 狠狠色丁香婷婷综合最新地址 | 成人性欧美丨区二区三区 | 最新日本免费一区二区三区中文 | 欧美jizz大又粗 | 高清一区二区三区 | 欧美黄色免费网址 | 中文字幕色婷婷在线精品中 | 成人精品一区二区不卡视频 | 四虎影视大全免费入口 | 久久久久久久国产精品影院 | 国产资源网 | 国产综合图区 | 色噜噜成人综合网站 |