<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > stm32 窗口看門狗 wwdg與獨(dú)立看門狗iwdg的配置運(yùn)用

          stm32 窗口看門狗 wwdg與獨(dú)立看門狗iwdg的配置運(yùn)用

          作者: 時間:2016-11-27 來源:網(wǎng)絡(luò) 收藏
          STM32筆記之十二:時鐘不息工作不止,systic時鐘應(yīng)用

          a) 目的:使用系統(tǒng)時鐘來進(jìn)行兩項(xiàng)實(shí)驗(yàn)——周期執(zhí)行代碼與精確定時延遲。

          本文引用地址:http://www.ex-cimer.com/article/201611/322485.htm

          b) 初始化函數(shù)定義:

          void SysTick_Configuration(void);

          c) 初始化函數(shù)調(diào)用:

          SysTick_Configuration();

          d) 初始化函數(shù):

          void SysTick_Configuration(void)

          {

          SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//時鐘除8

          SysTick_SetReload(250000); //計數(shù)周期長度

          SysTick_CounterCmd(SysTick_Counter_Enable); //啟動計時器

          SysTick_ITConfig(ENABLE); //打開中斷

          }

          e) 在NVIC的初始化函數(shù)里面增加以下代碼打開相關(guān)中斷:

          NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 1, 0);//中斷等級設(shè)置,一般設(shè)置的高一些會少受其他影響

          f) 在stm32f10x_it.c文件中找到void SysTickHandler 函數(shù)

          void SysTickHandler(void)

          {

          執(zhí)行代碼

          }

          g) 簡單應(yīng)用:精確延遲函數(shù),因?yàn)閟ystic中斷往往被用來執(zhí)行周期循環(huán)代碼,所以一些例程中使用其中斷的啟動和禁止來編寫的精確延時函數(shù)實(shí)際上不實(shí)用,我自己編寫了精確計時函數(shù)反而代碼更精簡,思路更簡單。思路是調(diào)用后,變量清零,然后使用時鐘來的曾變量,不斷比較變量與延遲的數(shù)值,相等則退出函數(shù)。代碼和步驟如下:

          i. 定義通用變量:u16 Tic_Val=0; //變量用于精確計時

          ii. 在stm32f10x_it.c文件中相應(yīng)定義:

          extern u16 Tic_Val;//在本文件引用MAIN.c定義的精確計時變量

          iii. 定義函數(shù)名稱:void Tic_Delay(u16 Tic_Count);//精確延遲函數(shù)

          iv. 精確延時函數(shù):

          void Tic_Delay(u16 Tic_Count) //精確延時函數(shù)

          { Tic_Val=0; //變量清零

          while(Tic_Val != Tic_Count){printf("");}//計時

          }

          v. 在stm32f10x_it.c文件中void SysTickHandler 函數(shù)里面添加

          Tic_Val++;//變量遞增

          vi. 調(diào)用代碼:Tic_Delay(10); //精確延時

          vii. 疑問:如果去掉計時行那個沒用的printf("");函數(shù)將停止工作,這個現(xiàn)象很奇怪

          C語言功底問題。是的,那個“注意事項(xiàng)”最后的疑問的原因就是這個

          Tic_Val應(yīng)該改為vu16

          while(Tic_Val != Tic_Count){printf("");}//計時

          就可以改為:

          while(Tic_Val != Tic_Count); //檢查變量是否計數(shù)到位

          STM32筆記之十三:惡搞,兩只看門狗

          a) 目的:

          了解兩種看門狗(我叫它:系統(tǒng)運(yùn)行故障探測器和獨(dú)立系統(tǒng)故障探測器,新手往往被這個并不形象的象形名稱搞糊涂)之間的區(qū)別和基本用法。

          b) 相同:

          都是用來探測系統(tǒng)故障,通過編寫代碼定時發(fā)送故障清零信號(高手們都管這個代碼叫做“喂狗”),告訴它系統(tǒng)運(yùn)行正常。一旦系統(tǒng)故障,程序清零代碼(“喂狗”)無法執(zhí)行,其計數(shù)器就會計數(shù)不止,直到記到零并發(fā)生故障中斷(狗餓了開始叫喚),控制CPU重啟整個系統(tǒng)(不行啦,開始咬人了,快跑……)。

          c) 區(qū)別:

          獨(dú)立看門狗Iwdg——我的理解是獨(dú)立于系統(tǒng)之外,因?yàn)橛歇?dú)立時鐘,所以不受系統(tǒng)影響的系統(tǒng)故障探測器。(這條狗是借來的,見誰偷懶它都咬!)主要用于監(jiān)視硬件錯誤。

          窗口看門狗wwdg——我的理解是系統(tǒng)內(nèi)部的故障探測器,時鐘與系統(tǒng)相同。如果系統(tǒng)時鐘不走了,這個狗也就失去作用了。(這條狗是老板娘養(yǎng)的,老板不干活兒他不管?。┲饕糜诒O(jiān)視軟件錯誤。

          d) 初始化函數(shù)定義:鑒于兩只狗作用差不多,使用過程也差不多初始化函數(shù)栓一起了,用的時候根據(jù)情況刪減。

          void WDG_Configuration(void);

          e) 初始化函數(shù)調(diào)用:

          WDG_Configuration();

          f) 初始化函數(shù)

          void WDG_Configuration() //看門狗初始化

          {

          //軟件看門狗初始化

          WWDG_SetPrescaler(WWDG_Prescaler_8); //時鐘8分頻4ms

          // (PCLK1/4096)/8= 244 Hz (~4 ms)

          WWDG_SetWindowValue(65); //計數(shù)器數(shù)值

          WWDG_Enable(127); //啟動計數(shù)器,設(shè)置喂狗時間

          // WWDG timeout = ~4 ms * 64 = 262 ms

          WWDG_ClearFlag(); //清除標(biāo)志位

          WWDG_EnableIT(); //啟動中斷

          //獨(dú)立看門狗初始化

          IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//啟動寄存器讀寫

          IWDG_SetPrescaler(IWDG_Prescaler_32);//40K時鐘32分頻

          IWDG_SetReload(349); //計數(shù)器數(shù)值

          IWDG_ReloadCounter(); //重啟計數(shù)器

          IWDG_Enable(); //啟動看門狗

          }

          g) RCC初始化:只有軟件看門狗需要時鐘初始化,獨(dú)立看門狗有自己的時鐘不需要但是需要systic工作相關(guān)設(shè)置。

          RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);

          h) 獨(dú)立看門狗使用systic的中斷來喂狗,所以添加systic的中斷打開代碼就行了。軟件看門狗需要在NVIC打開中斷添加如下代碼:

          NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQChannel; //通道

          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //占先中斷等級

          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //響應(yīng)中斷優(yōu)先級

          NVIC_Init(&NVIC_InitStructure); //打開中斷

          i) 中斷程序,軟件看門狗在自己的中斷中喂狗,獨(dú)立看門狗需要使用systic的定時中斷來喂狗。以下兩個程序都在stm32f10x_it.c文件中。

          void WWDG_IRQHandler(void)

          {

          WWDG_SetCounter(0x7F); //更新計數(shù)值

          WWDG_ClearFlag(); //清除標(biāo)志位

          }

          void SysTickHandler(void)

          {IWDG_ReloadCounter(); //重啟計數(shù)器(喂狗)

          }

          j) 注意事項(xiàng):

          i. 有狗平常沒事情可以不理,但是千萬別忘了喂它,否則死都不知道怎么死的!

          ii. 初始化程序的調(diào)用一定要在systic的初始化之后。

          iii. 獨(dú)立看門狗需要systic中斷來喂,但是systic做別的用處不能只做這件事,所以我寫了如下幾句代碼,可以不影響systic的其他應(yīng)用,其他systic周期代碼也可參考:

          第一步:在stm32f10x_it.c中定義變量

          int Tic_IWDG; //喂狗循環(huán)程序的頻率判斷變量

          第二步:將SysTickHandler中喂狗代碼改為下面:

          Tic_IWDG++; //變量遞增

          if(Tic_IWDG>=100) //每100個systic周期喂狗

          {IWDG_ReloadCounter();//重啟計數(shù)器(喂狗)

          Tic_IWDG=0; //變量清零

          }



          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();