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

STM32L4系列四之跑马灯实验

[复制链接]
STMCU小助手 发布时间:2022-11-17 18:24
主要内容:
1)STM32L4 IO 口简介;
2)硬件设计;
3)实验准备;
4)STM32CubeMX 配置 IO 口输入;
5)部分代码解读。

一、STM32L4 IO 简介
在讲解跑马灯实验案例之前,先通过跑马灯例程学习一下一个工程文件的分类(个人觉得原子哥写的工程文件分类清晰,方便整理),如下图所示:
20201206125410554.jpg

简单说明下工程目录下面的组以及重要文件:
1)①组USER下面主要存放用户代码。system_stm32l4xx.c文件用户不用修改,stm32l4xx_it.c 里面存放的是中断服务函数,main.c函数主要存放主函数;
2)②组CORE下面主要存放固件库必须的核心头文件和启动文件。这些文件用户不用修改,可以根据芯片型号选择对应的启动文件;
3)③组SYSTEM是原子哥提供的共用代码,比较好用;
4)④组HALLIB下面主要存放ST官方提供的HAL库文件;
5)⑤组HARDWARE下面主要存放每个实验的外设驱动代码,通过调用HALLIB下面的HAL库文件函数实现,如led.c中函数调用stm32l4xx_hal_gpio.c内定义的函数对led进行初始化。

同STM32F1一样,STM32L4的IO由软件配置成如下8种模式中的任何一种(可关注其他文章,有更详细的讲解):
1、输入浮空
2、输入上拉
3、输入下拉
4、模拟输入
5、开漏输出
6、推挽输出
7、推挽式复用功能
8、开漏式复用功能

操作IO口的简单步骤为:
1) 使能 IO 口时钟,调用函数__HAL_RCC_GPIOX_CLK_ENABLE(其中 X=A~K);
2) 初始化IO参数,调用函数 HAL_GPIO_Init();
3) 操作IO输入输出。

实验功能简介:
开机上电后,先初始化与RGB灯连接的IO口,然后每500ms改变一下RGB灯的颜色,实现类似跑马灯的效果。

二、硬件设计
本章用到的硬件只有RGB灯。LED_R接PE7,LED_G接PE8,LED_B接PE9,连接原理图如下图所示:

20201206130905189.jpg

三、实验准备
1)使用Micro USB线将PC的USB口与潘多拉开发板的ST LINK USB口连接起来;
2)打开实验1跑马灯(RGB)实验例程,编译通过后将程序下载到MCU;
3)实验结果验证。

四、STM32CubeMX 配置 IO 口输出
关于STM32CubeMX工具的入门使用之前有讲过,这里不再重复。本节主要介绍怎么配置GPIO口的相关参数。
打开 STM32CubeMX 工具
GPIO口的配置步骤如下:
第一步,在引脚图中选择要配置的IO口,以PE7为例,在弹出的下拉菜单中选择要配置的IO口模式,如下图所示:

20201206193028914.jpg

上图的下拉菜单中,除了配置IO口为输入输出之外,还可以选择IO口的复用功能或者作为外部中断引脚功能,比如要选择IO口复用为SAI1功能,那么选择SAI1_SD_B即可。对于跑马灯实验,PE7作为输出,所以选择GPIO_Output。

第二步,进入Configuration->GPIO,在弹出的界面配置IO口的详细参数,如下图所示:

20201206193401434.jpg

20201206193419926.jpg

在IO口详细参数配置界面,点击要配置的IO口,会在窗口下方显示该 IO 口配置的详细参数表,这些配置项的含义具体为:
1)GPIO output level:默认输出电平,可设为Low和High,即低电平或高电平,本实验默认关闭LED_R、LED_G和LED_B,择设为 High;
2)GPIO mode:用来设置输出模式为:Output Push Pull(推挽输出)或Output Open Drain(开漏输出),本实验均设置为推挽输出;
3)选项GPIO Pull-up/Pull-down用来设置IO口是上拉/下拉/没有上下拉。本实验设置为上拉(Pull-up);
4)选项Maxinum ouput speed用来设置输出速度为超高速(Very High)/高速(High)/中速(Medium)/低速(Low),本实验设置为高速 High;
5)选项User Label是用来设置初始化的IO口Pin值为我们自定义的宏,一般可以不用设置。
PE8 和 PE9 的配置方法和参数都一样,就不重复讲解。

GPIO配置完成后。

打开工程的main.c文件,该文件内部由STM32CubeMX生成函数MX_GPIO_Init,内容如下:
  1. static void MX_GPIO_Init(void)
  2. {
  3. GPIO_InitTypeDef GPIO_InitStruct;
  4. /* GPIO Ports Clock Enable */
  5. __HAL_RCC_GPIOH_CLK_ENABLE();
  6. __HAL_RCC_GPIOE_CLK_ENABLE();
  7. /*Configure GPIO pin Output Level */
  8. HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_SET);
  9. /*Configure GPIO pins : PE7 PE8 PE9 */
  10. GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
  11. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  12. GPIO_InitStruct.Pull = GPIO_PULLUP;
  13. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  14. HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
  15. }
复制代码

五、部分函数解读
对案例库进行适当修改后(主要将两个子函数分离出来,这样代码显得清晰),部分代码如下:
1)main.c函数

  1. /**
  2. ********************************  STM32L4x  *********************************
  3. * @文件名称: main.c
  4. * @修改作者: 闲人Ne
  5. * @库版本号: V3.5.0
  6. * @工程版本: V1.0.0
  7. * @开发日期: 2020年12月07日
  8. * @摘要简述: 主函数
  9. ******************************************************************************/
  10. /*----------------------------------------------------------------------------
  11. * @更新日志:
  12. * @无
  13. * ---------------------------------------------------------------------------*/
  14. /* Includes ------------------------------------------------------------------*/
  15. #include "stm32l4xx_hal.h"
  16. #include "led.h"    // 初始化LED灯的引脚配置
  17. #include "sys.h"    // 初始化时钟用
  18. #include "delay.h"
  19. /************************************************
  20. 函数名称:int main()
  21. 函数功能:主函数
  22. 入口参数:无
  23. 返回参数:无
  24. *************************************************/
  25. int main(void)
  26. {
  27. u8 color=0;
  28. HAL_Init();
  29. SystemClock_Config();
  30. MX_LED_Init();
  31. delay_init(80);     // 初始化延时函数,80M系统时钟
  32. while (1)
  33. {
  34.   switch(color%8)       // 取余数
  35.   {
  36.    case 0:             // 余数为0时
  37.     LED_R(0);
  38.     LED_G(0);
  39.     LED_B(0);
  40.     break;
  41.    case 1:       // 余数为1时
  42.     LED_R(0);
  43.     LED_G(0);
  44.     LED_B(1);
  45.     break;
  46.    case 2:       // 余数为2时
  47.     LED_R(0);
  48.     LED_G(1);
  49.     LED_B(0);
  50.     break;
  51.    case 3:       // 余数为3时
  52.     LED_R(0);
  53.     LED_G(1);
  54.     LED_B(1);
  55.     break;
  56.    case 4:       // 余数为4时
  57.     LED_R(1);
  58.     LED_G(0);
  59.     LED_B(0);
  60.     break;
  61.    case 5:       // 余数为5时
  62.     LED_R(1);
  63.     LED_G(0);
  64.     LED_B(1);
  65.     break;
  66.    case 6:       // 余数为6时
  67.     LED_R(1);
  68.     LED_G(1);
  69.     LED_B(0);
  70.     break;
  71.    case 7:       // 余数为7时
  72.     LED_R(1);
  73.     LED_G(1);
  74.     LED_B(1);
  75.     break;
  76.    default:
  77.     break;
  78.   }
  79.   color++;
  80.   delay_ms(500);    // 延时500ms就改变一次颜色
  81. }
  82. }
  83. /****** Copyright (C)2020 闲人Ne. All Rights Reserved ****** END OF FILE *******/
复制代码

2)led.h头文件

  1. /**
  2. ********************************  STM32L4x  *********************************
  3. * @文件名称: led.h
  4. * @修改作者: 闲人Ne
  5. * @库版本号: V3.5.0
  6. * @工程版本: V1.0.0
  7. * @开发日期: 2020年12月07日
  8. * @摘要简述: led.h头文件
  9. ******************************************************************************/
  10. /*----------------------------------------------------------------------------
  11. * @更新日志:
  12. * @无
  13. * ---------------------------------------------------------------------------*/
  14. #ifndef __LED_H
  15. #define __LED_H
  16. /* RGB接口定义 ----------------------------------------------------------------*/
  17. #define LED_R(n)     (n?HAL_GPIO_WritePin(GPIOE,GPIO_PIN_7,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOE,GPIO_PIN_7,GPIO_PIN_RESET))
  18. #define LED_R_TogglePin  HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_7)    // LED_R电平翻转
  19. #define LED_G(n)     (n?HAL_GPIO_WritePin(GPIOE,GPIO_PIN_8,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOE,GPIO_PIN_8,GPIO_PIN_RESET))
  20. #define LED_G_TogglePin   HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_8)   // LED_G电平翻转
  21. #define LED_B(n)     (n?HAL_GPIO_WritePin(GPIOE,GPIO_PIN_9,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOE,GPIO_PIN_9,GPIO_PIN_RESET))
  22. #define LED_B_TogglePin   HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_9)   // LED_B电平翻转
  23. /* 函数申明 ------------------------------------------------------------------*/
  24. void MX_LED_Init(void);
  25. #endif /* __LED_H */
  26. /****** Copyright (C)2020 闲人Ne. All Rights Reserved ****** END OF FILE *******/
复制代码

3)led.c源文件

  1. /**
  2. ********************************  STM32L4x  *********************************
  3. * @文件名称: led.c
  4. * @修改作者: 闲人Ne
  5. * @库版本号: V3.5.0
  6. * @工程版本: V1.0.0
  7. * @开发日期: 2020年12月07日
  8. * @摘要简述: led.c源文件
  9. ******************************************************************************/
  10. /*----------------------------------------------------------------------------
  11. * @更新日志:
  12. * @无
  13. * ---------------------------------------------------------------------------*/
  14. /* Includes ------------------------------------------------------------------*/
  15. #include "led.h"
  16. #include "stm32l4xx_hal.h"
  17. /************************************************
  18. 函数名称:MX_LED_Init()
  19. 函数功能:LED管脚配置
  20. 入口参数:无
  21. 返回参数:无
  22. *************************************************/
  23. void MX_LED_Init(void)
  24. {
  25.   GPIO_InitTypeDef GPIO_InitStruct;
  26.   /* GPIO Ports Clock Enable */
  27.   __HAL_RCC_GPIOH_CLK_ENABLE();
  28.   __HAL_RCC_GPIOE_CLK_ENABLE();
  29.   /*Configure GPIO pin Output Level */
  30.   HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_SET);
  31.   /*Configure GPIO pins : PE7 PE8 PE9 */
  32.   GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
  33.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  34.   GPIO_InitStruct.Pull = GPIO_PULLUP;
  35.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  36.   HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
  37. }
  38. /****** Copyright (C)2020 闲人Ne. All Rights Reserved ****** END OF FILE *******/
复制代码

备注:在用STM32CubeMX生成代码的时候,main函数里的SystemClock_Config()子函数里少一行代码 RCC_OscInitStruct.PLL.PLLM = 1,导致前期在main函数里设延迟时间,总感觉与实际时间不符。补上这行代码后就好了。
————————————————
版权声明:天亮继续睡

收藏 评论0 发布时间:2022-11-17 18:24

举报

0个回答

所属标签

相似分享

官网相关资源

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