色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(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ū)別于之前的代碼,我們增加了獨立看門狗的功能??撮T狗的喂狗操作在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)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17185

    瀏覽量

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

    關(guān)注

    10

    文章

    565

    瀏覽量

    70863
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10910

    瀏覽量

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

    關(guān)注

    11

    文章

    1736

    瀏覽量

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

    關(guān)注

    4

    文章

    319

    瀏覽量

    34602
收藏 人收藏

    評論

    相關(guān)推薦

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

    為了公平起見,所有的MCU使用的是同一個工程程序,(不同的MCU,時鐘和GPIO的配置略有不同,使用宏定義區(qū)分MCU),除了使用滴答時鐘和基本GPIO操作外,沒有任何抗干擾手段,全靠
    的頭像 發(fā)表于 01-17 13:16 ?3530次閱讀
    “<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 ?2780次閱讀
    <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 ?788次閱讀

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

    stm32基本都內(nèi)置兩種看門狗(另外還有外置的看門狗芯片),窗口看門狗和獨立看門狗,兩種看門狗
    發(fā)表于 05-09 11:18 ?655次閱讀
    關(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 ?8460次閱讀
    <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學習心得十六:獨立看門狗實驗

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

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

    在早期的MCU中是沒有看門狗這種東西的,所以產(chǎn)品就很容易出現(xiàn)死機,跑飛的情況。為了避免這種情況的出現(xiàn),后期的MCU都集成了看門狗的功能。但是目前看門
    的頭像 發(fā)表于 01-30 14:38 ?1402次閱讀
    <b class='flag-5'>STM32</b>中的獨立<b class='flag-5'>看門狗</b>和窗口<b class='flag-5'>看門狗</b>
    主站蜘蛛池模板: 污污又黄又爽免费的网站 | 被cao的奶水直喷高H| 国产亚洲人成在线视频| 青青国产在线观看视频| 99精品网站| 亚洲免费无码中文在线| 国产成A人片在线观看| 日本女人下面毛茸茸| 苍井空小公主qvod| 韩国免费啪啪漫画无遮拦健身教练| 色欲精品国产AV久久久| 嘟嘟嘟影院免费观看视频 | 国产成人欧美日韩在线电影 | 在线精品国精品国产不卡| 国内国外精品影片无人区| 亚洲欧美中文字幕高清在线| av女优快播| 漂亮的保姆6在线观看中文| 亚洲一级电影| 久久99热成人精品国产| 中文字幕无码A片久久| 老湿司午夜爽爽影院榴莲视频| 孕妇高潮抽搐喷水30分钟| 浪荡女天天不停挨CAO日常视| 自拍 偷拍 亚洲 经典| 嗯好舒服嗯好大好猛好爽| qvod 在线| 神马电影院午 夜理论| 国产亚洲精品免费视频| 影音先锋xfplay影院av| 嗯好大好猛皇上好深用力| 粗好大用力好深快点漫画| 欧美高清videossexo| 成人国产在线视频| 午夜日本大胆裸艺术| 久久电影精品| TUBE69CHINESE学生| 天天躁躁水汪汪人碰人| 仓井空torrent| 亚洲高清视频在线观看| 久久亚洲精品专区蓝色区|