混合信號(hào)嵌入式設(shè)計(jì)實(shí)驗(yàn)指南-數(shù)字實(shí)驗(yàn)之:實(shí)驗(yàn)2—中斷
下面給出了代碼的例子(也可用于Lab2C)
#include m8c.h> // part specific constants and macros
#include PSoCAPI.h // PSoC API definitions for all User Modules
extern unsigned char bShadow=0; void main(void)
{
PRT1DR=0;
INT_MSK0|=0x40;
M8C_EnableGInt;
while(1)
{
M8C_Sleep; //sleep commandbShadow++; PRT1DR=bShadow;
}
}
1.2.4 實(shí)驗(yàn)2D—匯編器中斷服務(wù)例程
步驟1:創(chuàng)建新的工程。?復(fù)制Lab2C,將其命名為L(zhǎng)ab2D。
所有參數(shù)和跳線連接保持一樣。重新生成應(yīng)用。
步驟2:修改代碼。創(chuàng)建新的名字為SleepTimerRoutines.asm 的匯編文件。打開該文件,并按照?qǐng)D1.16 所示添加代碼。
圖1.16 SleepTimer 中斷服務(wù)程序
需要注意這個(gè)工程中的一些條目:
保存累加器的值,以后從堆棧中恢復(fù)。中斷硬件只保護(hù)程序計(jì)數(shù)器和標(biāo)志寄存器,這是一個(gè)中斷服務(wù)程序的最小要求。其他主程序使用的寄存器也需要保護(hù)。這通常是通過將它們暫存在堆棧中實(shí)現(xiàn)的。
bShadow 是一個(gè)在main.c 中聲明的全局變量。當(dāng)使用匯編語(yǔ)言時(shí),必須在這個(gè)變量前加一個(gè)下劃線。反之,任何一個(gè)在匯編文件中定義的全局變量,必須以下劃線開頭,為了讓C 例程能找到它。
例程以reti 結(jié)尾。—打開boot.asm 文件,在休眠定時(shí)器向量位置放置如下代碼:ljmp SleepTimerISR 練習(xí)2D-1 :這個(gè)指令要求多少個(gè)字節(jié)?
重新生成工程。
打開boot.asm ,并且驗(yàn)證剛才輸入的代碼消失了,這是因?yàn)楫?dāng)每次重新生成工程時(shí),每次都重寫boot.asm 。對(duì)于這個(gè)地方的代碼,必須輸入到用于生成boot.asm 的模板文件。
打開boot.tpl ,將下面的代碼放到休眠定時(shí)器向量位置。
ljmp SleepTimerISR
重新生成工程。
打開boot.asm ,驗(yàn)證代碼現(xiàn)在駐留在正確的向量位置。
打開main.c 文件,刪除控制循環(huán)內(nèi)的所有代碼。程序始終處于這個(gè)循環(huán),一直等到在休眠定時(shí)器中斷服務(wù)程序中為休眠定時(shí)器服務(wù)為止。
重新建立工程,下載到Eval1 板子,并運(yùn)行。
像前面一樣驗(yàn)證程序。
1.2.5 實(shí)驗(yàn)2E—C 語(yǔ)言中斷服務(wù)例程
步驟1:創(chuàng)建新的工程。
復(fù)制Lab2D,將其命名為L(zhǎng)ab2E。
所有參數(shù)和跳線連接保持一樣。
重新生成應(yīng)用。
步驟2:修改代碼。
刪除名字為SleepTimerRoutines.asm 的匯編文件。
打開main.c 文件,并按照?qǐng)D1.17 所示添加代碼。
圖1.17 Lab2C 控制軟件
需要注意這個(gè)工程中的一些條目:
Pragma 允許一個(gè)函數(shù)被用做一個(gè)中斷句柄。編譯器將自動(dòng)添加必要的代碼來(lái)保護(hù)它所使用的任何寄存器。它被用做一個(gè)也添加reti。?當(dāng)然,這樣一個(gè)函數(shù)不能接受參數(shù)和返回一個(gè)結(jié)果。
練習(xí)2E-1:為什么?
將必要的代碼添加到該函數(shù)中,實(shí)現(xiàn)前面的匯編中斷服務(wù)程序。打開boot.tpl ,轉(zhuǎn)到休眠定時(shí)器向量,在SleepTimerISR 前面添加下劃線。注意:對(duì)于在C 中聲明的函數(shù)和變量,添加下劃線。如果在C 中聲明了一個(gè)變量
CVar ,則在匯編例程中作為_iCVar 使用,在C 中作為iCVar 使用。如果_iAsmVar 在匯編語(yǔ)言中聲明為一個(gè)變量,則它在匯編例程中作為_iASmVar 使用,在C 例程中作為iCVar 使用。iAsmVar 是一個(gè)在匯編語(yǔ)言中聲明的變量,它可以在匯編例程中作為iASmVar 使用,但在C 中不可使用。
重新生成應(yīng)用,重新建立工程,下載到Eval1 板子,運(yùn)行;像前面一樣驗(yàn)證程序。
評(píng)論