4966|9

606

帖子

20

TA的资源

一粒金砂(高级)

楼主
 

【基于GDF350的无线数字对讲机】4、外部中断的大BUG? [复制链接]

本帖最后由 ketose 于 2018-10-1 20:05 编辑

    今天做对讲机的按键设置,想把开发板上的两个按键都用起,可是遇到了GD32的大BUG。是我水平太Low了?
    先看下F350开发板上两个按健的原理图吧。


从原理图上看,B2按键是接在PA0上,B3按键是接在PB7上。
好了,写段代码来验证下:
  1. #include "gd32f3x0.h"                   // Device header

  2. int main()
  3. {
  4.         //开启GPIO时钟
  5.         rcu_periph_clock_enable(RCU_GPIOB);
  6.         rcu_periph_clock_enable(RCU_GPIOA);
  7.         //设置外部中断
  8.         gpio_mode_set(GPIOA,GPIO_MODE_INPUT,GPIO_PUPD_NONE,GPIO_PIN_0);
  9.   syscfg_exti_line_config(EXTI_SOURCE_GPIOA,EXTI_SOURCE_PIN0);
  10.         exti_init(EXTI_0,EXTI_INTERRUPT,EXTI_TRIG_BOTH);
  11.         
  12.         gpio_mode_set(GPIOB,GPIO_MODE_INPUT,GPIO_PUPD_NONE,GPIO_PIN_7);
  13.   syscfg_exti_line_config(EXTI_SOURCE_GPIOB,EXTI_SOURCE_PIN7);
  14.         exti_init(EXTI_7,EXTI_INTERRUPT,EXTI_TRIG_BOTH);
  15.         
  16.         //设置中断优先级
  17.         nvic_irq_enable(EXTI4_15_IRQn,0,1);
  18.         nvic_irq_enable(EXTI0_1_IRQn,0,2);
  19.         
  20.         while(1)
  21.         {
  22.                 //验证
  23.                 if(gpio_input_bit_get(GPIOB,GPIO_PIN_7) == RESET)
  24.                 {
  25.                         gpio_input_bit_get(GPIOB,GPIO_PIN_7);
  26.                 }
  27.                 if(gpio_input_bit_get(GPIOA,GPIO_PIN_0) == RESET)
  28.                 {
  29.                         gpio_input_bit_get(GPIOA,GPIO_PIN_0);
  30.                 }
  31.         }
  32. }

  33. void EXTI0_1_IRQHandler(void)
  34. {
  35.         exti_interrupt_flag_clear(EXTI_0);
  36. }

  37. void EXTI4_15_IRQHandler(void)
  38. {
  39.         exti_interrupt_flag_clear(EXTI_7);
  40. }
复制代码

如下图所示,打上断点:



调试程序,让程序跑起来,然后按下B2程序会断在exti_interrupt_flag_clear(EXTI_0) 处,然后继续运行,程序接下来断在gpio_input_bit_get(GPIOA,GPIO_PIN_0);这个是正确的。验证B3按键,不论你怎么按。都不会中断下来。只会断gpio_input_bit_get(GPIOB,GPIO_PIN_7);同样的设置,为什么PB7的外部中断就不灵了呢?最后调试发现是EXTISS0-EXTISS3这几个寄存器不能设置值。也就是说GD32F350能用的外部中断只有PA0,PB0,PC0,PF0,要想用其它引脚……没戏!
同时手有个GD32F450的开发板,也做了同样的实验。一样的效果,不会吧,我都不敢相信。
如果论坛里有GD32的FAE,麻烦出来解答一下。
此帖出自GD32 MCU论坛

最新回复

        /* enable the key clock */         rcu_periph_clock_enable(RCU_GPIOB);   rcu_periph_clock_enable(RCU_CFGCMP);         /* configure button pin as input */   gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_9);         /* enable and set key EXTI interrupt to the lowest priority */         nvic_irq_enable(EXTI4_15_IRQn, 2U, 0U);         /* connect key EXTI line to key GPIO pin */         syscfg_exti_line_config(EXTI_SOURCE_GPIOB, EXTI_SOURCE_PIN9);         /* configure key EXTI line */         exti_init(EXTI_9, EXTI_INTERRUPT, EXTI_TRIG_FALLING);复制代码 B9亲测可用 楼主的代码似乎少了rcu_periph_clock_enable(RCU_CFGCMP);这货  详情 回复 发表于 2018-10-1 22:36
点赞 关注(1)
 

回复
举报

3416

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
亲测有其他中断源可用,楼主可再撸撸码……
此帖出自GD32 MCU论坛

点评

我的代码哪里有错吗?  详情 回复 发表于 2018-10-1 21:11
 
 
 

回复

606

帖子

20

TA的资源

一粒金砂(高级)

板凳
 
ljj3166 发表于 2018-10-1 20:20
亲测有其他中断源可用,楼主可再撸撸码……

我的代码哪里有错吗?
此帖出自GD32 MCU论坛
 
 
 

回复

3416

帖子

0

TA的资源

纯净的硅(高级)

4
 
用过中断源0和1,其他的不知道
比较一下看看
三向按键,每次只可能出现一种键值
  1. #define WHEEL_KEY_UP_PIN                     GPIO_PIN_0
  2. #define WHEEL_KEY_UP_GPIO_PORT               GPIOB
  3. #define WHEEL_KEY_UP_GPIO_CLK                RCU_GPIOB
  4. #define WHEEL_KEY_UP_EXTI_LINE               EXTI_0
  5. #define WHEEL_KEY_UP_EXTI_PORT_SOURCE        EXTI_SOURCE_GPIOB
  6. #define WHEEL_KEY_UP_EXTI_PIN_SOURCE         EXTI_SOURCE_PIN0
  7. #define WHEEL_KEY_UP_EXTI_IRQn               EXTI0_1_IRQn
  8. #define WHEEL_KEY_OK_PIN                     GPIO_PIN_1
  9. #define WHEEL_KEY_OK_GPIO_PORT               GPIOB
  10. #define WHEEL_KEY_OK_GPIO_CLK                RCU_GPIOB
  11. #define WHEEL_KEY_OK_EXTI_LINE               EXTI_1
  12. #define WHEEL_KEY_OK_EXTI_PORT_SOURCE        EXTI_SOURCE_GPIOB
  13. #define WHEEL_KEY_OK_EXTI_PIN_SOURCE         EXTI_SOURCE_PIN1
  14. #define WHEEL_KEY_OK_EXTI_IRQn               EXTI0_1_IRQn
  15. #define WHEEL_KEY_DN_PIN                     GPIO_PIN_1
  16. #define WHEEL_KEY_DN_GPIO_PORT               GPIOA
  17. #define WHEEL_KEY_DN_GPIO_CLK                RCU_GPIOA
  18. #define WHEEL_KEY_DN_EXTI_LINE               EXTI_1
  19. #define WHEEL_KEY_DN_EXTI_PORT_SOURCE        EXTI_SOURCE_GPIOA
  20. #define WHEEL_KEY_DN_EXTI_PIN_SOURCE         EXTI_SOURCE_PIN1
  21. #define WHEEL_KEY_DN_EXTI_IRQn               EXTI0_1_IRQn

  22. void WHEEL_KEY_INIT(void)
  23. {
  24.         /* enable the key clock */
  25.         rcu_periph_clock_enable(WHEEL_KEY_UP_GPIO_CLK);
  26.         rcu_periph_clock_enable(WHEEL_KEY_OK_GPIO_CLK);
  27.         rcu_periph_clock_enable(WHEEL_KEY_DN_GPIO_CLK);
  28.   rcu_periph_clock_enable(RCU_CFGCMP);
  29.         /* configure button pin as input */
  30.   gpio_mode_set(WHEEL_KEY_UP_GPIO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, WHEEL_KEY_UP_PIN);
  31.         gpio_mode_set(WHEEL_KEY_OK_GPIO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, WHEEL_KEY_OK_PIN);
  32.         gpio_mode_set(WHEEL_KEY_DN_GPIO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, WHEEL_KEY_DN_PIN);
  33.         /* enable and set key EXTI interrupt to the lowest priority */
  34.         nvic_irq_enable(WHEEL_KEY_UP_EXTI_IRQn, 2U, 0U);
  35.         nvic_irq_enable(WHEEL_KEY_OK_EXTI_IRQn, 2U, 0U);
  36.         nvic_irq_enable(WHEEL_KEY_DN_EXTI_IRQn, 2U, 0U);

  37.         /* connect key EXTI line to key GPIO pin */
  38.         syscfg_exti_line_config(WHEEL_KEY_UP_EXTI_PORT_SOURCE, WHEEL_KEY_UP_EXTI_PIN_SOURCE);
  39.         syscfg_exti_line_config(WHEEL_KEY_OK_EXTI_PORT_SOURCE, WHEEL_KEY_OK_EXTI_PIN_SOURCE);
  40.         syscfg_exti_line_config(WHEEL_KEY_DN_EXTI_PORT_SOURCE, WHEEL_KEY_DN_EXTI_PIN_SOURCE);

  41.         /* configure key EXTI line */
  42.         exti_init(WHEEL_KEY_UP_EXTI_LINE, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
  43.         exti_interrupt_flag_clear(WHEEL_KEY_UP_EXTI_LINE);
  44.         exti_init(WHEEL_KEY_OK_EXTI_LINE, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
  45.         exti_interrupt_flag_clear(WHEEL_KEY_OK_EXTI_LINE);
  46.         exti_init(WHEEL_KEY_DN_EXTI_LINE, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
  47.         exti_interrupt_flag_clear(WHEEL_KEY_DN_EXTI_LINE);
  48. }

  49. void EXTI0_1_IRQHandler(void)
  50. {
  51.         if (RESET != exti_interrupt_flag_get(WHEEL_KEY_UP_EXTI_LINE))
  52.         {
  53.                 wheel_key_up = true;
  54.                 exti_interrupt_flag_clear(WHEEL_KEY_UP_EXTI_LINE);
  55.         }
  56.         else        {}
  57.         if ((RESET != exti_interrupt_flag_get(WHEEL_KEY_OK_EXTI_LINE)) && !gpio_input_bit_get(WHEEL_KEY_OK_GPIO_PORT, WHEEL_KEY_OK_PIN) )
  58.         {
  59.                 wheel_key_ok = true;
  60.                 exti_interrupt_flag_clear(WHEEL_KEY_OK_EXTI_LINE);
  61.         }
  62.         else {}
  63.         if ((RESET != exti_interrupt_flag_get(WHEEL_KEY_DN_EXTI_LINE)) && !gpio_input_bit_get(WHEEL_KEY_DN_GPIO_PORT, WHEEL_KEY_DN_PIN) )
  64.         {
  65.                 wheel_key_dn = true;
  66.                 exti_interrupt_flag_clear(WHEEL_KEY_DN_EXTI_LINE);
  67.         }
  68.         else {}                                               
  69. }
复制代码




此帖出自GD32 MCU论坛

点评

你可以试下除了外部中断0 以外的其它外部中断。 你看我的贴子,exti0是没有问题的。就是其它的外部中断不行。 等你消息。  详情 回复 发表于 2018-10-1 22:06
 
个人签名

So TM what......?

 

 

回复

606

帖子

20

TA的资源

一粒金砂(高级)

5
 
ljj3166 发表于 2018-10-1 21:43
用过中断源0和1,其他的不知道
比较一下看看
三向按键,每次只可能出现一种键值

你可以试下除了外部中断0 以外的其它外部中断。
你看我的贴子,exti0是没有问题的。就是其它的外部中断不行。
等你消息。
此帖出自GD32 MCU论坛

点评

中断源1没问题的  详情 回复 发表于 2018-10-1 22:11
 
 
 

回复

3416

帖子

0

TA的资源

纯净的硅(高级)

6
 
ketose 发表于 2018-10-1 22:06
你可以试下除了外部中断0 以外的其它外部中断。
你看我的贴子,exti0是没有问题的。就是其它的外部中断 ...

中断源1没问题的
此帖出自GD32 MCU论坛

点评

你觉得我的代码问题出在哪里?  详情 回复 发表于 2018-10-1 22:16
其它的中断源呢?  详情 回复 发表于 2018-10-1 22:14
 
个人签名

So TM what......?

 

 

回复

606

帖子

20

TA的资源

一粒金砂(高级)

7
 
ljj3166 发表于 2018-10-1 22:11
中断源1没问题的

其它的中断源呢?
此帖出自GD32 MCU论坛

点评

B9亲测可用 楼主的代码似乎少了rcu_periph_clock_enable(RCU_CFGCMP);这货  详情 回复 发表于 2018-10-1 22:36
 
 
 

回复

606

帖子

20

TA的资源

一粒金砂(高级)

8
 
ljj3166 发表于 2018-10-1 22:11
中断源1没问题的

你觉得我的代码问题出在哪里?
此帖出自GD32 MCU论坛
 
 
 

回复

3416

帖子

0

TA的资源

纯净的硅(高级)

9
 
ketose 发表于 2018-10-1 22:14
其它的中断源呢?
  1.         /* enable the key clock */
  2.         rcu_periph_clock_enable(RCU_GPIOB);
  3.   rcu_periph_clock_enable(RCU_CFGCMP);
  4.         /* configure button pin as input */
  5.   gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_9);

  6.         /* enable and set key EXTI interrupt to the lowest priority */
  7.         nvic_irq_enable(EXTI4_15_IRQn, 2U, 0U);

  8.         /* connect key EXTI line to key GPIO pin */
  9.         syscfg_exti_line_config(EXTI_SOURCE_GPIOB, EXTI_SOURCE_PIN9);

  10.         /* configure key EXTI line */
  11.         exti_init(EXTI_9, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
复制代码


B9亲测可用
楼主的代码似乎少了rcu_periph_clock_enable(RCU_CFGCMP);这货
此帖出自GD32 MCU论坛

点评

是然是因为这句……  详情 回复 发表于 2018-10-2 10:24
 
个人签名

So TM what......?

 

 

回复

606

帖子

20

TA的资源

一粒金砂(高级)

10
 
ljj3166 发表于 2018-10-1 22:36
B9亲测可用
楼主的代码似乎少了rcu_periph_clock_enable(RCU_CFGCMP);这货

是然是因为这句……谢谢
此帖出自GD32 MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表