關於S12的中斷例程

2021-04-30 11:33:32 字數 1972 閱讀 2930

學習s12的朋友可以和我一起**!

mc9sdg128b的中斷程式設計主要有兩種方式:

第一種是使用符號「trap_proc」,trap_proc 提示編譯器下面的函式是中斷服務例程。編譯器會用乙個特殊的中斷返回指令來結束這個函式(對大多數處理器來說,一般是rti指令).

第二種是使用「interrupt」關鍵字,「interrupt」關鍵字是乙個非標準ansi-c的關鍵字,因此,它不能被所有ansi-c編譯器廠商所支援。同樣,對不同的編譯器,「interrupt」關鍵字的用法可能會改變。「interrupt」關鍵字同樣會提示編譯器下面的函式是乙個中斷服務例程。

一旦中斷服務函式寫好了,你必須把中斷服務例程和中斷向量表聯絡起來,這通過初始化中斷向量表來實現,你可以通過下面兩種方法來初始化中斷向量表:

第一種是在prm檔案中,使用「vector address」或「vector」命令。聯結器提供兩個命令來初始化中斷向量表:vector address 或 vector,你使用vector address 命令中斷服務例程的位址寫到中斷向量表裡。

第二種是使用「interrupt」關鍵字,在你寫中斷服務例程的時候,你可以在ansi-c原始檔裡直接把中斷服務例程和特殊的中斷號聯絡起來.

下面是我寫的mc9sdg128b的16位自由定時器溢位中斷處理程式,已除錯通過:

#include /* common defines and macros */

#include /* derivative information */

#pragma link_info derivative "mc9s12dg128b"

int intcount = 0;

void timer_init(void)

tscr2_pr0 = 1; //prescale factor is 128

tscr2_pr1 = 1;

tscr2_pr2 = 1;

tscr2_toi = 1; //overflow enable

t***2_tof = 1;

tscr1_ten = 1; //timer enable

}#pragma code_seg non_banked

interrupt 16 void timer_interrupt_handle(void)

;#pragma code_seg default

void main(void)

}以下是採用trap_proc符號編寫的中斷服務程式:

#include /* common defines and macros */

#include /* derivative information */

#pragma link_info derivative "mc9s12dg128b"

int intcount = 0;

void timer_init(void)

#pragma code_seg non_banked

#pragma trap_proc

void timer_interrupt_handle(void)

;#pragma code_seg default

void main(void)

}中斷服務程式編寫完後你需要在.prm檔案裡新增如下一句:

vector 16 timer_interrupt_handle

這樣中斷服務程式才和相應的中斷號聯絡起來。這個程式也已經除錯通過。

中斷服務例程必須被定位於non-banked 區域,通過使用「#pragma code_seg non_banked」可以把中斷例程定位於non-banked 區域。同時你必須確保「sectionnon_banked」不能出現在.prm檔案中。在中斷服務例程的末尾你需要新增「#pragma code_seg default」,否則的話,後面的函式也會被定位在「non-banked」區域。

所以說我們的中斷服務例程必須被「#pragma code_seg non_banked」和「#pragma code_seg default」包圍起來。

mc9s12xdp512的中斷程式設計

中斷在c語言裡面有兩種方式表達 1 interrupt void rti isr void same as pragma trap proc,set the entry number in the prm file這種方式定義了中斷的結構,實際的向量位址在prm檔案中定義 2 void interr...

關於AT91SAM7S64的PIOA中斷觸發問題!

這是實驗 void irq key isr handler void else if 1 16 at91c pioa pdsr else if 1 20 at91c pioa pdsr else if 1 23 at91c pioa pdsr at91c aic eoicr 1 void keyir...

MC9S12G定時器中斷設定

一 關閉定時器模組 時tscr1的ten位為0 二 設定iosx為輸出比較引腳 以7為例 tios ios7 1 三 繫結輸出比較引腳 tctl1 om7 0 tctl1 ol7 1 四 設定計數器的比較值 在24mhz的系統時間下,0xbb為1ms 中斷週期 0x4926 128 24mhz 10...