目录
1. 在工程文件夹下,新建文件夹 HAL_00_PROJECT_SOURCE;
3. 将 HAL_01_LED_TEST 下的所有文件复制粘贴到 HAL_00_PROJECT_SOURCE 中;
4. 打开HAL_00_PROJECT_SOURCE中的,进行GPIO引脚配置。
5. 打开HAL_00_PROJECT_SOURCE中的,查看。
第二步: 中间层BSP的建立(基于HAL_01_LED_TEST文件)
一、GPIO编程
编程配置GPIO来实现对LED灯的简单控制。
第一步: 搭建工程框架
1. 在工程文件夹下,新建文件夹 HAL_00_PROJECT_SOURCE;
2. 利用STM32CubeMX生成工程基础框架:
选择MCU
选择外部晶振
配置时钟树
设置工程信息:命名、路径、编程软件、生成文件
生成代码
注意:生成的工程中缺少启动文件,需要手动添加!(G431有这个问题,F103无)
- 将启动文件复制粘贴到 MDK-ARM 文件夹中;
- 打开工程,添加启动文件:
- 添加成功后,即可在应用层查看:
- 进行测试:
编译无误后,关闭工程。
3. 将 HAL_01_LED_TEST 下的所有文件复制粘贴到 HAL_00_PROJECT_SOURCE 中;
4. 打开HAL_00_PROJECT_SOURCE中的
,进行GPIO引脚配置。
将PC8~PC12、PD2配置为输出
配置GPIO的工作模式
上电默认LED灯全灭(PC8~PC12为高电平)、锁存器不通(PD2为低电平)、全部为推挽输出、全部无上下拉、全部为低速
所有配置完成后,生成代码
5. 打开HAL_00_PROJECT_SOURCE中的
,查看
。
GPIO的初始化函数已经生成,可以移植了
GPIO的数据结构
GPIO的HAL库函数
6. 这两个文件夹的作用:
- HAL_00_PROJECT_SOURCE:移植生成的GPIO配置函数。
- HAL_01_LED_TEST:进行主函数的自主编程。
7. 了解工程文件HAL_01_LED_TEST结构:
-
应用层包含在中Core中;
-
驱动层包含在Drivers中;
-
两者直接缺少连接,所以需要建立中间层BSP。
第二步: 中间层BSP的建立(基于HAL_01_LED_TEST文件)
1、新建中间层的 .c 和 .h 文件
2、在工程里添加中间层的 .c 和 .h 文件
删除原有的gpio.c
添加中间层BSP、BSP_LED.c
添加BSP_LED.h
添加成功
3、移植STM32CubeMX生成的GPIO配置
BSP_LED.c编程(将GPIO配置移植进来)
//引入头文件
#include "BSP_LED.h"
/*
从HAL_00_PROJECT_SOURCE中移植GPIO配置函数,
将原来的函数名修改为LED_Init
*/
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_SET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
/*Configure GPIO pins : PC13 PC14 PC15 PC8
PC9 PC10 PC11 PC12 */
GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/*Configure GPIO pin : PD2 */
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}
BSP_LED.h编程(声明初始化函数)
#include "main.h"
void LED_Init(void);
main.c编程(从驱动层调用Write_Pin函数)
#include "main.h"
#include "BSP_LED.h"//引入头文件
int main(void)
{
HAL_Init();
SystemClock_Config();
LED_Init();//初始化
while (1)
{
/*HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
GPIO A~G GPIO 0~15 GPIO状态 */
/*
SET:置位,高电平
RESET:复位,低电平
*/
//点亮LED8
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET);//复位,低电平点亮
//锁存器
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET); //开锁存
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET); //关锁存
}
}
程序运行结果
第三步:优化程序
为了简化主函数中的程序,在BSP_LED.c中对程序进行优化。
BSP_LED.c新增LED_Show函数
/*
函数名:LED_Show
函数功能:LD8-LD1对应ucLED的8位
入口参数:ucLED
出口参数:void
*/
void LED_Show(unsigned char ucLED)
{
//将所有LED熄灭(所有引脚置位-高电平)
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
//ucLED左移,挨个将置位的引脚复位
HAL_GPIO_WritePin(GPIOC, ucLED<<8, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}
BSP_LED.h中声明
#include "main.h"
void LED_Init(void);
void LED_Show(unsigned char ucLED);
main.c中简化后的程序
int main(void)
{
HAL_Init();
SystemClock_Config();
LED_Init();
while (1)
{
//此时为高电平点亮
LED_Show(0x00);//全灭
HAL_Delay(500);//延时0.5s
LED_Show(0x01);//LD1点亮
HAL_Delay(500);//延时0.5s
}
}
程序运行结果
GPIO控制LED程序到这里就结束了,下一章节将对程序进行详细剖析。
【参考教程:蚂蚁工厂科技-蓝桥杯嵌入式设计与开发基于STM32G431】