一、寄存器開發方式
1)以定時器TIM4為例,首先對TIM4的相關寄存器進行初始化,打開TIM4的中斷,注意在STVD+COSMIC的開發環境下,開總中斷使用語句_asm("rim");
void TIM4_init(void) //TIM4 init { TIM4_CR1=0x80; TIM4_PSCR=0x07; //clock div : 128 (T=8us) TIM4_ARR=125; //interrupt per 1ms TIM4_IER=0x01; //enable update interrupt _asm("rim"); //enable EA TIM4_EGR=0x01; //update case TIM4_CR1|=0x01; //enable count }
2)接下來編寫TIM4的中斷服務程序,可以直接寫在main.c中,注意函數前一定要加@far @interrupt,中斷服務函數的名稱可以自己取,比如此處的TIM4_Interrupt;
@far @interrupt void TIM4_Interrupt(void) { TIM4_SR&=0xfe; cnt_num4++; if(cnt_num4>10) { cnt_num4=0; flag_adc=1; } }
3)接下來在stm8_interrupt_vector.c文件中對中斷函數進行聲明,並修改中斷向量表中對應的中斷服務函數名稱為我們定義的名稱,如TIM4_Interrupt為中斷向量的第23個;
extern void _stext(); /* startup routine */ extern @far @interrupt void TIM4_Interrupt(void);
{0x82, NonHandledInterrupt}, /* irq21 */ {0x82, NonHandledInterrupt}, /* irq22 */ {0x82, TIM4_Interrupt}, /* irq23 */ {0x82, NonHandledInterrupt}, /* irq24 */ {0x82, NonHandledInterrupt}, /* irq25 */
二、庫函數開發方式
1)以外部中斷為例,可用按鍵觸發,首先初始化對應引腳,開啟外部中斷和總中斷,開總中斷使用語句_asm("rim");
void main(void) { CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); GPIO_Init(GPIOA,GPIO_PIN_3,GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init(GPIOA,GPIO_PIN_2,GPIO_MODE_IN_PU_IT); EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOA,EXTI_SENSITIVITY_FALL_ONLY); _asm("rim"); /* Infinite loop */ while (1) { ; } }
2)接下來在stm8s_it.c文件中,找到對應中斷向量的中斷服務程序,在里面添加代碼即可;
/** * @brief External Interrupt PORTA Interrupt routine. * @param None * @retval None */ INTERRUPT_HANDLER(EXTI_PORTA_IRQHandler, 3) { /* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction. */ GPIO_WriteReverse(GPIOA,GPIO_PIN_3); }