STM8S 外部中斷應用之長按鍵識別

2021-07-03 23:31:40 字數 3269 閱讀 7981

禁止中斷

進入停機模式

中斷返回

等待中斷

軟體中斷

如使用中斷函式時,可以通過在上圖中查詢相對應的中斷向量號,而中斷函式的名字可以自定義

/*  basic interrupt vector table for stm8 devices

*/typedef

void

@far (*interrupt_handler_t)(void);

struct interrupt_vector ;

@far

@interrupt

void nonhandledinterrupt (void)

extern

void _stext(); /* startup routine */

extern

@far

@interrupt

void exti2_hand_fun(void);

extern

@far

@interrupt

void tim1_upd_ovf_trg_brk_irqhandler(void);

struct interrupt_vector const _vectab = , /* reset */

, /* trap */

, /* irq0 */

, /* irq1 */

, /* irq2 */

, /* irq3 */

, /* irq4 */

, /* irq5 */

, /* irq6 */

, /* irq7 */

, /* irq8 */

, /* irq9 */

, /* irq10 */

, /* irq11 */

, /* irq12 */

, /* irq13 */

, /* irq14 */

, /* irq15 */

, /* irq16 */

, /* irq17 */

, /* irq18 */

, /* irq19 */

, /* irq20 */

, /* irq21 */

, /* irq22 */

, /* irq23 */

, /* irq24 */

, /* irq25 */

, /* irq26 */

, /* irq27 */

, /* irq28 */

, /* irq29 */

};

stm8s為外部中斷事件專門分配了五個中斷向量:

pd7是最高優先順序的中斷源(tli);

這裡選用exti2(埠c外部中斷)。那麼需要將中斷促發的io(pc5)設定為上拉輸入或中斷上拉輸入,懸浮輸入的話很容易受干擾。

/*pc5設定為上拉輸入*/

void init_exti2_gpio(void)

cpu cc暫存器中斷位:
i1 i0不能直接寫,只能通過開中斷或關中斷來寫,上電預設是11;當用指令開中斷時( _asm(「rim\n」);),為00;當發生中斷時,由當前中斷(itc_sprx)載入i[1:0],主要用於做中斷優先順序;退出中斷自動清0;因此在寫exti_cr1,需將itc_sprx配置成11,或加入禁中斷指令 。

exti_cr1:
配置促發方式;

#include

char keyflag;

char keypressstatus = 1;

unsigned

int keycount;

/*output pin*/

_bool pd2 @pd_odr:2;

_bool pc7 @pc_odr:7;

_bool pc6 @pc_odr:6;

_bool pc3 @pc_odr:3;

/*input pin*/

_bool pc5 @pc_idr:5;

/*電量指示燈*/

#define led1 pd2

#define led2 pc7

#define led3 pc6

#define led4 pc3

/*按鍵*/

#define key pc5

/*主時鐘頻率為8mhz*/

void init_clk(void)

void init_led(void)

/*pc5設定為上拉輸入*/

void init_exti2_gpio(void)

void init_exti2(void)

void init_tim1(void)

unsigned

int key_scan_test(void)

else

/*10ms * 150 = 1.5s*/

if(count >= 150)keymode = 2; //長按

else

if(count >= 4)keymode = 1; //短按

else keymode = 0; //抖動

return keymode;

}main()

}@far @interrupt void exti2_hand_fun(void)

@far @interrupt void tim1_upd_ovf_trg_brk_irqhandler(void)

/*within key press hand*/

if(1 == keyflag)

}

注意:

中斷向量需宣告,在stm8_interrupt_vector.c中加入:

extern @far @interrupt void exti2_hand_fun(void);

extern @far @interrupt void tim1_upd_ovf_trg_brk_irqhandler(void);

, /* irq5 */

, /* irq11 */

另參見不用外部中斷長按鍵識別:不用外部中斷識別長按鍵

STM8S 長按鍵識別

最近學習開發stm8s003 mcu,剛入手這顆mcu,對很多功能不太了解,只能一邊開發學習,記錄一下學習過程。目前,需要實現key1按鍵長按3s進行關機,linux下直接獲取按鍵的開始時間戳和結束時間戳,可以直接確定按鍵的觸發時間,目前mcu採用的是按鍵中斷的方式,在中斷觸發後直接進入進入中斷函式...

stm8s定時中斷

stm8s定時器有高階定時器tim1,通用定時器tim2,tim3,tim5,以及基本定時器tim4,tim6。定時中斷配置基本一樣。需要注意的也就是分頻不同,定時器位數不同。16位定時器配置後面再說,這裡以基本定時器tim4為例,產生2ms中斷,配置如下 tim4 ier uie 1 使能tim4...

STM8S 串列埠應用 UART2 STM8S105

少說話。多做事,下面是我驗證過沒有問題的串列埠傳送接受資料 使用mcu stm8s105c6 uart2 初始化時呼叫 gpio deinit gpiod configure pd5 6 gpio init gpiod,gpio pin 5,gpio mode in pu no it 傳送資料io ...