硬件中断

初始化

  1. static void EXTI_config() {
  2. uint32_t extix = EXTI_0;
  3. uint32_t extix_irq = EXTI0_IRQn;
  4. uint32_t extix_irq_pre = 1;
  5. uint32_t extix_irq_sub = 1;
  6. uint32_t extix_trig = EXTI_TRIG_BOTH;
  7. uint32_t extix_rcu = RCU_GPIOA;
  8. uint32_t extix_port = GPIOA;
  9. uint32_t extix_pin = GPIO_PIN_0;
  10. uint32_t extix_pupd = GPIO_PUPD_NONE;
  11. uint32_t extix_src_port = EXTI_SOURCE_GPIOA;
  12. uint32_t extix_src_pin = EXTI_SOURCE_PIN0;
  13. /*************** gpio ****************/
  14. // PA0,
  15. // 时钟初始化
  16. rcu_periph_clock_enable(extix_rcu);
  17. // 配置GPIO模式
  18. gpio_mode_set(extix_port, GPIO_MODE_INPUT, extix_pupd, extix_pin);
  19. /*************** exti ****************/
  20. // 时钟配置
  21. rcu_periph_clock_enable(RCU_SYSCFG);
  22. // 配置中断源
  23. syscfg_exti_line_config(extix_src_port, extix_src_pin);
  24. // 中断初始化
  25. exti_init(extix, EXTI_INTERRUPT, extix_trig);
  26. // 配置中断优先级
  27. nvic_irq_enable(extix_irq, extix_irq_pre, extix_irq_sub);
  28. // 使能中断
  29. exti_interrupt_enable(extix);
  30. // 清除中断标志位
  31. exti_interrupt_flag_clear(extix);
  32. }

中断函数

  1. void EXTI(xxxx)_IRQHandler() {
  2. // 判断寄存器状态
  3. if(SET == exti_interrupt_flag_get(EXTI_x)) {
  4. // TODO:
  5. }
  6. // 清除中断标志位
  7. exti_interrupt_flag_clear(EXTI_x);
  8. }

软件中断

初始化

  1. static void EXTI_config() {
  2. uint32_t extix = EXTI_0;
  3. uint32_t extix_irq = EXTI0_IRQn;
  4. uint32_t extix_irq_pre = 1;
  5. uint32_t extix_irq_sub = 1;
  6. /*************** exti ****************/
  7. // 时钟配置
  8. rcu_periph_clock_enable(RCU_SYSCFG);
  9. // 中断初始化
  10. exti_init(extix, EXTI_INTERRUPT, EXTI_TRIG_NONE);
  11. // 配置中断优先级
  12. nvic_irq_enable(extix_irq, extix_irq_pre, extix_irq_sub);
  13. // 使能中断
  14. exti_interrupt_enable(extix);
  15. // 清除中断标志位
  16. exti_interrupt_flag_clear(extix);
  17. }

中断函数

  1. void EXTI(xxxx)_IRQHandler() {
  2. // 判断寄存器状态
  3. if(SET == exti_interrupt_flag_get(EXTI_x)) {
  4. // TODO:
  5. }
  6. // 清除中断标志位
  7. exti_interrupt_flag_clear(EXTI_x);
  8. }

触发中断

  1. exti_software_interrupt_enable(EXTI_x);