社区导航

 

搜索
查看: 1790|回复: 9

[经验分享] 【基于GDF350的无线数字对讲机】4、外部中断的大BUG?

[复制链接]

632

TA的帖子

20

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2018-10-1 20:02 | 显示全部楼层 |阅读模式
本帖最后由 ketose 于 2018-10-1 20:05 编辑

    今天做对讲机的按键设置,想把开发板上的两个按键都用起,可是遇到了GD32的大BUG。是我水平太Low了?
    先看下F350开发板上两个按健的原理图吧。
PA0.png
PB7.png
从原理图上看,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. }
复制代码

如下图所示,打上断点:
break.png


调试程序,让程序跑起来,然后按下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论坛

回复

使用道具 举报

3384

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2018-10-1 20:20 来自手机 | 显示全部楼层
亲测有其他中断源可用,楼主可再撸撸码……

点评

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

回复

使用道具 举报

632

TA的帖子

20

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2018-10-1 21:11 | 显示全部楼层
ljj3166 发表于 2018-10-1 20:20
亲测有其他中断源可用,楼主可再撸撸码……

我的代码哪里有错吗?

回复

使用道具 举报

3384

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2018-10-1 21:43 | 显示全部楼层
用过中断源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. }
复制代码




点评

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

回复

使用道具 举报

632

TA的帖子

20

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2018-10-1 22:06 | 显示全部楼层
ljj3166 发表于 2018-10-1 21:43
用过中断源0和1,其他的不知道
比较一下看看
三向按键,每次只可能出现一种键值

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

点评

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

回复

使用道具 举报

3384

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

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

中断源1没问题的

点评

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

回复

使用道具 举报

632

TA的帖子

20

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2018-10-1 22:14 | 显示全部楼层
ljj3166 发表于 2018-10-1 22:11
中断源1没问题的

其它的中断源呢?

点评

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

回复

使用道具 举报

632

TA的帖子

20

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2018-10-1 22:16 | 显示全部楼层
ljj3166 发表于 2018-10-1 22:11
中断源1没问题的

你觉得我的代码问题出在哪里?

回复

使用道具 举报

3384

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2018-10-1 22:36 | 显示全部楼层
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);这货

点评

是然是因为这句……  详情 回复 发表于 2018-10-2 10:24
So what......

回复

使用道具 举报

632

TA的帖子

20

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

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

是然是因为这句……谢谢

回复

使用道具 举报

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

关闭

站长推荐上一条 /7 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-2-28 09:39 , Processed in 0.302157 second(s), 18 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表