STM32-HAL库开发快速入门

注:本文主要记录一下STM32CubeMX软件的使用流程,记录内容以STM32外设(中断、I2C、USART、SPI等配置)在STM32CubeMX中的设置为主,对驱动代码编写不做记录,所以阅读本文最好有标准库开发经验。除第2节外,使用的都是韦东山老师的瑞士军刀系列。

01 软件安装

1.keil

需要安装以下支持包(keil在线安装里没有对应芯片支持包)。

2.STM32CubeMX

安装库:

3.串口助手

02 HAL库点灯操作

2.1 硬件连接

该原理图来源于学益得在线课堂教学项目《RTOS项目实战:从PCB到FreeRTOS|手写MQTT》。

DAPLINK电路连接:

(1)程序下载:

单片机SCK————DAPLINK的SCK

单片机SWK————DAPLINK的SWD

(2)串口连接

单片机TX————DAPLINK的RX

单片机RX————DAPLINK的TX

单片机GND————DAPLINK的GND

单片机3V3————DAPLINK的3V3

单片机ReSet————DAPLINK的RST

2.2 寄存器点灯 

2.2.1 官网下载库文件 

ST公司官网:

STSW-STM32065 - STM32F4 DSP and standard peripherals library - STMicroelectronics

2.2.2 创建工程 

(1)新建工程

(2)复制启动文件到工程 

记得将文件组添加到路径中: 

 此时编译运行会有错误,需要进行以下处理:

(3)配置RCC时钟 

如果我们需要点亮PB10引脚上的LED,让PB10等于1即可: 

与STM32F1系列不同,STM32所有的GPIO都挂载再AHB总线上,所以配置GPIO的RCC时钟时,配置的是AHB的时钟。 

(4)配置PB10引脚为输出模式 

(5)配置PB10引脚为推挽输出

(6)配置PB10引脚为输出高电平 

(7)main.c

#include <stm32f411xe.h>                  // 我们没有把所有启动文件都复制进来,所以用<>
//#include "stm32f4xx.h"                  // Device headerint main()
{//使能时钟RCC->AHB1ENR = 0X00000002;     //使能挂载在AHB上的PB10时钟//配置引脚模式GPIOB->MODER = 0x00100000;     //配置PB10为输出模式//配置输出模式GPIOB->OTYPER = 0x00000000;    //配置PB10引脚为推挽输出模式//配置输出的值GPIOB->ODR = 0x00000400;       //配置PB10引脚输出高电平while(1);	
}void SystemInit()
{}

注意:keil代码文件最后一行必须是空行,编译才不会有问题。 下载程序时注意以下几个问题:

(1)注意切换调试工具

(2)使用微库,就是简易版本的C库、使用C语言,开发的时候需要勾选“Use MicroLIB”

2.3 CubeMX创建工程 

寄存器开发:优点:程序执行的效率高;缺点:开发效率低。

库开发:标准库   HAL库(需要借助CubeMX)

新建工程

RCC(时钟源)配置

晶振频率越高,功耗越高,因此提供了两个晶振供选择。

上图这里配置的是外部晶振,我们这个案例不需要用到,因为配不配置都行。

输入100后会自动匹配其它系数 ,由内部晶振分频输出。

2.4 HAL库点灯

使用CuberMX创建完工程后,可用keil打开相应keil工程,修改源码。 

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"/* 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);
static void MX_GPIO_Init(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 */__HAL_RCC_GPIOB_CLK_ENABLE();       // 使能GPIOB的时钟.注意:时钟使能一定要在GPIO配置完成前GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //设置gPIOB为推挽输出GPIO_InitStruct.Pin = GPIO_PIN_10;          //使用PB10引脚GPIO_InitStruct.Pull = GPIO_NOPULL;         //配置GPIO引脚不需要上拉GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; //配置GPIO输出速度为低速HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);       //使用结构体配置GPIOB 	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET);  //将PB10置为高电平/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (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_RCC_PWR_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;RCC_OscInitStruct.PLL.PLLM = 8;RCC_OscInitStruct.PLL.PLLN = 100;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ = 4;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_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK){Error_Handler();}
}/*** @brief GPIO Initialization Function* @param None* @retval None*/
static void MX_GPIO_Init(void)
{
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 *//* GPIO Ports Clock Enable */__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOH_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}/* 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 */

注意: 

2.5 CubeMX配置GPIO 

直接用CubeMX配置点亮LED。

这里CubeMx实现了将PB0、PB1、PB2、PB10全部置为高电平,推挽输出模式,点亮4颗LED灯。配置完后直接用keil打开下载程序即可运行

2.6 GPIO反转操作(流水灯实现)

(1)工程配置

(2)GPIO.c

/* USER CODE BEGIN Header */
/********************************************************************************* @file    gpio.c* @brief   This file provides code for the configuration*          of all used GPIO pins.******************************************************************************* @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 "gpio.h"/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*----------------------------------------------------------------------------*/
/* Configure GPIO                                                             */
/*----------------------------------------------------------------------------*/
/* USER CODE BEGIN 1 *//* USER CODE END 1 *//** Configure pins as* Analog* Input* Output* EVENT_OUT* EXTI
*/
void MX_GPIO_Init(void)
{/* GPIO Ports Clock Enable */__HAL_RCC_GPIOA_CLK_ENABLE(); }/* USER CODE BEGIN 2 */
/*LED的初始化函数*/
void My_Led_Init(void)
{GPIO_InitTypeDef GPIO_Init_Struct;GPIO_Init_Struct.Mode = GPIO_MODE_OUTPUT_PP;   //配置GPIO为推挽输出GPIO_Init_Struct.Pin = GPIO_PIN_10|GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;       //选中GPIOB上的PB0 PB1 PB2 PB10GPIO_Init_Struct.Pull = GPIO_NOPULL;GPIO_Init_Struct.Speed = GPIO_SPEED_FREQ_LOW;__HAL_RCC_GPIOB_CLK_ENABLE();            //开启GPIOB的时钟//初始化 PB0 PB1 PB2 PB10HAL_GPIO_Init(GPIOB,&GPIO_Init_Struct);	
}
/*LED的翻转函数*/
void My_Led_Tooggle(void)
{uint8_t i;for(i=0;i<4;i++){switch(i){case 0:HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_10);    //翻转PB10引脚的电平HAL_Delay(500);                           //延时500msHAL_GPIO_TogglePin(GPIOB,GPIO_PIN_10);    //翻转PB10引脚的电平HAL_Delay(500);break;case 1:HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);     //翻转PB2引脚的电平HAL_Delay(500);                           //延时500msHAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);     //翻转PB2引脚的电平HAL_Delay(500);                           //延时500msbreak;case 2:HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);     //翻转PB1引脚的电平HAL_Delay(500);                           //延时500msHAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);     //翻转PB1引脚的电平HAL_Delay(500);                           //延时500msbreak;case 3:HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);     //翻转PB0引脚的电平HAL_Delay(500);                           //延时500msHAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);     //翻转PB0引脚的电平HAL_Delay(500);                           //延时500msbreak;}	}
}
/* USER CODE END 2 */

 (3)GPIO.h

/* USER CODE BEGIN Header */
/********************************************************************************* @file    gpio.h* @brief   This file contains all the function prototypes for*          the gpio.c file******************************************************************************* @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 */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __GPIO_H__
#define __GPIO_H__#ifdef __cplusplus
extern "C" {
#endif/* Includes ------------------------------------------------------------------*/
#include "main.h"/* USER CODE BEGIN Includes *//* USER CODE END Includes *//* USER CODE BEGIN Private defines *//* USER CODE END Private defines */void MX_GPIO_Init(void);/* USER CODE BEGIN Prototypes */
void My_Led_Init(void);
void My_Led_Tooggle(void);
/* USER CODE END Prototypes */#ifdef __cplusplus
}
#endif
#endif /*__ GPIO_H__ */

(4)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 *//* 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 */My_Led_Init();	/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE */My_Led_Tooggle();/* 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_RCC_PWR_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;RCC_OscInitStruct.PLL.PLLM = 8;RCC_OscInitStruct.PLL.PLLN = 100;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ = 4;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_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != 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 */

2.7 GPIO输入(两个按键开关灯)

1个按键开灯,另一个关灯

(1)新建3.key工程

(2)GPIO.c

/* USER CODE BEGIN Header */
/********************************************************************************* @file    gpio.c* @brief   This file provides code for the configuration*          of all used GPIO pins.******************************************************************************* @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 "gpio.h"/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*----------------------------------------------------------------------------*/
/* Configure GPIO                                                             */
/*----------------------------------------------------------------------------*/
/* USER CODE BEGIN 1 *//* USER CODE END 1 *//** Configure pins as* Analog* Input* Output* EVENT_OUT* EXTI
*/
void MX_GPIO_Init(void)
{/* GPIO Ports Clock Enable */__HAL_RCC_GPIOA_CLK_ENABLE();}/* USER CODE BEGIN 2 */
/* LED初始化函数 */
void My_Led_Init(void)
{GPIO_InitTypeDef GPIO_Init_Structure;GPIO_Init_Structure.Mode = GPIO_MODE_OUTPUT_PP;          //配置推挽输出GPIO_Init_Structure.Pin = GPIO_PIN_10;GPIO_Init_Structure.Pull = GPIO_NOPULL;    //无需上下拉GPIO_Init_Structure.Speed = GPIO_SPEED_FREQ_LOW;__HAL_RCC_GPIOB_CLK_ENABLE();         //开启GPIOB的时钟HAL_GPIO_Init(GPIOB,&GPIO_Init_Structure);
}/* 按键初始化函数 */
void My_Key_Init(void)
{GPIO_InitTypeDef GPIO_Init_Structure;GPIO_Init_Structure.Mode = GPIO_MODE_INPUT;          //输入模式,检测按键状态GPIO_Init_Structure.Pin = GPIO_PIN_4 | GPIO_PIN_5;GPIO_Init_Structure.Pull = GPIO_NOPULL;    //无需上下拉GPIO_Init_Structure.Speed = GPIO_SPEED_FREQ_LOW;
//	__HAL_RCC_GPIOA_CLK_ENABLE();             //在CubeMX自动生成的MX_GPIO_Init已经开启GPIOA的时钟,无需再次开启HAL_GPIO_Init(GPIOA,&GPIO_Init_Structure);
}
/* 开灯函数 */
void My_Led_ON()
{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET);   //给PB10一个高电平,开灯
}
/* 关灯函数 */
void My_Led_OFF()
{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET); //给PB10一个低电平,关灯
}
/* 按键扫描函数 */
uint8_t My_Key_Scan(void)
{GPIO_PinState state = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4);   //检测接在PA4上按键状态if(state == GPIO_PIN_RESET)       //如果按键脚低电平,按键按下{HAL_Delay(20);        //延时20ms,软件消抖if(state == GPIO_PIN_RESET)return 1;}state = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5);   //检测接在PA5上按键状态if(state == GPIO_PIN_RESET)       //如果按键脚低电平,按键按下{HAL_Delay(20);        //延时20ms,软件消抖if(state == GPIO_PIN_RESET)return 2;}return 0;              //没有按键按下时候返回0}/* USER CODE END 2 */

(3)GPIO.h

/* USER CODE BEGIN Header */
/********************************************************************************* @file    gpio.h* @brief   This file contains all the function prototypes for*          the gpio.c file******************************************************************************* @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 */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __GPIO_H__
#define __GPIO_H__#ifdef __cplusplus
extern "C" {
#endif/* Includes ------------------------------------------------------------------*/
#include "main.h"/* USER CODE BEGIN Includes *//* USER CODE END Includes *//* USER CODE BEGIN Private defines *//* USER CODE END Private defines */void MX_GPIO_Init(void);/* USER CODE BEGIN Prototypes */
/* LED初始化函数 */
void My_Led_Init(void);
/* 按键初始化函数 */
void My_Key_Init(void);
/* 开灯函数 */
void My_Led_ON();
/* 关灯函数 */
void My_Led_OFF();
/* 按键扫描函数 */
uint8_t My_Key_Scan(void);
/* USER CODE END Prototypes */#ifdef __cplusplus
}
#endif
#endif /*__ GPIO_H__ */

(4)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 *//* 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 */My_Led_Init();My_Key_Init();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE */switch(My_Key_Scan())    //获取键值{case 1:{My_Led_ON();   //开灯break;}case 2:{My_Led_OFF();  //关灯break;}case 0:break;}/* 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_RCC_PWR_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;RCC_OscInitStruct.PLL.PLLM = 8;RCC_OscInitStruct.PLL.PLLN = 100;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ = 4;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_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != 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 */

上面我们学习了HAL库开发的基本操作,下面我们就来学习HAL库开发的外设操作吧。

03 GPIO中断编程

这节我们主要记录一下STM32CubeMX中中断配置。

(1)配置相应引脚为中断模式

(2)配置中断引脚触发方式和工作模式

(3)使能中断向量控制器

(4)设置中断优先级分组

江协科技STM32学习笔记(第04章 EXTI外部中断)_江协科技笔记-CSDN博客

勾选与不勾选的区别就是:左边是勾选上的,外设GPIO初始化完成后才初始化NVIC,右边是未勾选的,在GPIO里面就初始化了NVIC。 

配置完以上几步就可以生成代码了。

 (5)编写中断函数

使用HAL库配置的所有中断最终都会调用这个弱函数,我们和中断相关的代码都放这个函数里就可以了。

执行过程为:

 在这个回调函数里编写我们自己的中断控制程序。 

04 使用OLED进行调试

OLED使用I2C进行通信,所以这节的目的是为了了解I2C引脚的配置。

这里STM32CubeMX里就配置好了。

将OLED的驱动程序添加进工程里就可以使用oled了。

使用就是很常规的调用驱动里相关函数就行,就不记录了。 

05 按键抖动处理

处理按键抖动的时候我们可能会使用延时函数,隔一段时间再判断一下电平,但是中断函数的要求是快进快出,在中断函数里使用延时函数,显示有点违背了这条准则,本节就是记录如何解决这个问题。 使用定时器来解决这个问题,定时器是如以下3个图这样来调用的。

这个定时器每1ms产生一次中断, 增加一个计数值。

使用以下函数获得计数值。 

先定义相关的变量。 

struct soft_timer{uint32_t timeout;           //超时时间void *args;                 //给成员func用的参数void (*func)(void *);       //超时函数
};
/* 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 */
int g_key_cnt = 0;
void key_timerout_func(void *args);struct soft_timer key_timer = {~0,NULL,key_timerout_func};     //按键超时时间结构体定义

只要触发中断,将超时时间设置为当前时间+10。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin == GPIO_PIN_14){	mod_timer(&key_timer,10);                     //中断函数里修改超时时间为当前时间+10}
}

void mod_timer(struct soft_timer *pTimer,uint32_t timeout)
{pTimer->timeout = HAL_GetTick()+timeout;         //超时时间等于当前计数值加上10,就是每次触发中断都等待10ms再检测        
}

 SysTick_Handler()会每隔1ms计数一次,并且检查定时时间有没有到。

void SysTick_Handler(void)
{/* USER CODE BEGIN SysTick_IRQn 0 *//* USER CODE END SysTick_IRQn 0 */HAL_IncTick();                            //没过1ms都会产生一次中断/* USER CODE BEGIN SysTick_IRQn 1 */extern void check_timer(void);check_timer();                            //调用check_timer检查按键定时器的时间有没有到了/* USER CODE END SysTick_IRQn 1 */
}

void check_timer(void)
{if(key_timer.timeout<=HAL_GetTick())            /*如果按键定时器的时间是否到了,这里key_timer.timeout的最大值是最后一次按键抖动触发的中断时间+10,key_timer.timeout<=HAL_GetTick()就移位着我的按键已经达到稳定状态了*/{key_timer.func(key_timer.args);         //按键达到稳定状态后把案件定时器状态归位}
}

void key_timerout_func(void *args)
{g_key_cnt++;                                               // 统计按键按下的次数key_timer.timeout= ~0;	                                   //每次计数完都给按键定时时间复位
}

 完整代码:

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 "i2c.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "driver_oled.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */  
struct soft_timer{uint32_t timeout;           //超时时间void *args;                 //给成员func用的参数void (*func)(void *);       //超时函数
};
/* 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 */
int g_key_cnt = 0;
void key_timerout_func(void *args);struct soft_timer key_timer = {~0,NULL,key_timerout_func};     //按键超时时间结构体定义void key_timerout_func(void *args)
{g_key_cnt++;                                               // 统计按键按下的次数key_timer.timeout= ~0;	                                   //每次计数完都给按键定时时间复位
}void mod_timer(struct soft_timer *pTimer,uint32_t timeout)
{pTimer->timeout = HAL_GetTick()+timeout;         //超时时间等于当前计数值加上10,就是每次触发中断都等待10ms再检测        
}void check_timer(void)
{if(key_timer.timeout<=HAL_GetTick())            /*如果按键定时器的时间是否到了,这里key_timer.timeout的最大值是最后一次按键抖动触发的中断时间+10,key_timer.timeout<=HAL_GetTick()就移位着我的按键已经达到稳定状态了*/{key_timer.func(key_timer.args);         //按键达到稳定状态后把案件定时器状态归位}
}void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin == GPIO_PIN_14){	mod_timer(&key_timer,10);                     //中断函数里修改超时时间为当前时间+10}
}
/* 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();MX_I2C1_Init();/* USER CODE BEGIN 2 */OLED_Init();OLED_Clear();OLED_PrintString(0, 4, "Key ISR cnt = ");/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){
//		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);          //PC13口置高电平,点亮LED
//		HAL_Delay(500);                                             //延时500ms
//		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);          //PC13口置高电平,点亮LED
//		HAL_Delay(500);OLED_PrintSignedVal(14, 4, g_key_cnt);/* 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};/** 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.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;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_DIV2;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 */

stm32f1xx_it.c :

/* USER CODE BEGIN Header */
/********************************************************************************* @file    stm32f1xx_it.c* @brief   Interrupt Service Routines.******************************************************************************* @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 "stm32f1xx_it.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN TD *//* USER CODE END TD *//* 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 -----------------------------------------------*/
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//* External variables --------------------------------------------------------*//* USER CODE BEGIN EV *//* USER CODE END EV *//******************************************************************************/
/*           Cortex-M3 Processor Interruption and Exception Handlers          */
/******************************************************************************/
/*** @brief This function handles Non maskable interrupt.*/
void NMI_Handler(void)
{/* USER CODE BEGIN NonMaskableInt_IRQn 0 *//* USER CODE END NonMaskableInt_IRQn 0 *//* USER CODE BEGIN NonMaskableInt_IRQn 1 */while (1){}/* USER CODE END NonMaskableInt_IRQn 1 */
}/*** @brief This function handles Hard fault interrupt.*/
void HardFault_Handler(void)
{/* USER CODE BEGIN HardFault_IRQn 0 *//* USER CODE END HardFault_IRQn 0 */while (1){/* USER CODE BEGIN W1_HardFault_IRQn 0 *//* USER CODE END W1_HardFault_IRQn 0 */}
}/*** @brief This function handles Memory management fault.*/
void MemManage_Handler(void)
{/* USER CODE BEGIN MemoryManagement_IRQn 0 *//* USER CODE END MemoryManagement_IRQn 0 */while (1){/* USER CODE BEGIN W1_MemoryManagement_IRQn 0 *//* USER CODE END W1_MemoryManagement_IRQn 0 */}
}/*** @brief This function handles Prefetch fault, memory access fault.*/
void BusFault_Handler(void)
{/* USER CODE BEGIN BusFault_IRQn 0 *//* USER CODE END BusFault_IRQn 0 */while (1){/* USER CODE BEGIN W1_BusFault_IRQn 0 *//* USER CODE END W1_BusFault_IRQn 0 */}
}/*** @brief This function handles Undefined instruction or illegal state.*/
void UsageFault_Handler(void)
{/* USER CODE BEGIN UsageFault_IRQn 0 *//* USER CODE END UsageFault_IRQn 0 */while (1){/* USER CODE BEGIN W1_UsageFault_IRQn 0 *//* USER CODE END W1_UsageFault_IRQn 0 */}
}/*** @brief This function handles System service call via SWI instruction.*/
void SVC_Handler(void)
{/* USER CODE BEGIN SVCall_IRQn 0 *//* USER CODE END SVCall_IRQn 0 *//* USER CODE BEGIN SVCall_IRQn 1 *//* USER CODE END SVCall_IRQn 1 */
}/*** @brief This function handles Debug monitor.*/
void DebugMon_Handler(void)
{/* USER CODE BEGIN DebugMonitor_IRQn 0 *//* USER CODE END DebugMonitor_IRQn 0 *//* USER CODE BEGIN DebugMonitor_IRQn 1 *//* USER CODE END DebugMonitor_IRQn 1 */
}/*** @brief This function handles Pendable request for system service.*/
void PendSV_Handler(void)
{/* USER CODE BEGIN PendSV_IRQn 0 *//* USER CODE END PendSV_IRQn 0 *//* USER CODE BEGIN PendSV_IRQn 1 *//* USER CODE END PendSV_IRQn 1 */
}/*** @brief This function handles System tick timer.*/
void SysTick_Handler(void)
{/* USER CODE BEGIN SysTick_IRQn 0 *//* USER CODE END SysTick_IRQn 0 */HAL_IncTick();                            //没过1ms都会产生一次中断/* USER CODE BEGIN SysTick_IRQn 1 */extern void check_timer(void);check_timer();                            //调用check_timer检查按键定时器的时间有没有到了/* USER CODE END SysTick_IRQn 1 */
}/******************************************************************************/
/* STM32F1xx Peripheral Interrupt Handlers                                    */
/* Add here the Interrupt Handlers for the used peripherals.                  */
/* For the available peripheral interrupt handler names,                      */
/* please refer to the startup file (startup_stm32f1xx.s).                    */
/******************************************************************************//*** @brief This function handles EXTI line[15:10] interrupts.*/
void EXTI15_10_IRQHandler(void)
{/* USER CODE BEGIN EXTI15_10_IRQn 0 *//* USER CODE END EXTI15_10_IRQn 0 */HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);/* USER CODE BEGIN EXTI15_10_IRQn 1 *//* USER CODE END EXTI15_10_IRQn 1 */
}/* USER CODE BEGIN 1 *//* USER CODE END 1 */

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/421126.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA智能管理高效运营自营商城系统

智能管理&#xff0c;高效运营 —— 自营商城系统的魅力揭秘&#x1f680; &#x1f4c8; 开篇&#xff1a;告别繁琐&#xff0c;拥抱智能管理 你还在为商城运营的繁琐流程头疼吗&#xff1f;&#x1f92f; 还在为数据分析的复杂性而烦恼吗&#xff1f;&#x1f914; 那就让我…

IPv6理论基础

IPV6 地址介绍 地址标识方法 格式 : XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX&#xff0c;128bit&#xff0c;8个16位&#xff0c;16进制 X表示十六进制的一个字符&#xff0c;可以是0 - 9,A -F 字母大小写不敏感&#xff0c;最终设备上显示均为大写 一个地址由8个字段构成…

学习threejs,创建立方体,并执行旋转动画

文章目录 一、前言二、代码示例三、总结 一、前言 本文基于threejs&#xff0c;实现立方体的创建&#xff0c;并加入立方体旋转动画 二、代码示例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>l…

【动态规划】【完全背包】力扣322. 零钱兑换

给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是无限的。 示…

【ACM出版,录用检索快】2024年第四届工商管理与数据科学国际学术会议 (BADS 2024,10月25-27)

2024年第四届工商管理与数据科学国际学术会议(BADS 2024)将于2024年10月25-27日在中国重庆召开&#xff0c;大会由喀什大学支持。 在当今全球化与数字化迅速发展的时代&#xff0c;工商管理与数据科学作为推动经济增长和技术进步的重要力量&#xff0c;正以前所未有的速度交叉融…

使用肘部法则确定K-Means中的k值

一 肘部法则 在K-means算法中&#xff0c;对于确定K&#xff08;簇的数目&#xff09;&#xff0c;我们经常使用肘部法则。 肘部法则是一种用于确定在k均值聚类算法中使用的质心数&#xff08;k&#xff09;的技术。 在这种方法中&#xff0c;为了确定k值&#xff0c;我们连续…

二十三种模式之原型模式(类比制作陶器更好理解一些)

1. 设计模式的分类 创建型模式(五种)&#xff1a;工厂方法模式、单例模式、抽象工厂模式、原型模式、建造者模式。 结构型模式(七种)&#xff1a;适配器模式、代理模式、装饰器模式、桥接模式、外观模式、享元模式、组合模式。 行为型模式(十一种)&#xff1a;状态模式、模板方…

刚开始学精益六西格玛管理方法?这份指南建议收藏

精益六西格玛管理方法&#xff0c;作为两大管理哲学的完美结合&#xff0c;正逐渐成为众多企业转型升级的利器。对于刚开始接触这一领域的你来说&#xff0c;掌握精益六西格玛管理的精髓并有效应用于实践中&#xff0c;无疑是一项既具挑战性又极具价值的任务。本文&#xff0c;…

应用连接错误,初始化mysql数据库恢复---惜分飞

有人在部署一个新网站的时候,写错了配置信息,直接导致原有数据库被清掉,并创建了新库和写入了数据(其实本质就是drop table恢复) 登录操作系统查看,发现数据库文件在根分区,创建了新库,写入了数据之外,还有几个G的binlog.全部恢复不太可能,最后客户决定需要恢复的2个核心表数…

.NET 一款在线解密Web.config的脚本

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

官网下载easyx压缩包,如何在devc++配置easyx

视频教程 官网下载easyx压缩包&#xff0c;如何在devc配置easyx EasyX Graphics Library for C 安装指南 1. 访问官网 官网 2. 下载 EasyX 在官网上找到下载区域&#xff0c;点击下载按钮以获取 EasyX 安装包。 3. 访问更多下载选项 点击页面上的“more”链接&#xff0…

Django日志

【图书介绍】《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) Django 5框…

uniapp 微信小程序自定义tabbar层级低于canvas解决方案

示例代码&#xff1a; <template><cover-view class"tab"><cover-view class"navView" tap"switc(/pages/index/index)"><cover-image :src"tabname index?/static/tabbar/overide-sel.png:/static/tabbar/overide…

Vscode python无法转到函数定义

今天上午换了电脑&#xff0c;使用Vscode发现找不到对应的函数定义了。 使用了网上的全部教程。一点用没有。重启电脑&#xff0c;重启Vscode也没有作用。最后通过重装vscode&#xff0c;解决问题。&#xff08;也不知道Vscode什么毛病&#xff09; 重点语句&#xff1a; 去官网…

大语言模型(LLM)与多模态大模型(MLLM)结合行人重识别(Reid)领域最新文献方法调研

Data Augmentation for Text-based Person Retrieval Using Large Language Models 这篇论文主要研究文本基础的人员检索&#xff08;Text-based Person Retrieval, TPR&#xff09;任务中的数据扩充问题&#xff0c;并提出了一种基于大语言模型&#xff08;Large Language Mo…

framebuffer帧缓存

1. framebuffer Framebuffer&#xff08;帧缓冲区&#xff09;是用于存储图像数据的一块内存区域。我们可以将我们想要显示的图像数据写到framebuffer中&#xff0c;驱动程序每隔一段时间会自动的去读取Framebuffer中的图像数据&#xff0c;并根据读取到的图像数据在屏幕上显示…

最全整理:R/Rstudio/R包的更新

R 是开源的数据分析和统计计算语言&#xff0c;功能强大且应用广泛&#xff0c;R 的版本更新频率较高。最近处理数据时突然有一个 R 包无法安装&#xff0c;细探究发现这个 R 包需要新版本 R 的才可以安装。本文主要分享&#xff1a;更新 R、更新 Rstudio 和一键升级 R 包。 更…

web项目如何部署到服务器上呢?——麻烦的方法

只需关注web项目如何部署到服务器上&#xff0c;因为服务器运行时就可以访问web项目了。 一、麻烦的方法 1、首先启动服务器 &#xff08;1&#xff09;找到bin文件夹 &#xff08;2&#xff09;双击运行startup.bat文件 &#xff08;3&#xff09;运行之后的界面如下&#…

上海亚商投顾:沪指探底回升 华为产业链午后爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日探底回升&#xff0c;深成指、创业板指盘中跌逾1%&#xff0c;午后集体拉升翻红。华为产业链午后走强…

Mysql系列-索引简介

索引是排好序的数据结构 1 索引数据结构 hash索引、二叉树、平衡二叉树、B-Tree、BTree 数据结构在线示例&#xff1a;点击跳转 2 索引类型 2.1 聚簇索引 又叫“聚集索引” &#xff0c;索引和数据存储在一起 2.2 非聚簇索引 又叫“非聚集索引” &#xff0c;索引和数据分开…