8 - 中断:EXTI外部中断

EXTI外部中断可用来应付那些“出现时机不确定”的事件。比如说,按键,摄像头的行场中断,测速编码器的输入等。
例如,设定A1引脚上升沿能触发EXIT中断,A1连接一个按钮,按钮按下那瞬间,A1产生上升沿,触发中断,进行按钮事件的处理。

K60

同样,K60使用野火的底层库,参考《三天入门 Cortex-M4》EXTI 外部 GPIO 中断例程。

初始化

函数原型

void exti_init(PORTx, u8 n,exti_cfg);

调用例子

void
exti_init(PORTA,17,rising_down);//下拉,上升沿触发中断


在实际小车的制作中,EXTI用于捕捉摄像头的场中断信号;

/**************************************
* 摄像头初始化函数
*  函数名称:cam_init
*  功能说明:初始化摄像头场行中断,初始化摄像头DMA传输
*  参数说明:
*  函数返回:无
*  修改时间:2014-3-29
*  备    注:
****************************************/


void cam_init()
{
    exti_init(CAM_PORTX,CAM_HR_CHn,rising_down);                //行中断,初始化外部中断输入捕捉模式,上升沿触发
    exti_init(CAM_PORTX,CAM_VS_CHn,falling_down);               //场中断,初始化外部中断输入捕捉模式,下降沿触发
    // Do other initialization.
}

中断处理

中断重定向

// isr.h

#undef  VECTOR_104
#define VECTOR_104 PORTB_IRQHandler       //PORTB 中断
extern void PORTB_IRQHandler();           //PORTB 中断服务函数
// isr.c

void PORTB_IRQHandler()
{
      u32 tmpISFR = 0;
     tmpISFR=PORTB_ISFR;
     PORTB_ISFR |= 0xFFFFFFFF; //清除标志
     
     if((tmpISFR & (1<<3)))   //PB3 触发中断  行中断
     {
         // Do sth.
      }

}

XS128

详细参考 Chapter 16 Timer Module (TIM16B8CV2) Block Description, MC9S12XS256 Reference Manual.

初始化

TIM模块使能,Timer System Control Register 1 (TSCR1),TEN=1.
TSCR1

TSCR1=0x80;         //TIMER 定时器使能

设置Timer Prescale, Timer System Control Register 2 (TSCR2).
Timer Prescale是预分频,时间先经过这里分频,再经过后续分频后使用。这里设为Bus Clock / 64.
TSCR2
PR210

TSCR2 = 0x06;       // Timer Prescale.

Timer Input Capture/Output Compare Select (TIOS),设置为0,表示输入捕捉。

TIOS =0x00;

Timer Control Register 3/Timer Control Register 4 (TCTL3 and TCTL4).
设置对应管脚的捕获配置。00为不捕捉,01为上升沿,10为下降沿,11为上升沿或下降沿。
TCTL3

TCTL3 = 0x00;
TCTL4 = 0x09; // 0通道上升沿,1通道下降沿;

中断处理

Troubleshooting

1. 按键无反应
检查是否已正确初始化按键;
检查中断是否已开启;
清除中断标志了没?
中断处理没跑进死循环吧?

2. 按键抖动
不妨加入几毫秒的延时。