一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

“看門(mén)狗“VS“打狗棒”,誰(shuí)勝誰(shuí)負(fù)?(STM32篇)—MCU抗干擾實(shí)驗(yàn)系列專題(3)

jf_09510355 ? 來(lái)源:jf_09510355 ? 作者:jf_09510355 ? 2023-02-08 09:15 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

當(dāng)然是我們最熟悉的看門(mén)狗了。“看門(mén)狗”這個(gè)神器在“古老的年代”51時(shí)期,那是沒(méi)有的,需要在外面加一個(gè)“昂貴”的芯片來(lái)實(shí)現(xiàn)。當(dāng)然,現(xiàn)在新時(shí)代,所有的ARM MCU基本上都標(biāo)配了看門(mén)狗外設(shè)。

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

poYBAGPC2hqAB2FxAATprU4H4t4143.png

▲圖1

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

 
//摘要:
/*
系統(tǒng)時(shí)鐘,使用內(nèi)部高速HSI倍數(shù),系統(tǒng)時(shí)鐘為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) //開(kāi)段碼
    {
        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++);   //上電延時(shí)
  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++);   //延時(shí)

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

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

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

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

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

這里的代碼與上期代碼不同,我們使用官方標(biāo)準(zhǔn)庫(kù)來(lái)重新編寫(xiě)。其中數(shù)碼管的動(dòng)態(tài)掃描沒(méi)有使用滴答時(shí)鐘,而是在主程序中直接用延時(shí)來(lái)完成。區(qū)別于之前的代碼,我們?cè)黾恿霜?dú)立看門(mén)狗的功能??撮T(mén)狗的喂狗操作在MAIN函數(shù)的大循環(huán)里,數(shù)碼管的動(dòng)態(tài)掃描中實(shí)現(xiàn)。

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

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

除了看門(mén)狗復(fù)位,還有一種軟件復(fù)位方式。當(dāng)MCU發(fā)生硬件失效時(shí),會(huì)進(jìn)入Hardfault中數(shù)函數(shù)。Hardfault是優(yōu)先級(jí)別為-1的固定類型中斷,無(wú)需初始化設(shè)置。常常在MCU死機(jī)時(shí),不知明的會(huì)進(jìn)入Hardfault中斷。因此,在Hardfault中斷函數(shù)中,添加軟件復(fù)位功能也是一種防死機(jī)現(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)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17918

    瀏覽量

    362764
  • 看門(mén)狗
    +關(guān)注

    關(guān)注

    10

    文章

    581

    瀏覽量

    71673
  • STM32
    +關(guān)注

    關(guān)注

    2291

    文章

    11022

    瀏覽量

    363481
  • 時(shí)鐘
    +關(guān)注

    關(guān)注

    11

    文章

    1891

    瀏覽量

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

    關(guān)注

    4

    文章

    325

    瀏覽量

    35119
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    看門(mén)狗VS打狗棒”,誰(shuí)誰(shuí)負(fù)?(CW32)——MCU抗干擾實(shí)驗(yàn)系列專題(4)

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

    STM32中的獨(dú)立看門(mén)狗和窗口看門(mén)狗是什么

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

    MCU獨(dú)立看門(mén)狗和窗口看門(mén)狗的區(qū)別

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

    關(guān)于獨(dú)立看門(mén)狗的一點(diǎn)經(jīng)驗(yàn)

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

    什么是stm32看門(mén)狗?獨(dú)立看門(mén)狗和窗口看門(mén)狗工作原理解析

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

    STM32看門(mén)狗配置(獨(dú)立看門(mén)狗IWDG和窗口看門(mén)狗WWDG)

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

    獨(dú)立看門(mén)狗實(shí)驗(yàn)-IWDG-M3

    關(guān)于STM32獨(dú)立看門(mén)狗實(shí)驗(yàn)文檔
    發(fā)表于 11-27 15:30 ?3次下載

    MCU獨(dú)立看門(mén)狗與窗口看門(mén)狗的區(qū)別

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

    MCU獨(dú)立看門(mén)狗與窗口看門(mén)狗的區(qū)別

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

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

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

    STM32學(xué)習(xí)心得十六:獨(dú)立看門(mén)狗實(shí)驗(yàn)

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

    STM32:獨(dú)立看門(mén)狗、窗口看門(mén)狗的配置

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

    STM32中的獨(dú)立看門(mén)狗和窗口看門(mén)狗

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

    STM32中的獨(dú)立看門(mén)狗和窗口看門(mén)狗

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