禁止中斷
進入停機模式
中斷返回
等待中斷
軟體中斷
如使用中斷函式時,可以通過在上圖中查詢相對應的中斷向量號,而中斷函式的名字可以自定義
/* 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 ...