硬件中断
初始化
static void EXTI_config() {
uint32_t extix = EXTI_0;
uint32_t extix_irq = EXTI0_IRQn;
uint32_t extix_irq_pre = 1;
uint32_t extix_irq_sub = 1;
uint32_t extix_trig = EXTI_TRIG_BOTH;
uint32_t extix_rcu = RCU_GPIOA;
uint32_t extix_port = GPIOA;
uint32_t extix_pin = GPIO_PIN_0;
uint32_t extix_pupd = GPIO_PUPD_NONE;
uint32_t extix_src_port = EXTI_SOURCE_GPIOA;
uint32_t extix_src_pin = EXTI_SOURCE_PIN0;
/*************** gpio ****************/
// PA0,
// 时钟初始化
rcu_periph_clock_enable(extix_rcu);
// 配置GPIO模式
gpio_mode_set(extix_port, GPIO_MODE_INPUT, extix_pupd, extix_pin);
/*************** exti ****************/
// 时钟配置
rcu_periph_clock_enable(RCU_SYSCFG);
// 配置中断源
syscfg_exti_line_config(extix_src_port, extix_src_pin);
// 中断初始化
exti_init(extix, EXTI_INTERRUPT, extix_trig);
// 配置中断优先级
nvic_irq_enable(extix_irq, extix_irq_pre, extix_irq_sub);
// 使能中断
exti_interrupt_enable(extix);
// 清除中断标志位
exti_interrupt_flag_clear(extix);
}
中断函数
void EXTI(xxxx)_IRQHandler() {
// 判断寄存器状态
if(SET == exti_interrupt_flag_get(EXTI_x)) {
// TODO:
}
// 清除中断标志位
exti_interrupt_flag_clear(EXTI_x);
}
软件中断
初始化
static void EXTI_config() {
uint32_t extix = EXTI_0;
uint32_t extix_irq = EXTI0_IRQn;
uint32_t extix_irq_pre = 1;
uint32_t extix_irq_sub = 1;
/*************** exti ****************/
// 时钟配置
rcu_periph_clock_enable(RCU_SYSCFG);
// 中断初始化
exti_init(extix, EXTI_INTERRUPT, EXTI_TRIG_NONE);
// 配置中断优先级
nvic_irq_enable(extix_irq, extix_irq_pre, extix_irq_sub);
// 使能中断
exti_interrupt_enable(extix);
// 清除中断标志位
exti_interrupt_flag_clear(extix);
}
中断函数
void EXTI(xxxx)_IRQHandler() {
// 判断寄存器状态
if(SET == exti_interrupt_flag_get(EXTI_x)) {
// TODO:
}
// 清除中断标志位
exti_interrupt_flag_clear(EXTI_x);
}
触发中断
exti_software_interrupt_enable(EXTI_x);