你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 8053|回复: 7

[其他] 【HAL库每天一例】第002例:GPIO-流水灯

[复制链接]

122

主题

129

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-5-28
发表于 2016-5-7 09:49:33 | 显示全部楼层 |阅读模式
【HAL库每天一例】系列例程从今天开始持续更新。。。。。
我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。

例程下载:
资料包括程序、相关说明资料以及软件使用截图
链接:https://pan.baidu.com/s/1i574oPv
密码:r3s3

(硬石YS-F1Pro开发板HAL库例程持续更新\1. 软件设计之基本裸机例程(HAL库版本)\YSF1_HAL-002. GPIO-流水灯)

/**
  ******************************************************************************
  *                           硬石YS-F1Pro开发板例程功能说明
  *
  *  例程名称: YSF1_HAL-002. 流水灯
  *   
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  *
  * 淘宝:
  * 论坛:
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */

【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****/
复制代码

还有IAR具体设置的截图,太多了就不上传了,具体见百度云资料


<
回复

使用道具 举报

16

主题

3009

回帖

2

蝴蝶豆

论坛元老

最后登录
2020-11-30
发表于 2016-5-7 10:14:15 | 显示全部楼层
百度云我们地区不能用,按楼主的指引去你论坛同样是指向百度云
回复 支持 反对

使用道具 举报

122

主题

129

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-5-28
 楼主| 发表于 2016-5-7 10:17:58 | 显示全部楼层
lising 发表于 2016-5-7 10:14
百度云我们地区不能用,按楼主的指引去你论坛同样是指向百度云

你们一般使用什么工具共享资料的??
回复 支持 反对

使用道具 举报

16

主题

3009

回帖

2

蝴蝶豆

论坛元老

最后登录
2020-11-30
发表于 2016-5-7 10:26:20 | 显示全部楼层
直接传递。不知什么原因TMD百度云几年了都不能用。
回复 支持 反对

使用道具 举报

122

主题

129

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-5-28
 楼主| 发表于 2016-5-11 08:48:05 | 显示全部楼层
lising 发表于 2016-5-7 10:26
直接传递。不知什么原因TMD百度云几年了都不能用。

360云盘:http://yunpan.cn/OcPiRp3wEcA92u  访问密码 cfb6
不知可以下载不
回复 支持 反对

使用道具 举报

16

主题

3009

回帖

2

蝴蝶豆

论坛元老

最后登录
2020-11-30
发表于 2016-5-11 20:58:29 | 显示全部楼层
haohao663 发表于 2016-5-11 08:48
360云盘:http://yunpan.cn/OcPiRp3wEcA92u  访问密码 cfb6
不知可以下载不

特意为我做了这个链接,感激!下载保存了。
回复 支持 反对

使用道具 举报

0

主题

1

回帖

0

蝴蝶豆

新手上路

最后登录
2017-3-28
发表于 2017-2-27 00:36:33 | 显示全部楼层
这个分享都没有了吗
回复 支持 反对

使用道具 举报

122

主题

129

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-5-28
 楼主| 发表于 2017-6-30 08:48:35 | 显示全部楼层
更新资料下载:链接:https://pan.baidu.com/s/1nvtZhVV 密码:416v
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版