基于S3C6410的ARM11學習(五) 核心初始化之關閉看門狗
之前已經(jīng)完成了設置中斷向量表和設置處理器模式。下一步,就是要關閉看門狗。
看門狗,這個東西,在嵌入式系統(tǒng)里面是很常見的一個東西。這個是芯片預先做好的硬件,軟件可以對硬件進行配置。說白了,這個東西就是一個定時器,定時器溢出的時候,如果設置開啟看門狗的話,就會強制CPU復位。這樣,好處就是防止程序跑飛。因為程序正常執(zhí)行的時候,我們肯定是要對看門狗計數(shù)清零的,這樣才能保證看門狗不會溢出,不會使CPU復位。
S3C6410的看門狗有兩個功能:
作為常規(guī)定時器,并且可以產(chǎn)生中斷
作為看門狗定時器,當計數(shù)器遞減為0,產(chǎn)生復位信號。
下面是看門狗的框圖
看門狗的時鐘從PCLK來,然后經(jīng)過一個預分頻器,這個預分頻器的分頻是可以通過寄存器配置的。然后又到一個分頻器,一個選擇器選擇是哪一路的分頻有效。然后分頻后的時鐘到達看門狗的計數(shù)器,這個計數(shù)器是一個遞減的計數(shù)器。計數(shù)器的上面有一個設置初始值的寄存器。當看門狗沒有使能的時候,該初始值會載入到計數(shù)器中。
當計數(shù)器遞減為0的時候,會產(chǎn)生超時信號,如果開啟看門狗的中斷的話,就會產(chǎn)生中斷信號,否則不執(zhí)行任何操作。復位信號產(chǎn)生器接收這個超時信號,如果使能看門狗復位,就會產(chǎn)生一個復位信號,使CPU復位,沒有的話,不執(zhí)行任何操作。每次超時操作之后,看門狗會自動加載看門狗數(shù)據(jù)寄存器WTDAT到WTCNT中。
所以,如果關閉復位中斷,看門狗就是一個定時器了。
這里有兩個注意:
1、 一旦看門狗開啟了,WTDAT寄存器的值是不會自動載入到WTCNT寄存器中的。所以,要在開門狗打開之前,就要把值寫入到WTDAT中。
2、 在調試的時候,看門狗是關閉的。調試模式下,CPU有信號DBGACK會有效,這個時候看門狗的產(chǎn)生的復位就無效了
從這時候起,我們就要開始和寄存器打交道了。
下面是看門狗的對應四個寄存器。
表的第一列是寄存器的名字。
第二列是寄存器的地址,這個地址是很重要的,因為對于CPU來說,只能看到一堆地址,而不會知道這些地址對應什么功能。所以我們寫程序的時候,就要在正確的地址寫入值。這里,我們要向WTCON寄存器寫值的話,就必須要向地址0x7E004000寫值才行。如果向其他地址寫的話,就寫不到這個寄存器去。所以寫程序的時候,地址一定是要寫對的。
第三列是表示寄存器的操作權限,R/W表示可讀可寫,W表示可寫,讀的話,值是不確定的。R的話,就是只能讀,寫入是無效的。
第四列是寄存器的描述,描述該寄存器的功能是什么。
第五列是寄存器的復位默認值,有的寄存器是復位沒有默認值的。
第一個寄存器WTCON,看門狗控制寄存器。
表中說明了每一位的作用。我們寫程序,就是要根據(jù)表給的每一位的功能,去配置這個寄存器,以實現(xiàn)我們想要的功能。
如果是Reserved,就說明這一位沒有什么功能,就按照規(guī)定的配置就行,比如有的要求必須要求是0,那么我們寫程序配置的時候就一定要把這一位寫成0.
前面有一些位是配置時鐘源的,就是配置預分頻器和選擇哪一路分頻值。第5為是配置開啟和關閉看門狗的。第2位是有效還是無效中斷。最后一個就是有效還是無效看門狗的復位輸出。
所以,當我們要關閉看門狗的時候,就簡單了,直接把這個寄存器直接賦值為0。
下面是看門狗數(shù)據(jù)寄存器
這個寄存器是用來設置看門狗的計數(shù)初始值的。其實就相當于設置看門狗的溢出時間。但是要注意,這個寄存器在看門狗開啟前,是會自動載入到看門狗計數(shù)器寄存器WTCNT中的。一旦開始看門狗,是不會自動載入的,只有在看門狗超時了,才會自動載入到WTCNT中。
只有后16位有效。
下面是看門狗計數(shù)寄存器
這個寄存器就是保存計數(shù)時的值,這個寄存器可讀可寫,讀的話,就得到當前看門狗計數(shù)的值,寫的話,就直接改變這個值。在程序中,每隔一段時間就要對這個寄存器寫值,以保證這個寄存器不會遞減到0,因為遞減到0就產(chǎn)生復位了。
這個寄存器也是16位有效的。
下面是看門狗中斷清除寄存器
這個寄存器就是當看門狗中斷服務函數(shù)執(zhí)行完后,需要向這個寄存器寫入任何值對看門狗的中斷請求清零。并且這個寄存器是不能讀的。
可以看出,這個寄存器只有在看門狗作為定時器的時候有用的。
下面就是程序了,程序就非常簡單了。
前面就說了,就往WTCON寄存器里面寫0就行了。
以#號加空格開頭的,說明這是一個注釋語句
#define定義寄存器的地址。之前說過,寄存器的地址是很重要的,不能寫錯,這里,就用define來進行定義。
使用ldr偽指令,給r0賦值WTCON的地址0x7E004000。
使用mov指令,給r1寄存器賦值為0
使用str指令。將r1的數(shù)據(jù),寫入到r0指向的地址去,就是寫到0x7e004000去,最后跳轉。
這樣,就實現(xiàn)了開門狗的關閉了。
對比STM32,這里沒有看到完整的STM32的啟動代碼,有些代碼是看不到的,也不知道STM32是否也是在開始需要關閉看門狗的。不過應該是復位就默認為看門狗是關閉的。STM32的看門狗要稍微復雜一些,有兩個看門狗。這個等后面使用看門狗的時候再分析。