硬件中断
初始化
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);