回答

收藏

[原创] 《GD32-Colibri-F207ZE开发板玩家笔记》之GPIO_BlinkyLed

GD32 GD32 3673 人阅读 | 0 人回复 | 2016-02-19

GPIO_BlinkyLED工程实现的功能是,由串口终端触发点亮/熄灭开发板上的可编程LED灯。为了满足这些需求,需要考虑到几个设计要点:
(1)应用GPIO驱动程序调用底层硬件控制可编程LED的引脚电平。
(2)扑捉串口输入事件,并做出响应。这个功能已经由UART_HelloWorld样例程序实现。
在开发板原理图中标明,开发板上的三个LED小灯分别同PTD11、PTD12、PTD13三个引脚相连,如图1所示。


图1


开始编程。

步骤一:创建工程
考虑到要使用stdio的通信信道作为人机交互,在项目代码树的“\example”目录下,复制已经创建好的样例工程“UART_HelloWorld”作为本工程的模板,改目录名为“GPIO_BlinkyLED”。

步骤二:添加应用代码
在main.c文件中添加应用程序代码如下:
  1. /* main.c */
  2. #include "app_inc.h"

  3. /*
  4. * Application Function Declerations.
  5. */
  6. void LED_Configuration(void);
  7. void LED_LightOn(uint32_t ledIdx);
  8. void LED_LightOff(uint32_t ledIdx);

  9. /*
  10. * Application Entry.
  11. */
  12. int main(void)
  13. {
  14.     uint32_t i;

  15.     BSP_InitStdioUART(115200U);

  16.     printf("\r\n\r\n# GPIO_ToggleLED Exampler #\r\n");

  17.     /* Initialize the application. */
  18.     printf("# Initializing ...\r\n");
  19.    
  20.     LED_Configuration();
  21.    
  22.     printf("# Ready.\r\n");
  23.    
  24.     /* Print the user guide. */
  25.     printf("Press any key to toggle the LEDs ...\r\n");
  26.    
  27.     while (1)
  28.     {
  29.         for (i = 0U; i < 3U; i++)
  30.         {
  31.             getchar();
  32.             LED_LightOn(i);
  33.             getchar();
  34.             LED_LightOff(i);
  35.         }
  36.     }
  37. }

  38. void LED_Configuration(void)
  39. {
  40.     GPIO_InitPara GPIO_InitStructure;
  41.     RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOD,ENABLE);

  42.     GPIO_InitStructure.GPIO_Pin = GPIO_PIN_11 | GPIO_PIN_12| GPIO_PIN_13;
  43.     GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT_PP;
  44.     GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
  45.     GPIO_Init(GPIOD,&GPIO_InitStructure);

  46.     GPIO_InitStructure.GPIO_Pin = GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13;
  47.     GPIO_Init(GPIOD,&GPIO_InitStructure);
  48. }

  49. const uint16_t gLedPins[] = {GPIO_PIN_11, GPIO_PIN_12, GPIO_PIN_13};

  50. void LED_LightOn(uint32_t ledIdx)
  51. {
  52.     if (ledIdx >= sizeof(gLedPins)/sizeof(gLedPins[0]))
  53.     {
  54.         return;
  55.     }
  56.     GPIO_SetBits(GPIOD, gLedPins[ledIdx]);
  57. }

  58. void LED_LightOff(uint32_t ledIdx)
  59. {
  60.     if (ledIdx >= sizeof(gLedPins)/sizeof(gLedPins[0]))
  61.     {
  62.         return;
  63.     }
  64.     GPIO_ResetBits(GPIOD, gLedPins[ledIdx]);
  65. }

  66. /* EOF. */
复制代码
在这个应用中,为了方便对LED灯的操作,封装了三个与LED相关的函数:LED_Configuration(),LED_LightOn()和LED_LightOff(),分别对应对连接了LED小灯的GPIO引脚进行初始化,控制引脚输出高/低电平,对应LED小灯的亮/灭。当getchar()收到从串口终端输入的字符时,才能运行下一个控制小灯的语句,否则就阻塞在原地不让后面的程序执行,从而实现了由串口终端的输出事件触发小灯状态的效果。

步骤三:下载程序,运行
启动上位机串口终端软件同开发板建立连接,编译工程,下载,复位运行程序。此时,串口终端显示信息,如图2所示。


图2

此时在串口终端中输入字符,观察开发板即可发现有红、绿、黄三个颜色的LED灯随着输入字符的动作进行闪烁。
(板子上的蓝色LED电源指示灯太耀眼,亮瞎了我的相机镜头,这里就不再演示运行现象了。)






分享到:
回复

使用道具 举报

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

本版积分规则

关闭

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