STM32F10x 學(xué)習(xí)筆記7(獨立看門狗IWDG 模塊)
簡單的說,STM32中的IWDG其核心就是一個12bits的向下遞減的計數(shù)器,當(dāng)計數(shù)器計數(shù)到零時就會觸發(fā)系統(tǒng)復(fù)位。因此,要在每次計數(shù)到零之前將其復(fù)位到一個初始值。這個初始值就在重裝載寄存器(IWDG_RLR)中存放,其默認值為0xFFF,我們也可以將其改為其他值。
計數(shù)器的時鐘由LSI時鐘經(jīng)過分頻后提供,預(yù)分頻因子由預(yù)分頻寄存器(IWDG_PR)的值來確定。具體的說IWDG_PR寄存器只有最低的3位是有效的,其他高位永遠都為0,這最低的3位就決定了預(yù)分頻因子,這3位的值與預(yù)分頻因子的關(guān)系如下。
- 000:預(yù)分頻因子=4
- 100:預(yù)分頻因子=64
- 001:預(yù)分頻因子=8
- 101:預(yù)分頻因子=128
- 010:預(yù)分頻因子=16
- 110:預(yù)分頻因子=256
- 011:預(yù)分頻因子=32
- 111:預(yù)分頻因子=256
除了上面介紹的兩個寄存器,IWDG還有另外兩個寄存器,合起來共四個寄存器,分別是:
鍵寄存器(IWDG_KR)
預(yù)分頻寄存器(IWDG_PR)
重裝載寄存器(IWDG_RLR)
狀態(tài)寄存器(IWDG_SR)
所謂鍵寄存器(IWDG_KR),可以認為就是個控制寄存器,開啟看門狗,喂狗需要操作鍵寄存器,修改其他寄存器值也需要先操作鍵寄存器(IWDG_KR)。
開啟看門狗
向鍵寄存器(IWDG_KR)寫入0xCCCC,啟動看門狗工作。IWDG一旦啟動了就不會停止,除非掐斷單片機的供電。
- IWDG->KR=0xCCCC;
STM32F10x_StdPeriph_Driver提供了如下函數(shù)。
- voidIWDG_Enable(void);
喂狗
向鍵寄存器(IWDG_KR)寫入0xAAAA,這時計數(shù)器的值會復(fù)位為重裝載寄存器(IWDG_RLR)的值。
否則,當(dāng)計數(shù)器為0時,看門狗會產(chǎn)生復(fù)位。
- IWDG->KR=0xAAAA;
STM32F10x_StdPeriph_Driver提供了如下函數(shù)。
- voidIWDG_ReloadCounter(void);
修改預(yù)分頻因子
向鍵寄存器(IWDG_KR)寫入0x5555,向預(yù)分頻寄存器(IWDG_PR)寫入新值。
注意這兩步之間不能有其他的對IWDG的操作。
- IWDG->KR=0x5555;
- IWDG->PR=value;
利用STM32F10x_StdPeriph_Driver則需要如下調(diào)用兩個函數(shù)。
- IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
- IWDG_SetPrescaler(value);
修改重裝載寄存器的值
向鍵寄存器(IWDG_KR)寫入0x5555,向重裝載寄存器(IWDG_RLR)寫入新值。
注意這兩步之間不能有其他的對IWDG的操作。
- IWDG->KR=0x5555;
- IWDG->RLR=value;
利用STM32F10x_StdPeriph_Driver則需要如下調(diào)用兩個函數(shù)。
- IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
- IWDG_SetReload(value);
預(yù)分頻寄存器、重裝載寄存器與看門狗超時時間的關(guān)系如下表所示。
上面的介紹都沒有涉及到狀態(tài)寄存器(IWDG_SR)。這個寄存器不太常用,需要了解的可以參閱STM32參考手冊。
另外,當(dāng)用調(diào)試器調(diào)試代碼時,我們希望在產(chǎn)生斷點時,計數(shù)器能夠停止計數(shù)。這可以通過設(shè)置DBGMCU_CR的第8位(DBG_IWDG_STOP位)來實現(xiàn)。
0:看門狗計數(shù)器仍然正常工作;
1:看門狗計數(shù)器停止工作。
操作代碼如下:
- DBGMCU->CR|=0x100;
STM32F10x_StdPeriph_Driver中也提供了相應(yīng)的操作函數(shù):
- DBGMCU_Config(DBGMCU_IWDG_STOP,ENABLE);
評論