一 STM32CubeMX实例教程一

您所在的位置:网站首页 双向跑马灯程序设计 一 STM32CubeMX实例教程一

一 STM32CubeMX实例教程一

2024-07-14 17:37| 来源: 网络整理| 查看: 265

一 STM32CubeMX实例教程一——跑马灯实验

本章节将利用STM32CubeMX和Keil5协同开发,实现跑马灯。实现方法涵盖:

GPIO电平输出的HAL库函数 HAL_GPIO_TogglePin GPIO电平翻转的HAL库函数 HAL_GPIO_WritePin

所用工具:

1、芯片: STM32F103ZET6

2、软件:STM32CubeMx、MDK-Keil

3、STM32F1xx/STM32F4xxHAL库

知识准备: 关于GPIO:

GPIO:General Purpose Input & Output

STM32芯片拥有 GPIOA、GPIOB…GPIOG 等7组端口,每组端口最多拥有 Pin0、Pin1…Pin15 共16个引脚。

GPIO端口可以由软件配置模式: 推挽输出、开漏输出、推挽式复用功能、开漏式复用功能; 模拟输入、浮空输入、下拉输入、上拉输入。 共8种,每个I/O端口都可以自由编程。

关于函数:

GPIO电平输出的HAL库函数

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); 参数1:GPIOx,端口号,如:GPIOB,GPIOC。 参数2:GPIO_Pin,引脚号,如:GPIO_PIN_9,GPIO_PIN_10。 参数3:PinState,引脚输出状态。高电平:GPIO_PIN_SET;低电平:GPIO_PIN_RESET。 返回值:void,空。 如:向PB8引脚输出高电平 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);

GPIO电平翻转的HAL库函数

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 参数1:GPIOx,端口号,如:GPIOB,GPIOF。 参数2:GPIO_Pin,引脚号,如:GPIO_PIN_9,GPIO_PIN_10。 返回值:void,空。 如:将PB8引脚输出电平翻转。 HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_8);

进入STM32CubeMX和keil5实现 ①新建工程

在主界面选择 File—>New Project,或者直接点击 ACCEE TO MCU SELECTOR,一般直接搜索自己芯片的型号即可,选择后点击右上角 Start Project 。

在这里插入图片描述

②配置芯片

1 在左侧MCU外设资源选择一栏,选择 SYS,Debug 选择 Serial Wire 串行总线数据,在右侧预览区中看到芯片相应的IO引脚会变为调试引脚。

在这里插入图片描述

2 时钟配置

点击 RCC,高速时钟 HSE 与 低速时钟 LSE 选择外部晶振,可以看到芯片响应IO引脚会变为绿色,即时钟引脚配置完成。

与我们配置库函数的时候基本一样,但是 STM32CubeMx 将这些转换为图形和选项 ,我们配置的时候不用再去配置各种东西,只需要傻瓜式操作便可以配置我们需要的外设,这便是CubeMx的核心所在。

在这里插入图片描述

3 时钟源设置,进入 Clock Configuration 界面,配置 STM32 的时间框图。

在这里插入图片描述

4 初始化GPIO

结合自己芯片的 LED 灯引脚,在右侧预览图中点击对应管脚,即可设置该引脚的各种功能。

在这里插入图片描述

如要设置为输出模式,则选择模式 GPIO_Output。以 PB5 口为例:

在这里插入图片描述

浅黄色表示不可配置引脚。如电源专用引脚以黄色突出显示。其配置不能更改。

在这里插入图片描述 黄色表示配置了一个I/O口的功能,但是没有初始化相对应的外设功能。引脚处于 No Mode 状态。

在这里插入图片描述 绿色表示 I/O 口配置成功。

配置后在左侧系统预览可以查看配置的各种外设和GPIO的状态。

img表示没有问题。

img表示警告,对应配置出现问题,点击该选项即可外设配置界面查看。

具体各个功能的配置(UATR / DMA / ADC / TIM 等),接下来的文章会一一讲解。

在这里插入图片描述

③工程管理

完成上面的配置后,接下来进行工程配置。

1 如图配置,工程名称、存储路径、IDE我们使用的是 MDK5,其他的默认即可!记住存储目录不可有中文

在这里插入图片描述

2 我们可以在Code Generator 界面进一步配置,自行选择方式即可,我一般选择 Copy all 。

各有优缺点:

img

将HAL库的所有.C和.H都复制到所建工程中

优点:这样如果后续需要新增其他外设又可能不再用STM32CubeMX的时候便会很方便

缺点: 体积大,编译时间长(很长)

img

只复制所需要的.C和.H (推荐)

优点:体积相对小,编译时间短,并且工程可复制拷贝

缺点: 新增外设时需要重新用STM32CubeMX导入

img

不复制文件,直接从软件包存放位置导入.C和.H

优点:体积小,比较节约硬盘空间

缺点: 复制到其他电脑上或者软件包位置改变,就需要修改相对应的路径

在这里插入图片描述

3 点击右上角 GENERATE CODE 创建工程

在这里插入图片描述

用 Keil5 打开工程

在main.c文件中能看到/* USER CODE BEGIN XXX */ /* USER CODE END XXX */,我们写的代码就放在这之间

这样我们修改工程的时候你自己写的代码就不会被删除

/* Includes ------------------------------------------------------------------*/ #include "main.h" #include "gpio.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ 添加头文件区 /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ 添加typedef区 /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ 添加define区 /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ 添加宏区 /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ 添加变量区 /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ 添加函数区 /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ 添加代码区 /* USER CODE END 0 */

在 while 循环添加下面两行代码即可,用电平翻转实现。

(此处我用STM32F103ZET6芯片 PB5 的 LED0 与 PE5 的 LED1 来举例)

【需要注意】由原理图可知该芯片的 LED 是上接 VCC,因此要将芯片 I/O 口配置为低电平点亮,高电平熄灭,与一般芯片相反。

我用芯片初学的时候,就是在这地方发生疏忽,用 HAL_GPIO_WritePin() 函数没电亮 LED,排查浪费了时间。

在这里插入图片描述

/* USER CODE BEGIN WHILE */ while (1) { HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);//用翻转电平的方式,实现LED0灯的点亮与熄灭 HAL_Delay(500);//延时500ms /* USER CODE END WHILE */

或用 HAL_GPIO_WritePin() 函数

/* USER CODE BEGIN WHILE */ while (1) { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);//向PB5输出高电平,熄灭LED0灯 HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET);//向PE5输出低电平,点亮LED1灯 HAL_Delay(500);//延时500ms HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);//向PB5输出低电平,点亮LED0灯 HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET);//向PE5输出高电平,熄灭LED1灯 HAL_Delay(500);//延时500ms /* USER CODE END WHILE */ 烧录进芯片,成功实现。

GPIO初始化函数源码剖析 void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO端口时钟使能 */ __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /*配置GPIO端口引脚的初始化输出电平 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET); /*配置GPIO端口引脚的初始化输出电平 */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET); /*配置GPIO端口输出引脚 : PE5 */ GPIO_InitStruct.Pin = GPIO_PIN_5; //GPIO端口的引脚号:5 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //GPIO的模式:推挽输出 GPIO_InitStruct.Pull = GPIO_NOPULL; //没有上拉 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; //GPIO的输出速度:非常低速 HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); //将参数结构设置到GPIOE端口 /*配置GPIO端口输出引脚 : PB5 */ GPIO_InitStruct.Pin = GPIO_PIN_5; //GPIO端口的引脚号:5 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //GPIO的模式:推挽输出 GPIO_InitStruct.Pull = GPIO_NOPULL; //没有上拉 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; //GPIO的输出速度:非常低速 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); //将参数结构设置到GPIOB端口 }

新手学写,敬请斧正!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3