首页 > 编程语言 >STM32外设之GPIO&LED指示灯模块程序设计

STM32外设之GPIO&LED指示灯模块程序设计

时间:2024-11-12 16:43:45浏览次数:3  
标签:CODE LED PIN STM32 USER GPIO RCC

文章目录

一、STM32外设之GPIO

1.GPIO的8种工作模式:

模式配置模式寄存器输出类型寄存器输出速度寄存器上/下拉寄存器
输入浮空00不使用不使用00
输入上拉00不使用不使用01
输入下拉00不使用不使用10
模拟功能11不使用不使用00
开漏通用输出01100-速度2MHz00-无上下拉
推挽通用输出01001-速度25MHz01-上拉
复用开漏输出10110-速度-50MHz10-下拉
复用推挽输出01111-速度100MHz11-保留

注:输出模式中,输出速度寄存器和上/下拉寄存器的四种形式为四个输出模式共用。

1.1、浮空输入模式:
在这里插入图片描述a.CPU通过I/O端口→保护二极管→TTL肖特基触发器→输入数据寄存器→CPU读取到I/O端口的高低电平。(保护二极管:因为I/O端口信号不确定,所以需要添加二极管保护电路)
b.浮空模式下,I/O端口的电平信号直接输入到输入数据寄存器中,所以I/O端口电平是不确定的,完全由外部决定。

1.2、输入上拉模式:
在这里插入图片描述
a.作用:把不确定的信号通过电阻连接到高电平,默认情况下输入引脚数据为1(高电平)。
b.上拉输入与浮空输入的主要区别在于上拉电阻的闭合,且上拉电阻大小约为30-50KΩ。

1.3、输入下拉模式:
在这里插入图片描述
a.作用:把不确定的信号通过电阻连接到低电平,默认情况下输入引脚数据为0(低电平)。
b.下拉输入与浮空输入的主要区别在于下拉电阻的闭合。

1.4、高组态模拟输入模式:
在这里插入图片描述a.模拟输入模式中,上拉、下拉电阻和TTL施密特触发器均处于截止状态,导致CPU无法接收到输入数据寄存器传来的I/O端口的电平变化。
b.I/O端口的模拟信号直接模拟输入到片上外设模块。

1.5、开漏通用输出模式:
在这里插入图片描述

a.若输出控制电路接收到1(高电平),则N-MOS管截止,I/O端口处的电平仅仅取决于外部上拉或下拉。
b.若输出控制电路接收到0(低电平),则N-MOS管导通,I/O端口处的电平将被N-MOS管拉低。
c.在输出状态下,I/O端口处电平还可以用输入电路(I/O端口→输入数据寄存器→CPU读取)来读取。

1.6、推挽通用输出模式:
在这里插入图片描述a.若输出控制电路接收到1(高电平),则P-MOS导通,N-MOS截止,I/O端口处输出高电平。
b.若输出控制电路接收到0(低电平),则P-MOS截止,N-MOS导通,I/O断口处输出低电平。
c.在输出状态下,I/O端口处电平还可以用输入电路(I/O端口→输入数据寄存器→CPU读取)来读取。
1.7、推挽复用输出:
在这里插入图片描述推挽复用输出与推挽通用输出相似,区别在于输出的高低电平的来源,不是让CPU向置位/复位寄存器写1/0然后将其映射到输出数据寄存器中,而是利用片上外设模块的复用功能输出来决定的。
1.8、开漏复用输出:
在这里插入图片描述
开漏复用输出与开漏通用输出相似,区别在于输出的高低电平的来源,不是让CPU向置位/复位寄存器写1/0然后将其映射到输出数据寄存器中,而是利用片上外设模块的复用功能输出来决定的。

二、CT117E-M4的LED电路原理

原理图:
在这里插入图片描述

锁存器:LED和LCD有共用的引脚,为防止使用时出现混乱,往往会在LED电路中加一个573锁存器。
在这里插入图片描述
输出端:D0-D7;输入端Q0-Q7
LE高电平时信号可以从D传到Q,低电平时阻断。

三、LED指示灯模板程序设计

1.main.c(main.c文件是STM32项目的心脏,主要负责系统的初始化、时钟配置、外设设置以及主程序的执行逻辑。)

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2024 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "led\bsp_led.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* 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();
  LED_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
	LED_Disp(0x01);
	HAL_Delay(500);
	LED_Disp(0x02);
	HAL_Delay(500);
	LED_Disp(0x04);
	HAL_Delay(500);
	LED_Disp(0x08);
	HAL_Delay(500);
	LED_Disp(0x10);
	HAL_Delay(500);
	LED_Disp(0x20);
	HAL_Delay(500);
	LED_Disp(0x40);
	HAL_Delay(500);
	LED_Disp(0x80);
	HAL_Delay(500);
    /* 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 */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

HAL_Init():初始化HAL库,作为STM32硬件抽象层库,一般用于简化硬件访问。
SystemClock_Config():配置系统时钟。它通常涉及到外部高速时钟(HSE)、PLL(相位锁定环)和其他时钟分频器等等,以确保系统以所需的频率运行。
LED_Init():初始化LED外设。这个函数在bsp_led.h头文件对应的源文件中定义,用来配置控制LED的GPIO端口。
Error_Handler():在配置时钟失败时调用。它通常会使系统进入一个死循环,并禁止中断运行来避免更麻烦的问题。
assert_failed():在启用USE_FULL_ASSERT宏时,如果assert_param宏检测到参数错误,则调用此函数。
在while (1)循环中,程序通过调用LED_Disp()函数并以位寻址方式控制亮不同的LED。每次点亮LED指示灯后,程序通过HAL_Delay(500)函数暂停500毫秒,然后点亮下一个LED。

2.bsp_led.c(用于STM32微控制器的LED控制程序,是在HAL库的基础上编写的。)

#include "led\bsp_led.h"

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);

}

void LED_Disp(unsigned char ucled)
{
	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);
	
	HAL_GPIO_WritePin(GPIOC,ucled,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

2.1、LED初始化 (LED_Init 函数):
a.使能GPIOC、GPIOD和GPIOF端口的时钟。
b.将GPIOC上的引脚(PIN_13, PIN_14, PIN_15, PIN_8, PIN_9, PIN_10, PIN_11, PIN_12)和GPIOD上的PIN_2配置为推挽输出(Push-Pull Output)模式,并且不启用上拉和下拉电阻,输出速度设置为低速。
c.将所有配置的GPIOC引脚初始化为高电平(GPIO_PIN_SET),GPIOD引脚PIN_2初始化为低电平(PIO_PIN_RESET)。
2.2、LED显示控制 (LED_Disp 函数):
a.将所有GPIOC上的LED引脚设置为高电平(GPIO_PIN_SET),并且也将GPIOD的PIN_2设置为高电平(GPIO_PIN_SET)。紧接着又将其设置为低电平。(GPIO_PIN_RESET)
b.通过ucled确定需要调节的LED指示灯(ucled<<8的作用是将引脚对应的二进制值左移8位)。

3.bsp_led.h(该文件是一个头文件,它声明了两个函数:LED_Init和LED_Disp。)

#include "main.h"

void LED_Init(void);
void LED_Disp(unsigned char ucled);

标签:CODE,LED,PIN,STM32,USER,GPIO,RCC
From: https://blog.csdn.net/2301_81433986/article/details/143658811

相关文章

  • 嵌入式高频面试题:STM32基础外设篇
    1、UART通信的波特率如何进行设置波特率由UART的时钟频率和分频器设置决定,在初始化UART时配置相应的波特率寄存器2、常见的通信接口3、iic总线的原理iIC总线是一种串行双向通信总线,用于连接主机和从设备。它有两种线路分别是时钟线(SCL)和数据线(SDA)主机通过时钟线控制通......
  • STM32+cubemx岸电绞车超速报警
    一、项目背景与概述    在当今高度自动化和智能化的时代,对电子系统的功能和性能要求不断提高。本项目旨在基于STM32微控制器开发一个岸电绞车超速报警模块,提供实时监测与控制其旋转速度,确保安全运行。该系统综合运用了嵌入式软件开发技术、硬件电路设计以及信号处......
  • STM32—OLED模块
    OLED(OrganicLightEmittingDiode)显示屏因其轻薄、响应速度快、视角宽、色彩鲜艳等特点,在嵌入式系统中得到广泛应用。本文将详细介绍如何使用STM32微控制器通过I2C接口驱动OLED显示屏,并提供完整的代码实现。OLED模块简介OLED显示屏是一种自发光显示技术,具有轻薄、低功耗......
  • 8.100ASK_T113-PRO 应用程序驱动LED灯 (/sys/class/gpio)
    前言1.利用LINUX内核的GPIO子统驱动LED灯.2. 编写应用程序控制LED灯的亮灭.3.不用写驱动程序,只写应用程序.1.原理图使用的是PE12这个IO口,计算一个IO编号: PE=4*32, IO编号=4*32+12=140.注解一下:PAX= 0*32+XPBX= 1*32+XPCX= 2*32+XPD......
  • 暂时关闭EXTI外部中断的一个坑 HK32(stm32没有测试过)
    一开始的外部中断是通过这个宏函数来关闭的和开启#defineDisableEXTI_Key()(EXTI->IMR&=~((1<<KEY1_Pin)+(1<<KEY2_Pin)+(1<<KEY3_Pin)))//PA0、PC2、3#defineEnableEXTI_Key()(EXTI->IMR|=((1<<KEY1_Pin)+(1<<KEY2_Pin)+(1<<KEY3_Pin)))......
  • 基于云服务器搭建个人网站,nginx:bind() to 0.0.0.0:80 failed解决方法
    前言我在搭建个人网站时出现下面情况nginx:[emerg]bind()to0.0.0.0:80failed(98:Unknownerror)nginx:[emerg]bind()to[::]:80failed(98:Unknownerror)如果你的也是这样,本帖应能帮到你解决方法首先确保安全组中的80端口是开放的查看端口占用情况命令(可......
  • nginx权限问题 failed( 13 Permission denied )
    使用nginx代理时,文件一直无法展示,查看nginx的error日志文件显示Permissiondenied,权限问题1.查看nginx启动用户和使用用户是否一致psaux|grepnginx输出的第一列就是用户名称2.打开nginx配置文件#查找nginx.conf文件的位置ps-aux|grepngxin输出记录中有/conf/n......
  • ENVI55扩展工具: MODIS Gap-Filled 数据读取工具
    1工具介绍工具支持ENVI5.5及以上版本。大部分MODIS产品数据均可使用MCTK工具打开和处理。但是最近在使用MODISGap-Filled数据时,发现MCTK工具并不支持,会弹出如下提示。 MODISGap-Filled数据通常为年合成产品,例如MOD17A3HGF为年合成植被净初级生产力和总初级......
  • electron报错: "Request Autofill.enable failed.", "Request Autofill.enable failed
    问题今天尝试electron最简单的demo,在打开开发者工具的时候,会报错"RequestAutofill.enablefailed.","RequestAutofill.enablefailed.".解决经过网上搜索,确定这个报错的原因是因为electron版本和node.js版本不匹配的问题。node<=v16.13已经有网友整理过了,可以参......
  • STM32CubeMX:使用DAC输出正弦波的三种方法(while,定时器中断,DMA)
    1.DAC概念简介:DAC的工作原理是根据数字输入信号的数值,生成相应的模拟输出电压或电流。它通常接收一个二进制数字输入,该数字代表了一个特定的数值范围。DAC通过将这个数字值转换为模拟信号的电压或电流水平来输出。(功能与ADC相反)2.正弦波输出方式1:简单粗暴while循环输出Cub......