EXTI(中断/事件控制器)
NVIC(嵌套式矢量型中断控制器)
EXTI有三种触发类型:上升沿触发、下降沿触发和任意沿触发。
触发响应方式:中断响应/事件响应。
EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序。

EXTI框图

image.png
image.png
image.png

程序

1.使能GPIO口时钟,配置IO口模式
2.使能AF中断线时钟
3.中断来源选择(来自哪个IO口)
4.终端初始化 中断or事件模式,上升or下降or上升下降触发模式
5.设置NVIC优先组,然后基于优先级配置抢占优先级和响应优先级http://t.csdn.cn/jsRZd
image.png
6.两类标志位获取函数
image.png

  1. #include "gd32f10x.h" // Device header
  2. uint16_t CountSensor_Count;
  3. void CountSensor_Init(void)
  4. {
  5. rcu_apb2_clock_config(RCU_APB2_CKAHB_DIV1);
  6. rcu_periph_clock_enable(RCU_GPIOB); //使能RCU_GPIOB时钟
  7. /* enable the AF clock */
  8. rcu_periph_clock_enable(RCU_AF);
  9. gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_14);
  10. /* connect key EXTI line to key GPIO pin */
  11. gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_14);
  12. /* configure key EXTI line */
  13. exti_init(EXTI_14, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
  14. exti_interrupt_flag_clear(EXTI_14);
  15. /* enable and set key EXTI interrupt to the specified priority */
  16. nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
  17. nvic_irq_enable(EXTI10_15_IRQn, 1U, 1U);
  18. }
  19. uint16_t CountSensor_Get(void)
  20. {
  21. return CountSensor_Count;
  22. }
  23. void EXTI10_15_IRQHandler(void)
  24. {
  25. if (exti_interrupt_flag_get(EXTI_14) == SET)
  26. {
  27. if(gpio_input_bit_get(GPIOB, GPIO_PIN_14) == 0)
  28. {
  29. CountSensor_Count++;
  30. }
  31. exti_interrupt_flag_clear(EXTI_14);
  32. }
  33. }

在中断函数里尽量不要加入运行时间过长的程序,也不要加入直接操作硬件的程序,最好是使用变量和标志位。