微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 第002例:GPIO-流水灯

第002例:GPIO-流水灯

时间:10-02 整理:3721RD 点击:
【HAL库每天一例】系列例程从今天开始持续更新。
我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。
例程下载:
资料包括程序、相关说明资料以及软件使用截图
链接:http://pan.baidu.com/s/1i574oPv
密码:r3s3

(硬石YS-F1Pro开发板HAL库例程持续更新\1. 软件设计之基本裸机例程(HAL库版本)\YSF1_HAL-002. GPIO-流水灯)
/**
  ******************************************************************************
  *                           硬石YS-F1Pro开发板例程功能说明
  *
  *  例程名称: YSF1_HAL-002. 流水灯
  *   
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  *
  * 淘宝:
  * 论坛:http://www.ing10bbs.com
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */
【1】例程简介
  使用stm32 HAL库函数实现LED流水灯效果。通过这个例程熟悉stm32 HAL库函数编程思想。
  stm32拥有非常多的IO引脚,这些IO引脚可以用作最简单的控制电平控制,可以设置为输出高电
平(数字量:1,对应3.3V)或者低电平(数字量:0,对应0V),也可以设置为输入模式,读取这个IO引
脚的电平(比如用于按键状态读取)。  本例程我们调用HAL库函数方法来实现对IO引脚的输出高低
电平进行控制。
   
  通过开发板原理图我们可以知道:
   
  LED1灯负极接在GND(0V)上,正极通过一个电阻接在stm32f103zet6芯片的PB0引脚上(中间还
有一个JP3默认使用跳线帽短路),如果我们控制PB0引脚为高电平(3.3V)的话,此时电路存在电压
差,电流从LED1灯正极流向负极再经电阻流入GND,此时LED1灯是亮的;另外,如果我们控制PB0
引脚为低电平(0V)的话,此时电路没有电流,所以LED1灯是灭的。如此看来,只要我们控制PB0引
脚的高或者低电平就可以自由控制LED1灯的亮灭。
  
  LED2和LED3控制原理与LED1是相同的。
  
  在使用IO引脚之前我们需要对IO引脚相关资源进行初始化配置,首先我们需要调用使能GPIOB
端口时钟函数LED1_RCC_CLK_ENABLE函数(实际是__HAL_RCC_GPIOB_CLK_ENABLE函数)。开启时钟
之后,我们就先通过HAL_GPIO_WritePin(LED1_GPIO, LED1_GPIO_PIN, GPIO_PIN_SET)函数设置
PB0初始化为高电平。然后设置可以来配置IO引脚的功能,这里我们需要把PB0引脚配置为推挽
输出模式,调用HAL_GPIO_Init(LED1_GPIO, &GPIO_InitStruct)函数实现初始化配置。
  在初始化PB0之后,就可以使用HAL_GPIO_WritePin函数非常方便控制输出的高电平或者低电平。
   
  
【2】跳线帽情况
******* 为保证例程正常运行,必须插入以下跳线帽 **********
丝印编号     IO端口      目标功能引脚        出厂默认设置
  JP3        PB0           LED1               已接入
  JP4        PG6           LED2               已接入
  JP5        PG7           LED3               已接入
  
【3】操作及现象
  使用开发板配套的MINI USB线连接到开发板标示“调试串口”字样的MIMI USB接口为开发板供电。
下载完程序之后,可以观察到开发板上三颗LED以不同形式先后亮灭。
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/


bsp_led.h文件内容:

  1. #ifndef __BSP_LED_H__
  2. #define __BSP_LED_H__

  3. /* 包含头文件 ----------------------------------------------------------------*/
  4. #include "stm32f1xx_hal.h"

  5. /* 类型定义 ------------------------------------------------------------------*/
  6. typedef enum
  7. {
  8.   LED_OFF = 0,
  9.   LED_ON  = 1,
  10.   LED_TOGGLE = 2,
  11. }LEDState_TypeDef;
  12. #define IS_LED_STATE(STATE)           (((STATE) == LED_OFF) || ((STATE) == LED_ON) || ((STATE) == LED_TOGGLE))

  13. /* 宏定义 --------------------------------------------------------------------*/
  14. #define LED1                          (uint8_t)0x01
  15. #define LED2                          (uint8_t)0x02
  16. #define LED3                          (uint8_t)0x04
  17. #define IS_LED_TYPEDEF(LED)           (((LED) == LED1) || ((LED) == LED2) || ((LED) == LED3))

  18. /*
  19. * 以下宏定义内容跟开发板硬件息息相关,需要查看开发板电路原理图才能正确编写。
  20. * 例如,查原理图可在LED1灯接在stm32f103芯片的PB0引脚上,所以有关LED1的宏定义
  21. * 都是与GPIOB,GPIO_Pin_0相关的,我们专门把这些与开发板硬件相关的内容定义为宏,
  22. * 这对于修改或者移植程序非常方便。
  23. */
  24. #define LED1_RCC_CLK_ENABLE()         __HAL_RCC_GPIOB_CLK_ENABLE()
  25. #define LED1_GPIO_PIN                 GPIO_PIN_0
  26. #define LED1_GPIO                     GPIOB


  27. #define LED2_RCC_CLK_ENABLE()         __HAL_RCC_GPIOG_CLK_ENABLE()
  28. #define LED2_GPIO_PIN                 GPIO_PIN_6
  29. #define LED2_GPIO                     GPIOG


  30. #define LED3_RCC_CLK_ENABLE()         __HAL_RCC_GPIOG_CLK_ENABLE()
  31. #define LED3_GPIO_PIN                 GPIO_PIN_7
  32. #define LED3_GPIO                     GPIOG

  33. #define LED1_ON                       HAL_GPIO_WritePin(LED1_GPIO,LED1_GPIO_PIN,GPIO_PIN_SET)    // 输出高电平
  34. #define LED1_OFF                      HAL_GPIO_WritePin(LED1_GPIO,LED1_GPIO_PIN,GPIO_PIN_RESET)  // 输出低电平
  35. #define LED1_TOGGLE                   HAL_GPIO_TogglePin(LED1_GPIO,LED1_GPIO_PIN)                // 输出反转

  36. #define LED2_ON                       HAL_GPIO_WritePin(LED2_GPIO,LED2_GPIO_PIN,GPIO_PIN_SET)    // 输出高电平
  37. #define LED2_OFF                      HAL_GPIO_WritePin(LED2_GPIO,LED2_GPIO_PIN,GPIO_PIN_RESET)  // 输出低电平
  38. #define LED2_TOGGLE                   HAL_GPIO_TogglePin(LED2_GPIO,LED2_GPIO_PIN)                // 输出反转

  39. #define LED3_ON                       HAL_GPIO_WritePin(LED3_GPIO,LED3_GPIO_PIN,GPIO_PIN_SET)    // 输出高电平
  40. #define LED3_OFF                      HAL_GPIO_WritePin(LED3_GPIO,LED3_GPIO_PIN,GPIO_PIN_RESET)  // 输出低电平
  41. #define LED3_TOGGLE                   HAL_GPIO_TogglePin(LED3_GPIO,LED3_GPIO_PIN)                // 输出反转


  42. /* 扩展变量 ------------------------------------------------------------------*/
  43. /* 函数声明 ------------------------------------------------------------------*/
  44. void LED_GPIO_Init(void);
  45. void LEDx_StateSet(uint8_t LEDx,LEDState_TypeDef state);

  46. #endif  // __BSP_LED_H__

  47. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/

复制代码



bsp_led.c文件内容:

  1. /**
  2.   ******************************************************************************
  3.   * 文件名程: bsp_led.c
  4.   * 作    者: 硬石嵌入式开发团队
  5.   * 版    本: V1.0
  6.   * 编写日期: 2015-10-04
  7.   * 功    能: 基于HAL库的板载LED灯底层驱动实现
  8.   ******************************************************************************
  9.   * 说明:
  10.   * 本例程配套硬石stm32开发板YS-F1Pro使用。
  11.   *
  12.   * 淘宝:
  13.   * 论坛:[url]http://www.ing10bbs.com[/url]
  14.   * 版权归硬石嵌入式开发团队所有,请勿商用。
  15.   ******************************************************************************
  16.   */
  17. /**
  18.   * 很多初学者可能会疑惑bsp_led.c和bsp_led.h这两个文件哪里来的?是不是官方下载
  19.   * 的?实际上,这两个文件是要求我们自己创建的,内容也是我们自己敲代码的。
  20.   * 这个已经属于应用层次的代码ST官方是不提供的,需要我们根据自己的开发板硬件来
  21.   * 编写我们的程序,所以需要我们自己新建文件编写。
  22.   */

  23. /* 包含头文件 ----------------------------------------------------------------*/
  24. #include "led/bsp_led.h"

  25. /* 私有类型定义 --------------------------------------------------------------*/
  26. /* 私有宏定义 ----------------------------------------------------------------*/
  27. /* 私有变量 ------------------------------------------------------------------*/
  28. /* 扩展变量 ------------------------------------------------------------------*/
  29. /* 私有函数原形 --------------------------------------------------------------*/
  30. /* 函数体 --------------------------------------------------------------------*/

  31. /**
  32.   * 函数功能: 板载LED灯IO引脚初始化.
  33.   * 输入参数: 无
  34.   * 返 回 值: 无
  35.   * 说    明:使用宏定义方法代替具体引脚号,方便程序移植,只要简单修改bsp_led.h
  36.   *           文件相关宏定义就可以方便修改引脚。
  37.   */
  38. void LED_GPIO_Init(void)
  39. {
  40.    /* 定义IO硬件初始化结构体变量 */
  41.   GPIO_InitTypeDef GPIO_InitStruct;
  42.      
  43.     /* 使能(开启)LED引脚对应IO端口时钟 */
  44.   LED1_RCC_CLK_ENABLE();
  45.   LED2_RCC_CLK_ENABLE();
  46.   LED3_RCC_CLK_ENABLE();
  47.    
  48.   /* 配置LED1引脚输出电压 */
  49.   HAL_GPIO_WritePin(LED1_GPIO, LED1_GPIO_PIN, GPIO_PIN_RESET);

  50.   /* 配置LED2引脚输出电压 */
  51.   HAL_GPIO_WritePin(LED2_GPIO, LED2_GPIO_PIN, GPIO_PIN_RESET);
  52.   /* 配置LED3引脚输出电压 */
  53.   HAL_GPIO_WritePin(LED2_GPIO, LED3_GPIO_PIN, GPIO_PIN_RESET);
  54.    
  55.   /* 设定LED1对应引脚IO编号 */
  56.   GPIO_InitStruct.Pin = LED1_GPIO_PIN;
  57.   /* 设定LED1对应引脚IO为输出模式 */
  58.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  59.   /* 设定LED1对应引脚IO操作速度 */
  60.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  61.   /* 初始化LED1对应引脚IO */
  62.   HAL_GPIO_Init(LED1_GPIO, &GPIO_InitStruct);
  63.    
  64.   /* 设定LED2对应引脚IO编号 */
  65.   GPIO_InitStruct.Pin = LED2_GPIO_PIN;
  66.   /* 设定LED2对应引脚IO为输出模式 */
  67.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  68.   /* 设定LED2对应引脚IO操作速度 */
  69.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  70.   /* 初始化LED2对应引脚IO */
  71.   HAL_GPIO_Init(LED2_GPIO, &GPIO_InitStruct);
  72.    
  73.   /* 设定LED3对应引脚IO编号 */
  74.   GPIO_InitStruct.Pin = LED3_GPIO_PIN;
  75.   /* 设定LED3对应引脚IO为输出模式 */
  76.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  77.   /* 设定LED3对应引脚IO操作速度 */
  78.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  79.   /* 初始化LED3对应引脚IO */
  80.   HAL_GPIO_Init(LED3_GPIO, &GPIO_InitStruct);
  81.    
  82. }

  83. /**
  84.   * 函数功能: 设置板载LED灯的状态
  85.   * 输入参数: LEDx:其中x可甚至为(1,2,3)用来选择对应的LED灯
  86.   * 输入参数:state:设置LED灯的输出状态。
  87.   *             可选值:LED_OFF:LED灯灭;
  88.   *                     LED_ON: LED灯亮。
  89.   *                     LED_TOGGLE:反转LED
  90.   * 返 回 值: 无
  91.   * 说    明:该函数使用类似标准库函数的编程方法,方便理解标准库函数编程思想。
  92.   */
  93. void LEDx_StateSet(uint8_t LEDx,LEDState_TypeDef state)
  94. {
  95.   /* 检查输入参数是否合法 */
  96.   assert_param(IS_LED_TYPEDEF(LEDx));
  97.   assert_param(IS_LED_STATE(state));
  98.    
  99.   /* 判断设置的LED灯状态,如果设置为LED灯灭 */
  100.   if(state==LED_OFF)
  101.   {
  102.     if(LEDx & LED1)            
  103.       LED1_OFF;/* LED1灭 */
  104.      
  105.     if(LEDx & LED2)
  106.       LED2_OFF;/* LED2灭 */
  107.      
  108.     if(LEDx & LED3)
  109.       LED3_OFF;/* LED3灭 */   
  110.   }
  111.   else if(state==LED_ON) /* 设置LED灯为亮 */
  112.   {
  113.     if(LEDx & LED1)
  114.       LED1_ON;/* LED1亮 */
  115.      
  116.     if(LEDx & LED2)
  117.       LED2_ON;/* LED2亮 */
  118.      
  119.     if(LEDx & LED3)
  120.       LED3_ON;/* LED3亮 */
  121.   }
  122.   else
  123.   {
  124.     if(LEDx & LED1)
  125.       LED1_TOGGLE;/* 设置引脚输出反转 */
  126.      
  127.     if(LEDx & LED2)
  128.       LED2_TOGGLE;/* 设置引脚输出反转 */
  129.      
  130.     if(LEDx & LED3)
  131.       LED3_TOGGLE;/* 设置引脚输出反转 */
  132.   }
  133. }

  134. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/

复制代码




Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top