2回答

0收藏

[原创] GD32F207ZE小红板之中断检测按键控制LED小灯

GD32 GD32 3899 人阅读 | 2 人回复 | 2016-01-07

本帖最后由 dhbking 于 2016-1-7 22:00 编辑

  放假中小红板就到了,一回来就急冲冲的去取快递。下面晒图



上电后板子的电源灯亮瞎了我的眼,这光太强烈了。估计是限流电阻太小,建议GD以后的板子可以把电阻换大些!
         这个板子很小真可谓是口袋板,经过一番装驱动和一些资料的学习,加上以前玩过STM32的板子,感觉这个板子简直就是STM32的双胞胎兄弟嘛,基本上一样,以前玩过STM32的很容易就上手这块板子。好了废话不多说,下面就说说我这次的小测试吧!这次的测试是用中断检测按键控制LED的点亮和熄灭,也是基于库函数开发的。
   首先得新建一个工程,工程的建立方法很多人已经分享,这个我就不多说了,我就大概说下我的工程结构吧


上面的DOC是说明文档,DRIVER是自己编写的相应的外设驱动程序,Lib是官方提供的库文件,MDK是保存项目工程,STARTUP是启动的相关文件,USER是用户编写的应用程序。
  要想用中断控制就要配置按键的引脚为外部事件触发中断模式,同时配置相应的GPIO为输入模式以及中断优先级的配置。代码如下:
  1. void Key_Interrupt_Configuration(void)
  2. {
  3.                         GPIO_InitPara GPIO_InitStructure;
  4.       EXTI_InitPara EXTI_InitStructure;
  5.       NVIC_InitPara NVIC_InitStructure;
  6.       
  7.       RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_AF ,ENABLE);

  8.       /* Configure PD14\15 pin */
  9.       GPIO_InitStructure.GPIO_Pin = GPIO_PIN_14|GPIO_PIN_15;
  10.       GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IN_FLOATING;
  11.       GPIO_Init(GPIOD, &GPIO_InitStructure);

  12.       /* Connect EXTI Line14 to PD14 pin */
  13.       GPIO_EXTILineConfig(GPIO_PORT_SOURCE_GPIOD, GPIO_PINSOURCE15);
  14.                         /* Connect EXTI Line15 to PD15 pin */
  15.       GPIO_EXTILineConfig(GPIO_PORT_SOURCE_GPIOD, GPIO_PINSOURCE14);

  16.       /* Configure EXTI Line0 and its interrupt to the lowest priority*/
  17.       EXTI_InitStructure.EXTI_LINE = EXTI_LINE14|EXTI_LINE15;
  18.       EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  19.       EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  20.       EXTI_InitStructure.EXTI_LINEEnable = ENABLE;
  21.                         EXTI_Init(&EXTI_InitStructure);
  22.       
  23.         
  24.       NVIC_InitStructure.NVIC_IRQ = EXTI15_10_IRQn;
  25.       NVIC_InitStructure.NVIC_IRQPreemptPriority = 0;
  26.       NVIC_InitStructure.NVIC_IRQSubPriority = 1;
  27.       NVIC_InitStructure.NVIC_IRQEnable = ENABLE;
  28.       NVIC_Init(&NVIC_InitStructure);
  29. }
复制代码
  这些库函数和ST的库函数基本上是一致的,很容易理解。
接下来是配置LED的GPIO为推挽输出模式,代码如下:
  1. void GPIO_Configuration(void)
  2. {
  3.     GPIO_InitPara GPIO_InitStructure;
  4.     RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOD ,ENABLE);

  5.     GPIO_InitStructure.GPIO_Pin = GPIO_PIN_11 | GPIO_PIN_12| GPIO_PIN_13;
  6.     GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT_PP;
  7.     GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
  8.     GPIO_Init(GPIOD,&GPIO_InitStructure);
  9. }
复制代码
  这些配置完成后就可以写中断服务子程序了,方法就是检测中断标志位,如果检测到标志位被置位则执行相应的操作,之后就清中断,很简单代码如下:
  1. void EXTI15_10_IRQHandler(void)
  2. {
  3.                 int count = 0xffff;

  4.       if (EXTI_GetIntBitState(EXTI_LINE14) != RESET)
  5.       {
  6.             while(count--);
  7.             if (EXTI_GetIntBitState(EXTI_LINE14) != RESET)
  8.             {
  9.                                                                                 LED1(1);
  10.                                                                                 LED3(0);
  11.                     EXTI_ClearIntBitState(EXTI_LINE14);
  12.                      
  13.             }
  14.       }
  15.   
  16.       if (EXTI_GetIntBitState(EXTI_LINE15) != RESET)
  17.       {
  18.             while(count--);
  19.             if (EXTI_GetIntBitState(EXTI_LINE15) != RESET)
  20.             {
  21.                                                                                 LED3(1);
  22.                                                                                 LED1(0);
  23.                     EXTI_ClearIntBitState(EXTI_LINE15);
  24.                      
  25.             }
  26.       }
  27. }
复制代码
  需要注意的一点是这里的中断服务子程序的函数名不能写错,它必须和启动文件中的中断函数名一致否则会出现中断无法实现的情况。如果不记得所用中断的函数名,可以从启动文件中找到。到这程序基本上就完成了,再设置下载选项将程序下载进单片机中,通过按键即可控制LED的亮灭,下面附上我的工程模板
GD32F207ZE.rar (7.85 MB, 下载次数: 17)

  我的工程里是将官方的标准库封装成lib文件添加进去的,这样的好处就是如果点全部编译的话,这些库函数就不用在编译了可以节约时间,当然你也可以不这样,直接添加库的C文件进去也是可以的。
分享到:
回复

使用道具 举报

回答|共 2 个

倒序浏览

沙发

奋斗哥

发表于 2016-1-8 09:42:07 | 只看该作者

感谢分享,期待作品
板凳

糖悦之果飞

发表于 2016-1-8 10:23:55 | 只看该作者

分享的不错,可以将文章一并发到经验频道,获取双重奖励哟http://jingyan.eeboard.com/
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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