蓝桥杯STM32G431学习之LED程序设计(一)


目录

一、GPIO编程

第一步: 搭建工程框架

1. 在工程文件夹下,新建文件夹 HAL_00_PROJECT_SOURCE;

2. 利用STM32CubeMX生成工程基础框架:

3. 将 HAL_01_LED_TEST 下的所有文件复制粘贴到 HAL_00_PROJECT_SOURCE 中;

4. 打开HAL_00_PROJECT_SOURCE中的​,进行GPIO引脚配置。

5. 打开HAL_00_PROJECT_SOURCE中的​,查看​。

6. 这两个文件夹的作用:

7. 了解工程文件HAL_01_LED_TEST结构:

第二步: 中间层BSP的建立(基于HAL_01_LED_TEST文件)

1、新建中间层的 .c 和 .h 文件

2. 在工程里添加中间层的 .c 和 .h 文件

3. 移植STM32CubeMX生成的GPIO配置

第三步:优化程序


一、GPIO编程

编程配置GPIO来实现对LED灯的简单控制。

第一步: 搭建工程框架

1. 在工程文件夹下,新建文件夹 HAL_00_PROJECT_SOURCE;

2. 利用STM32CubeMX生成工程基础框架:

选择MCU

选择外部晶振

配置时钟树

设置工程信息:命名、路径、编程软件、生成文件

生成代码

注意:生成的工程中缺少启动文件,需要手动添加!(G431有这个问题,F103无)

  1. 将启动文件复制粘贴到 MDK-ARM 文件夹中;
  2. 打开工程,添加启动文件:
  3. 添加成功后,即可在应用层查看:
  4. 进行测试:

    编译无误后,关闭工程。

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】

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不爱学习的刘.Sir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值