winbond reset status

Posted by: 邱小新 at 上午10:08 in ,

記錄一下系統開機或是被 reset 時的一些旗標狀態。

旗標狀態

resetWTRFPOREWTWDCON判斷
power-on reset01001000000bPOR=1
external resetxxx0x0x0xx0bEWT=1*
POR=0#
watchdog reset1xx0x0x01x0bWTRF=1

註解

  1. x: 保留原值,不會變更。
  2. *: 系統如果有開啟 watchdog 功能,在發生 external reset 時,EWT 一定是 1。
  3. #: 一開機時 POR=1,此時把 POR 設成 0,下次發生 external reset 時,POR 一定是 0,以此來區分。適合沒有開啟 watchdog 功能的系統。

判斷順序

  1. 開啟 watchdog: WTRF=1(watchdog) -> EWT=1(external) -> POR=1(power-on)。
  2. 關閉 watchdog: POR=1(power-on) -> POR=0(external),watchdog 不用判斷。

reset 開機狀態

  1. Program Counter 強制跳回 0000h,也就是從頭開始執行。
  2. SFR 都會返回 reset value,datasheet 有一張表。
  3. stack point 會變成 07h。
  4. Vdd 小於 2V 時,RAM 資料會遺失;反之則會保存。

好用的 STATUS register

Posted by: 邱小新 at 上午10:47 in

以往在寫 uart 的 putchar 函數時,都是用下列方式來寫。在初始化時還要先把 TI 設成 1。但是如此會造成 ES 中斷一直發生。只適合沒有開啟 ES 中斷程序來用。

void putchar(char value) { while (!TI); TI = 0; SBUF = value; }

若是改用下列方式來寫,初始化時不用把 TI 設成 1,ES 中斷就不會一直發生。但是如此會被 block,等到傳送完才繼續其它工作,對效能來說不是很好。適合需要開啟 ES 中斷程序來用。

void putchar(char value) { SBUF = value; while (!TI); TI = 0; }

W77E352 有一個 register 叫 STATUS(0xC5),它的 SPTA0 位元為 uart 傳送忙碌指標,當 TI 為 1 時,自動清成 0。在 W79E632 也有 STATUS register,但是卻沒有 SPTA0 位元,不知是否可用?

void putchar(char value) { while (STATUS & SPTA0); SBUF = value; } void uart_isr(void) interrupt (4) { if (TI) TI = 0; }