IAR+STM8——EXTI外部中斷控制寄存器
這塊三合一的開發(fā)板上有且只有一個按鍵,沒辦法,就拿這唯一的按鍵來用吧。吸取前面UART3的教訓(xùn),先看開發(fā)板的原理圖吧。這個按鍵被接到了STM8S207SB的PD7上,已做了上拉處理。為了簡單明了,還是點LED1吧。按一下LED1亮,再按一下LED1滅。好了,寫程序吧。
#i nclude
#define LED1_FLASH PD_ODR_ODR3 = !PD_ODR_ODR3 // 開發(fā)板上的LED1接在PD3上
void GPIO_init(void)
{
PD_DDR = 0x08; // 配置PD端口的方向寄存器PD3輸出
PD_CR1 = 0x08; // 設(shè)置PD3為推挽輸出
PD_CR2 = 0x80; // 使能PD7外部中斷
}
void EXTI_init(void)
{
EXTI_CR1 = 0x80; // PD口下降沿觸發(fā)中斷
}
#pragma vector=0x02 // 這里很關(guān)鍵!看下面說明。
__interrupt void EXTI_PD7_TLI(void)
{
LED1_FLASH;
}
void init_devices(void)
{
asm("sim"); // 關(guān)全局中斷
GPIO_init();
EXTI_init();
asm("rim"); // 開全局中斷
}
void main( void )
{
init_devices();
// 主循環(huán)里沒有程序需要執(zhí)行
while(1);
}
這里著重要說明的一點是PD7的外部中斷程序??戳艘幌滦酒謨?,PD口外部中斷EXTI3的中斷向量號是6,想當(dāng)然,又是想當(dāng)然,按IAR的規(guī)矩中斷向量要加2,就這樣寫#pragma vector=0x08,結(jié)果就是按下按鍵,程序沒響應(yīng)了,一直在中斷里不出來。接下來只能另想辦法,仔細(xì)翻了資料后發(fā)現(xiàn),PD7和PD其他端口不一樣,PD7后面拖了個小尾巴TLI,再看手冊上的TLI描述,乖乖,TLI擁有芯片最高級別中斷,享有獨(dú)立專用的中斷向量號0,這下就好辦了,按IAR的規(guī)矩,向量號加2,程序改成#pragma vector=0x02,重新來一遍編譯、下載、運(yùn)行,按鍵終于聽話了。