首页 > 其他分享 >蓝桥杯-STM32G431RBT6采用不同方式进行点亮LED灯(深层次剖析其原理并包含可能遇到的问题)

蓝桥杯-STM32G431RBT6采用不同方式进行点亮LED灯(深层次剖析其原理并包含可能遇到的问题)

时间:2024-09-09 13:53:13浏览次数:15  
标签:BEGIN CODE LED STM32G431RBT6 蓝桥 USER GPIO END RCC

系列文章

新建工程见上篇http://t.csdnimg.cn/LH8vj

一、原理部分

LED部分如上图,左侧为电阻和LED,右侧为锁存器(锁存器可以在输入信号发生变化时,将其状态锁定并保持,直到接收到新的触发信号。它主要用于存储数据或状态信息),当PD2置高电平的时候,右侧的状态才能够传输到左侧,本LED为低电平,当给Q端置低电平时,二极管导通,LED被点亮。

锁存器原理剖析

SN74HC573ADWR 是一款具有三态输出的八路透明 D 类锁存器,属于数字集成电路,以下是它的一些主要特点和功能:

  • 工作原理
    • 透明特性:当使能端(通常标记为 LE,Latch Enable)为高电平时,锁存器处于透明状态,此时输入数据(D 端)可以直接通过锁存器传送到输出端(Q 端),即输入数据的变化会立即反映在输出上。
    • 锁存功能:当使能端为低电平时,锁存器将保持当前的数据状态,不再随输入数据的变化而改变,实现了数据的锁存。
  • 三态输出:除了正常的逻辑高电平和低电平输出外,还具有高阻态输出。高阻态可以理解为一种 “断开” 状态,此时输出端既不是高电平也不是低电平,而是呈现非常高的阻抗,就像与后续电路断开连接一样。这在一些需要多个设备共享数据总线的系统中非常有用,可以通过控制锁存器的输出状态,避免多个设备同时驱动总线而产生冲突。
  • 八路锁存:具有八个独立的数据输入和输出通道,可同时对八路数据进行锁存和传输控制。例如,在需要同时处理多个并行数据信号的电路中,如数据采集系统、并行通信接口等,能够方便地实现对多组数据的同步操作。
  • 应用场景
    • 数据存储与缓冲:可用于暂时存储数据,防止数据丢失或在不同时钟域之间进行数据同步。比如在计算机系统中,用于在处理器和外部设备之间缓存数据。
    • 地址译码:在地址译码电路中,将地址信号锁存并进行译码,以确定特定的存储单元或设备的地址。
    • 信号切换与控制:通过控制锁存器的使能端,可以实现对信号的选通、切换和控制,灵活地控制数据的传输路径。

二、代码部分

1.配置工程

2.代码编写

1.知识点说明

    1.头文件说明

#ifndef _headfile_h 表示 “如果没有定义 _headfile_h”。

#define _headfile_h 则用于定义 _headfile_h

#endif 表示结束条件编译块

#stm32g4xx.h:这是针对 STM32G4 系列单片机的头文件,其中包含了该系列单片机的各种寄存器定义、中断向量表、外设配置等信息,是进行 STM32G4 系列单片机编程的重要基础。

#stdio.h:它提供了标准的输入输出功能,如 printf() 用于输出信息,scanf() 用于输入数据等。

#string.h:这个头文件主要包含了与字符串操作相关的函数,比如 strcpy()(字符串复制)、strlen()(字符串长度计算)、strcmp()(字符串比较)等。

#stdint.h:它定义了一些具有特定宽度的整数类型,如 uint8_tint16_t 等,有助于提高代码的可移植性和可读性。

      2.C语言语法说明

<<为左移,uint8_t 表示无符号 8 位整数类型,

HAL_GPIO_WritePin 函数用于将指定的 GPIO 引脚设置为指定的电平(高或低)。

HAL_GPIO_TogglePin 函数则用于切换指定 GPIO 引脚的电平状态,即如果当前是高电平,则切换为低电平;如果当前是低电平,则切换为高电平。

2.每间隔一个灯点亮各部分代码模块(2种方式)

FIRST.
code.c
#include "headfile.h"

void led_show()
{
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);	
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_10,GPIO_PIN_RESET);	
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_12,GPIO_PIN_RESET);	
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_RESET);		
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);

}
code.h
#ifndef _code_h
#define _code_h

void led_show(void);


#endif
headfile.h
#ifndef _headfile_h
#define _headfile_h

#include "stm32g4xx.h"
#include "stdio.h"
#include "string.h"
#include "stdint.h"


#include "main.h"
#include "gpio.h"

#include "code.h"


#endif
main.c
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2024 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "headfile.h"此处插入
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* 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 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {  
	  led_show();此处插入
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV3;
  RCC_OscInitStruct.PLL.PLLN = 20;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
SECOND.
   code.c
#include "headfile.h"

void led_show(uint8_t led,uint8_t mode)
{
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	if(mode)
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8<<(led-1),GPIO_PIN_RESET);
    else
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8<<(led -1),GPIO_PIN_RESET);
	
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);

}
   code.h
#ifndef _code_h
#define _code_h

#include "stm32g4xx.h"                  // Device header


void led_show(uint8_t led,uint8_t mode);


#endif
   headfile.h
#ifndef _headfile_h
#define _headfile_h

#include "stm32g4xx.h"
#include "stdio.h"
#include "string.h"
#include "stdint.h"


#include "main.h"
#include "gpio.h"

#include "code.h"


#endif
main.c
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2024 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "headfile.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* 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 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {  
	  led_show(1,1);
	   led_show(3,1);
	   led_show(5,1);
	   led_show(7,1);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV3;
  RCC_OscInitStruct.PLL.PLLN = 20;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

效果展示

标签:BEGIN,CODE,LED,STM32G431RBT6,蓝桥,USER,GPIO,END,RCC
From: https://blog.csdn.net/JK03820/article/details/141966745

相关文章

  • P2.5大厅会议室LED高清显示屏宽高尺寸定制灯珠IC
    P2.5大厅会议室LED高清显示屏宽高尺寸定制灯珠IC,室内会议室LED显示屏型号很多,比如有P2以下的小间距产品,以P1.6-P1.9等型号为代表,P2以上的常规高清产品型号以P2.5-P3为代表,间距越小的型号越适合近距离观看,一般P2以下的小间距产品主要应用场合为指挥中心、政府会议室、电视演......
  • Keycloak 报 failed to initialize keycloak
    在访问Keycloak的Account页面时,提示下列信息:在浏览器开发者工具的Network中看到下列403请求错误:报错解法经过查找(关键词failedtoinitializekeycloak403),在此帖子中找到了答案,需要在Client>AccountConsole中修改下列配置:在WebOrigins中设置“*”,默认此处为空。......
  • 第 18 场 小白入门赛(蓝桥)水浒专场!!
    第二题:情报传递1代码1(c++):#include<iostream>usingnamespacestd;intmain(){intt;cin>>t;while(t--){inta,b,c;cin>>a>>b>>c;intsteps=0;while(a<b){......
  • Pipeline流水线通过git拉取Jenkinsfile报错 error: RPC failed; result=22, HTTP code
    Pipeline流水线通过git拉取Jenkinsfile报错error:RPCfailed;result=22,HTTPcode=404在学习共享库时使用通过git拉取jenkinsfile时,报错在排查gitlab服务状态,网络通讯,防火墙规则以及Jenkins凭据均可以正常使用,最后发现的时在URL填写中缺少.git结尾所导致的,在了解后得知在......
  • 蓝桥杯【物联网】零基础到国奖之路:一.赛项介绍与软件安装
    蓝桥杯【物联网】零基础到国奖之路:1.赛项介绍与软件安装第一章大赛概述第二章软件安装1,jre-8u221-windows-x642,SetupSTM32CubeMX-5.3.03,mdk5234,Keil_STM32L0xx_DFP_2.0.15,CMSIS-DAP第一章大赛概述蓝桥杯(电子类)物联网设计与开发科目由北京四梯科技有限公司设计和......
  • OLED
    OLED:有机发光二极管,又称为有机激光显示ASCII字符:http://c.biancheng.net/c/ascii/内码:计算机使用的二进制字符编码,就叫内码,简称编码。将字符显示在OLED上:1,显示字符,必须先有其点阵数据,点阵数据的集合,叫做字库2,单片机根据点阵数据按取模方向进行描点还原,就能显示字符3,A......
  • J.U.C Review - 计划任务ScheduledThreadPoolExecutor源码分析
    文章目录TimeVSScheduledThreadPoolExecutor小DemoScheduledThreadPoolExecutor类结构ScheduledThreadPoolExecutor主要方法介绍scheduleDelayed接口ScheduledFuture接口RunnableScheduledFuture接口ScheduledFutureTask类scheduleAtFixedRatescheduleWithFixedDelayd......
  • 【STM32+HAL库】---- 硬件IIC驱动0.96OLED
    硬件开发板:STM32G0B1RET6软件平台:cubemax+keil+VScode内容原著声明代码借鉴学习于以下文章:STM32使用硬件IIC驱动0.96寸4针IOLED显示器(HAL库)1新建cubemax工程1.1配置系统时钟RCC1.2配置引脚1.3导出工程略…2代码2.1OLED_IIC_Config.h/*************......
  • 蓝桥杯嵌入式国三备赛经验分享
    1学习STM32入门视频向大家推荐一套宝藏级别的视频:【STM32入门教程-2023版细致讲解中文字幕】如果已经比过蓝桥杯单片机或学习过单片机相关课程的同学,你们可以尝试不需要STM32套件进行学习。如果没有学过单片机相关课程的同学,可以买套件边用边学。尽量把这套视频看完,无论......
  • FP7209:非同步升压恒流LED区动IC
    前言:LED驱动芯片是什么?LED驱动器(LEDDriver),是指驱动LED发光或LED模块组件正常工作的电源调整电子器件。由于LEDPN结的导通特性决定,它能适应的电源电压和电流变动范围十分狭窄,稍许偏离就可能无法点亮LED或者发光效率严重降低,或者缩短使用寿命甚至烧毁芯片。现行的工频电源和常......