GD32外部中断处理流程及注意事项

[复制链接]
 楼主| sunmeat 发表于 2015-3-16 15:14 | 显示全部楼层 |阅读模式
    GD32的外部中断是以组为单位,例如PA0、PB0、PC0、PD0、PE0、PF0、PG0共用外部中断0,我们再使用时从中选择一个座位外部中断0即可,其他中断类推。
 楼主| sunmeat 发表于 2015-3-16 15:14 | 显示全部楼层
    外部中断包括EXTI0、EXTI1、EXTI2、EXTI3、EXTI4、EXTI9_5、EXTI15_10,Pin0--Pin4有各自独立的中断,Pin5--Pin9共用一个中断,Pin10--Pin15共用一个中断。
QQ截图20150316151434.png
 楼主| sunmeat 发表于 2015-3-16 15:16 | 显示全部楼层
外部中断设置流程:
1 设置IO口
   将IO口设置为输入状态。
  1. GPIO_InitTypeDef GPIO_KEY;
  2. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE, ENABLE); //时钟使能

  3. GPIO_KEY.GPIO_Pin = GPIO_Pin_9;
  4. GPIO_KEY.GPIO_Speed = GPIO_Speed_50MHz;
  5. GPIO_KEY.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
  6. GPIO_Init(GPIOB, &GPIO_KEY);
 楼主| sunmeat 发表于 2015-3-16 15:16 | 显示全部楼层
2 设置中断优先级
  1. NVIC_InitTypeDef NVIC_InitStructure;

  2. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //设置组优先级
  3. NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel; //设置通道中断号
  4. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级
  5. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级
  6. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道使能
  7. NVIC_Init(&NVIC_InitStructure);
 楼主| sunmeat 发表于 2015-3-16 15:20 | 显示全部楼层
3 设置中断源
  1. EXTI_InitTypeDef EXTI_InitStructure;
  2. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //外部中断必须开启AFIO时钟

  3. EXTI_ClearITPendingBit(EXTI_Line9); //清除EXTI线路挂起位 PB9
  4. GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource9); //选择PB9作为EXTI线路
  5. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断请求
  6. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
  7. EXTI_InitStructure.EXTI_Line = EXTI_Line9 ; //PB9为中断源
  8. EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能该中断源
  9. EXTI_Init(&EXTI_InitStructure);

注:设置外部中断源时必须是来了个AFIO功能,否则中断得不到响应。
 楼主| sunmeat 发表于 2015-3-16 15:21 | 显示全部楼层
4 中断响应函数
  1. void IRQ_EXTI9(void)
  2. {
  3. Pow_State += 1;
  4. if(Pow_State%2 == 0)
  5. {
  6. Pow_State = 0;
  7. }
  8. }
 楼主| sunmeat 发表于 2015-3-16 15:22 | 显示全部楼层
5 中断函数
  1. void EXTI9_5_IRQHandler(void)
  2. {
  3. delay_ms(10);
  4. if ( EXTI_GetITStatus(EXTI_Line9) != RESET )
  5. {
  6. NVIC_SETPRIMASK(); //关闭总中断
  7. EXTI_ClearITPendingBit(EXTI_Line9);
  8. IRQ_EXTI9();
  9. NVIC_RESETPRIMASK();//开放总中断
  10. }
  11. }
 楼主| sunmeat 发表于 2015-3-16 15:22 | 显示全部楼层
6 主函数
  1. void Process_Key(void)
  2. {
  3. switch(Pow_State)
  4. {
  5. case 0:
  6. LED_PWR_Off();
  7. break;
  8. case 1:
  9. LED_PWR_On();
  10. break;
  11. default:
  12. break;
  13. }
  14. }
smilingangel 发表于 2015-3-17 21:46 | 显示全部楼层
恩,这个需要在硬件设计得时候注意的啊。
angerbird 发表于 2015-3-22 12:46 | 显示全部楼层
这个中断处理机制的跟STM32是一样的。
angerbird 发表于 2015-3-22 12:47 | 显示全部楼层
在进行多个中断源的设计的时候,可根据需要选取不懂同类型的IO口进行设计。
ljmf5 发表于 2017-5-5 19:05 | 显示全部楼层
本帖最后由 ljmf5 于 2017-5-5 19:08 编辑

你好,我想请教一下,这里不使用中断服务函数,直接在main函数中使用下面的语句做查询法,
while(EXTI_GetIntBitState(EXTI_LINE9) != RESET)    make();
EXTI_EXTI_ClearIntBitState(EXTI_Line9);
我这样搞就卡住了,不知道是什么情况,

外部中断配置跟你的一样
戈卫东 发表于 2017-5-6 10:08 | 显示全部楼层
这个好像完全继承了ST的搞法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

208

主题

2132

帖子

13

粉丝
快速回复 在线客服 返回列表 返回顶部

208

主题

2132

帖子

13

粉丝
快速回复 在线客服 返回列表 返回顶部