【蓝桥杯嵌入式】六、真题演练(一)-1演练篇:第 14 届真题

温馨提示:

        真题演练分为模拟篇和研究篇。本专栏的主要作用是记录我的备赛过程,我打算先自己做一遍,把遇到的问题和不同之处记录到演练篇,然后再返回来仔细研究一下,找到最佳的解题方法记录到研究篇

目录

解题记录:

草稿:

​编辑

​编辑

过程中遇到的问题:

2024/3/29更新:

未解决的问题:

反思总结

之前没有记住的函数:

2024/4/1更新:


解题记录:

草稿:

功能分析:

主要流程和全局变量: 

 功能函数分析:

过程中遇到的问题:

  1. 很明显第一个问题就是草稿太乱,需要规范化一下。
  2. 之前没想过需要获取定时器状态或定时时间,以实现长按、判断时长等功能。
  3. 根据题目,要把PCB设置为80MHz会更方便,在自己开发的时候我习惯设置为100MHz。
  4. 准确的毫秒级延时,由于预分频系数不可以大于65535,所以只能填7999,这样计数10000时就是1s。
  5. 忘记打开中断,设置优先级。
  6. 还是会漏掉某些变量的设置。
  7. 写草稿没有清谁是谁,重新查找浪费时间。

源代码:

main.c

/* USER CODE BEGIN PV */
uint8_t B1_key=1;
uint8_t PWMOut_MOde=1;//1:µÍƵ
uint32_t PWMOut_Pluse=10;
uint32_t PWMIn_f=0;

uint8_t PARA_mode=1;
uint16_t PARA_R=1;
uint16_t PARA_K=1;

uint8_t changeMode=1;
uint32_t changeNum=0;
uint8_t PWM_C=1;
uint32_t volt=0;

char LCD_str[20];
uint16_t PWMChangeTim=0;
uint32_t Period=200;

float Data_V=0.0;//(uint32_t)((PWMIn_f*6.28*PARA_R)/(100*PARA_K));
uint8_t V_change=1;
float V_Hmax=0.0;
float V_Lmax=0.0;
/* USER CODE END PV */

//LED函数
void LED_Switch(uint16_t GPIO_Pin,GPIO_PinState PinState)
{
	HAL_GPIO_WritePin(GPIOC,GPIO_Pin,PinState);
	HAL_GPIO_WritePin(GPIOD,LED_LE_Pin,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,LED_LE_Pin,GPIO_PIN_RESET);
}


//PWM渐变函数
void PWM_Change()
{
	for(uint16_t i=0;i<50;i++)
	{
			HAL_TIM_Base_Start(&htim7);
	}
}

//读ADC并改变占空比
void Read_ADC()
{
	if(PWM_C==1)
	{
		volt=(3300*HAL_ADC_GetValue(&hadc2))>>12;
		if(volt<=1000)
			PWMOut_Pluse=10;
		else if(volt>=3000)
			PWMOut_Pluse=85;
		else
			PWMOut_Pluse=(volt-1000)/(27*100);
		
		if(PWMOut_MOde==1)
			__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,PWMOut_Pluse*2);
		else
			__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,PWMOut_Pluse);
	}
	
}

//计算速度
void Set_V()
{
	if(V_change==0)
	{
		HAL_TIM_Base_Stop(&htim4);
		V_change=1;
	}
	PWMIn_f=80000000/__HAL_TIM_GetCompare(&htim3,TIM_CHANNEL_1);
	Data_V=(PWMIn_f*6.28*PARA_R)/(100*PARA_K);
	HAL_TIM_Base_Start(&htim4);
	V_change=0;
}


//按键1功能函数
void B1Fun()
{
	B1_key++;

	if(B1_key>3)
		B1_key=1;
}

//按键2功能函数
void B2Fun()
{
	if(B1_key==1&&changeMode==1)
	{
		changeNum++;
		changeMode=0;
		PWM_Change();		
	}
	else if(B1_key==2)
	{
		if(PARA_mode==1)
			PARA_mode=0;
		else 
			PARA_mode=1;
	}
}

//按键3功能函数
void B3Fun()
{
	if(B1_key==2)
	{
		if(PARA_mode==1)
			PARA_R++;
		else
			PARA_K++;
	}
}

///按键4功能函数
void B4Fun()
{
	if(B1_key==2)
	{
		if(PARA_mode==1)
			PARA_R--;
		else
			PARA_K--;
	}
	else if(B1_key==3)
	{
		if(PWM_C==1)//³¤°´
		{
			HAL_TIM_Base_Start(&htim6);
			while(HAL_TIM_Base_GetState(&htim6)==HAL_TIM_STATE_BUSY)
			{
				if(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin)==GPIO_PIN_SET)
				{
					HAL_TIM_Base_Stop(&htim6);
					return;
				}
			}
		}
		else
		{
				PWM_C=1;
		}
	}
}

//按键扫描函数
void KeyScan()
{
	if(HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin)==GPIO_PIN_RESET)
	{
		HAL_Delay(10);
		if(HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin)==GPIO_PIN_RESET)
		{
			B1Fun();
		}
	}
	
	if(HAL_GPIO_ReadPin(B2_GPIO_Port,B2_Pin)==GPIO_PIN_RESET)
	{
		HAL_Delay(10);
		if(HAL_GPIO_ReadPin(B2_GPIO_Port,B2_Pin)==GPIO_PIN_RESET)
		{
			B2Fun();
		}
	}
	
	if(HAL_GPIO_ReadPin(B3_GPIO_Port,B3_Pin)==GPIO_PIN_RESET)
	{
		HAL_Delay(10);
		if(HAL_GPIO_ReadPin(B3_GPIO_Port,B3_Pin)==GPIO_PIN_RESET)
		{
			B3Fun();
		}
	}
	
	if(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin)==GPIO_PIN_RESET)
	{
		HAL_Delay(10);
		if(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin)==GPIO_PIN_RESET)
		{
			B4Fun();
		}
	}
}


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

  /* USER CODE BEGIN Init */
	LCD_Init();
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
	LCD_Clear(Black);
  /* 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_ADC2_Init();
  MX_TIM2_Init();
  MX_TIM3_Init();
  MX_TIM6_Init();
  MX_TIM7_Init();
  MX_TIM15_Init();
  MX_TIM4_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
	LED_Switch(LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin|LED5_Pin|LED6_Pin|LED7_Pin|LED8_Pin,GPIO_PIN_SET);
	Set_V();
	
  while (1)
  {
		KeyScan();
		Read_ADC();
		if(B1_key==1)
		{
			LCD_Clear(Black);
			LED_Switch(LED1_Pin,GPIO_PIN_RESET);
			
			LCD_DisplayStringLine(Line2,"        DATA");
			if(PWMOut_MOde==1)
				LCD_DisplayStringLine(Line4,"     M=L");
			else
				LCD_DisplayStringLine(Line4,"     M=H");
			
			sprintf(LCD_str,"     P=%d%",PWMOut_Pluse);
			LCD_DisplayStringLine(Line5,LCD_str);
			
			sprintf(LCD_str,"     V=%.1f",Data_V);
			LCD_DisplayStringLine(Line6,LCD_str);
			
			LED_Switch(LED1_Pin,GPIO_PIN_SET);
		}
		else if(B1_key==2)
		{
			LCD_Clear(Black);
			LCD_DisplayStringLine(Line2,"        PARA");

			sprintf(LCD_str,"     R=%d",PARA_R);
			LCD_DisplayStringLine(Line4,LCD_str);
			
			sprintf(LCD_str,"     K=%d",PARA_K);
			LCD_DisplayStringLine(Line5,LCD_str);
		}
		else if(B1_key==3)
		{
			Set_V();
			LCD_Clear(Black);
			LCD_DisplayStringLine(Line2,"        RECD");

			sprintf(LCD_str,"     N=%d",changeNum);
			LCD_DisplayStringLine(Line4,LCD_str);
			
			sprintf(LCD_str,"     MH=%.1f",V_Hmax);
			LCD_DisplayStringLine(Line5,LCD_str);			
			
						sprintf(LCD_str,"     MH=%.1f",V_Lmax);
			LCD_DisplayStringLine(Line6,LCD_str);		
		}
    /* USER CODE END WHILE */

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

main.h

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.h
  * @brief          : Header for main.c file.
  *                   This file contains the common defines of the application.
  ******************************************************************************
  * @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 __MAIN_H
#define __MAIN_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "stm32g4xx_hal.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "lcd.h"
#include <stdio.h>
/* USER CODE END Includes */

/* Exported types ------------------------------------------------------------*/
/* USER CODE BEGIN ET */

/* USER CODE END ET */

/* Exported constants --------------------------------------------------------*/
/* USER CODE BEGIN EC */

/* USER CODE END EC */

/* Exported macro ------------------------------------------------------------*/
/* USER CODE BEGIN EM */

/* USER CODE END EM */

/* Exported functions prototypes ---------------------------------------------*/
void Error_Handler(void);

/* USER CODE BEGIN EFP */

/* USER CODE END EFP */

/* Private defines -----------------------------------------------------------*/
#define LED6_Pin GPIO_PIN_13
#define LED6_GPIO_Port GPIOC
#define LED7_Pin GPIO_PIN_14
#define LED7_GPIO_Port GPIOC
#define LED8_Pin GPIO_PIN_15
#define LED8_GPIO_Port GPIOC
#define B4_Pin GPIO_PIN_0
#define B4_GPIO_Port GPIOA
#define B1_Pin GPIO_PIN_0
#define B1_GPIO_Port GPIOB
#define B2_Pin GPIO_PIN_1
#define B2_GPIO_Port GPIOB
#define B3_Pin GPIO_PIN_2
#define B3_GPIO_Port GPIOB
#define LED1_Pin GPIO_PIN_8
#define LED1_GPIO_Port GPIOC
#define LED2_Pin GPIO_PIN_9
#define LED2_GPIO_Port GPIOC
#define LED3_Pin GPIO_PIN_10
#define LED3_GPIO_Port GPIOC
#define LED4_Pin GPIO_PIN_11
#define LED4_GPIO_Port GPIOC
#define LED5_Pin GPIO_PIN_12
#define LED5_GPIO_Port GPIOC
#define LED_LE_Pin GPIO_PIN_2
#define LED_LE_GPIO_Port GPIOD

/* USER CODE BEGIN Private defines */
extern uint8_t B1_key;
extern uint8_t PWMOut_MOde;
extern uint32_t PWMOut_Pluse;
extern uint32_t PWMIn_f;

extern uint8_t PARA_mode;
extern uint16_t PARA_R;
extern uint16_t PARA_K;
extern float Data_V;//(uint32_t)((PWMIn_f*6.28*PARA_R)/(100*PARA_K));

extern uint8_t changeMode;
extern uint32_t changeNum;
extern uint8_t PWM_C;
extern char LCD_str[];
extern uint16_t PWMChangeTim;
extern uint32_t Period;
extern uint8_t V_change;
extern float V_Hmax;
extern float V_Lmax;
/* USER CODE END Private defines */

#ifdef __cplusplus
}
#endif

#endif /* __MAIN_H */

stm32g4xx_it.c

//前面的内容省略

/******************************************************************************/
/* STM32G4xx 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_stm32g4xx.s).                    */
/******************************************************************************/

/**
  * @brief This function handles ADC1 and ADC2 global interrupt.
  */
void ADC1_2_IRQHandler(void)
{
  /* USER CODE BEGIN ADC1_2_IRQn 0 */

  /* USER CODE END ADC1_2_IRQn 0 */
  HAL_ADC_IRQHandler(&hadc2);
  /* USER CODE BEGIN ADC1_2_IRQn 1 */

  /* USER CODE END ADC1_2_IRQn 1 */
}

/**
  * @brief This function handles TIM1 break interrupt and TIM15 global interrupt.
  */
void TIM1_BRK_TIM15_IRQHandler(void)
{
  /* USER CODE BEGIN TIM1_BRK_TIM15_IRQn 0 */

  /* USER CODE END TIM1_BRK_TIM15_IRQn 0 */
  HAL_TIM_IRQHandler(&htim15);
  /* USER CODE BEGIN TIM1_BRK_TIM15_IRQn 1 */

  /* USER CODE END TIM1_BRK_TIM15_IRQn 1 */
}

/**
  * @brief This function handles TIM2 global interrupt.
  */
void TIM2_IRQHandler(void)
{
  /* USER CODE BEGIN TIM2_IRQn 0 */

  /* USER CODE END TIM2_IRQn 0 */
  HAL_TIM_IRQHandler(&htim2);
  /* USER CODE BEGIN TIM2_IRQn 1 */

  /* USER CODE END TIM2_IRQn 1 */
}

/**
  * @brief This function handles TIM3 global interrupt.
  */
void TIM3_IRQHandler(void)
{
  /* USER CODE BEGIN TIM3_IRQn 0 */

  /* USER CODE END TIM3_IRQn 0 */
  HAL_TIM_IRQHandler(&htim3);
  /* USER CODE BEGIN TIM3_IRQn 1 */

  /* USER CODE END TIM3_IRQn 1 */
}

/**
  * @brief This function handles TIM4 global interrupt.
  */
void TIM4_IRQHandler(void)
{
  /* USER CODE BEGIN TIM4_IRQn 0 */

  /* USER CODE END TIM4_IRQn 0 */
  HAL_TIM_IRQHandler(&htim4);
  /* USER CODE BEGIN TIM4_IRQn 1 */
	V_change=1;
	if(PWMOut_MOde==1)
	{
		if(Data_V>V_Lmax)
			V_Lmax=Data_V;
	}
	else
	{
		if(Data_V>V_Hmax)
			V_Hmax=Data_V;		
	}
  /* USER CODE END TIM4_IRQn 1 */
}

/**
  * @brief This function handles TIM6 global interrupt, DAC1 and DAC3 channel underrun error interrupts.
  */
void TIM6_DAC_IRQHandler(void)
{
  /* USER CODE BEGIN TIM6_DAC_IRQn 0 */

  /* USER CODE END TIM6_DAC_IRQn 0 */
  HAL_TIM_IRQHandler(&htim6);
  /* USER CODE BEGIN TIM6_DAC_IRQn 1 */

  /* USER CODE END TIM6_DAC_IRQn 1 */
}

/**
  * @brief This function handles TIM7 global interrupt.
  */
void TIM7_IRQHandler(void)
{
  /* USER CODE BEGIN TIM7_IRQn 0 */

  /* USER CODE END TIM7_IRQn 0 */
  HAL_TIM_IRQHandler(&htim7);
  /* USER CODE BEGIN TIM7_IRQn 1 */
	PWMChangeTim++;
	if(PWMChangeTim==50)
	{
		PWMChangeTim=0;
		
		if(PWMOut_MOde==1)
			__HAL_TIM_SetAutoreload(&htim2,100);
		else
			__HAL_TIM_SetAutoreload(&htim2,200);
		
		HAL_TIM_Base_Stop(&htim7);
	}
	else 
	{
		if(PWMOut_MOde==1)
			Period=200-PWMChangeTim*2;
		else
			Period=100+PWMChangeTim*2;
		
		__HAL_TIM_SetAutoreload(&htim2,Period);
		__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,(uint32_t)(Period/PWMOut_Pluse));

		HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
		HAL_GPIO_WritePin(GPIOD,LED_LE_Pin,GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOD,LED_LE_Pin,GPIO_PIN_RESET);
	}
  /* USER CODE END TIM7_IRQn 1 */
}

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */



2024/3/29更新:

下载后,发现如下问题:(应该简单在草稿上列出,这样可以理清思路)

  1. 屏幕一直闪,原因是LCD驱动函数响应较慢,所以不能总是清屏,应该改成在按下B1后清屏
  2. LED灯全亮,之前只在进入循环前关LED,这样是不行的,因为操作LCD会改变引脚的状态,所以进入每次都要关LED。而且不可以离点亮LED灯的位置太远,不然会闪;
  3. 没有打印‘%’,将语句改为如下代码:
     sprintf(LCD_str,"     P=%d%c",PWMOut_Pluse,'%');
  4. 按键有粘滞现象,修改后反应时间又过长,再次下载后粘滞消失,说明硬件不稳定,按键延时就设置为50就行,不快也不慢
  5. PARA模式下R和K等于0还可以减小,从十位数减到个位数没有清行,在减小值的位置添加清屏
  6. 没有仔细读题
    1. R和K的范围是1到10
    2. 而且B4的长按是在数据界面,我一直以为是统计界面,太粗心。幸好我模块化做的可以,需要改动的代码比较少。
  7. 计算要从简:计算速度,频率不是8k就是4k,只要判断模式即可,不用计算频率。
  8. 关于时间的操作可以在TIM中断服务函数中进行的,就不要拿出来,比如PWM频率转换,和长按。
  9. 长按后,要等待按键松开:
    if(PWM_C==1)//³¤°´
    		{
    			HAL_TIM_Base_Start_IT(&htim6);
                //等待定时器到2s,若中途松开,就关闭定时器
    			while(HAL_TIM_Base_GetState(&htim6)==HAL_TIM_STATE_BUSY)
    			{
    				if(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin)==GPIO_PIN_SET)
    				{
    					HAL_TIM_Base_Stop_IT(&htim6);
    					HAL_Delay(50);
    					return;
    				}
    			}
                //等待按键松开
    			while(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin)==GPIO_PIN_RESET);
    		}

  10. 看来最后的问题就是PWM的读取和输出了。
  11. 基础,但是致命的错误:
    1. 要使用定时器中断服务函数,就必须用中断方式打开或关闭定时器!
    2. PWM输出的定时器需要打开对应定时器、打开PWM输出!
    3. PWM输入的定时器也需要打开,还有对应的两个通道!
        /* USER CODE BEGIN WHILE */
      	HAL_TIM_Base_Start(&htim2);
      	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
      	
      	HAL_TIM_Base_Start(&htim3);
      	HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
      	HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);
        while (1)
  12. 修改后发现计算占空比有问题,修改如下:
    PWMOut_Pluse=(volt-1000)/27+10;
  13. 还有时间的话就先保存一份,然后优化代码,消除所有警告,如LCD显示里,把强制类型转换加上。

未解决的问题:

按键长按的实现没有成功,要学习一下。

反思总结

        我们自己学习的时候使用的都是高性能的芯片和开发板,比赛用的设备没有那么好,所以需要我们适应这种设备。而且,实际应用中一般为了降低成本,也需要我们使用较低性能的设备。

  1. 不能总是清屏,应该改成在按下B1后清屏
  2.  每次都要关LED。而且不可以离点亮LED灯的位置太远,不然会闪;
  3. 按键延时就设置为50就行,不快也不慢如果开发板反复无常,就是硬件有问题,要求更换!
  4. 减小值的位置添加清屏或者在写显示函数的时候格式化数字的位数。
  5. 计算要从简
  6. 关于时间的操作可以在TIM中断服务函数中进行的,就不要拿出来
  7. 要使用定时器中断服务函数,就必须用中断方式打开或关闭定时器!
  8. PWM输出的定时器需要打开对应定时器、打开PWM输出!
  9. PWM输入的定时器也需要打开,还有对应的两个通道!
  10. 我发现题目没有让我们交.ioc文件,所以我们应该把所有的Src和Inc中的文件都提交。

之前没有记住的函数:

  1. 改变周期的函数
__HAL_TIM_SetAutoreload



2024/4/1更新:

按键长按问题:长按的功能没问题,只是我忘记我之前设计了自动关灯的功能,LD3总是熄灭以为是长按失败了。

但是第一次的时候长按会识别错误。之后都没问题,可能是硬件问题也可能是定时器初始化有问题。

如果这是比赛的话,我只能提交第一次完成的代码,做一些简单的检查。复杂的检查可能就来不及了。第一次做题,收获很大。

可以实现完整题目功能的代码如下:

main.c:

/* USER CODE BEGIN PV */
uint8_t B1_key=1;
uint8_t PWMOut_Mode=1;//1:µÍƵ
uint32_t PWMOut_Pluse=10;
uint32_t PWMIn_f=0;

uint8_t PARA_mode=1;
uint16_t PARA_R=1;
uint16_t PARA_K=1;

uint8_t changeMode=1;
uint32_t changeNum=0;
uint8_t PWM_C=1;
uint32_t volt=0;

char LCD_str[20];
uint16_t PWMChangeTim=0;
uint32_t Period=200;

float Data_V=0.0;//(uint32_t)((PWMIn_f*6.28*PARA_R)/(100*PARA_K));
uint8_t V_change=1;
float V_Hmax=0.0;
float V_Lmax=0.0;
/* 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 */
//LED¿ØÖƺ¯Êý
void LED_Switch(uint16_t GPIO_Pin,GPIO_PinState PinState)
{
	HAL_GPIO_WritePin(GPIOC,GPIO_Pin,PinState);
	HAL_GPIO_WritePin(GPIOD,LED_LE_Pin,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,LED_LE_Pin,GPIO_PIN_RESET);
}

//¶ÁÈ¡µçѹ¸Ä±äPWMÕ¼¿Õ±È
void Read_ADC()
{
	HAL_ADC_Start(&hadc2);
	if(PWM_C==1&&HAL_ADC_PollForConversion(&hadc2,200)==HAL_OK)
	{
		volt=(3300*HAL_ADC_GetValue(&hadc2))>>12;
		if(volt<=1000)
			PWMOut_Pluse=10;
		else if(volt>=3000)
			PWMOut_Pluse=85;
		else
			PWMOut_Pluse=(volt-1000)/27+10;
		
		if(PWMOut_Mode==1)
			__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,PWMOut_Pluse*2);
		else
			__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,PWMOut_Pluse);
	}
	
}

//¼ÆËãËÙ¶È
void Set_V()
{
	
	if(PWMOut_Mode==1)
		PWMIn_f=4000;
	else
		PWMIn_f=8000;
	
	Data_V=(PWMIn_f*6.28*PARA_R)/(100*PARA_K);
}

//¼Ç¼ËÙ¶È
void rem_V()
{
	if(V_change==0)
	{
		HAL_TIM_Base_Stop_IT(&htim4);
		V_change=1;
	}
		HAL_TIM_Base_Start_IT(&htim4);
		V_change=0;
}


//°´¼ü1
void B1Fun()
{
	B1_key++;
	LCD_Clear(Black);
	if(B1_key>3)
		B1_key=1;
}

//°´¼ü2
void B2Fun()
{
	if(B1_key==1&&changeMode==1)
	{
		changeNum++;
		changeMode=0;
		HAL_TIM_Base_Start_IT(&htim7);
	}
	else if(B1_key==2)
	{
		if(PARA_mode==1)
			PARA_mode=0;
		else 
			PARA_mode=1;
	}
}

//°´¼ü3
void B3Fun()
{
	if(B1_key==2)
	{
		if(PARA_mode==1)
		{
			PARA_R++;
			if(PARA_R>10)
				PARA_R=1;
		}

		else
		{
			PARA_K++;
			if(PARA_K>10)
				PARA_K=1;
		}
	}
}

//°´¼ü4
void B4Fun()
{
	if(B1_key==2)
	{
		//LCD_ClearLine(Line4);
		//LCD_ClearLine(Line5);
		if(PARA_mode==1)
		{
			PARA_R--;
			if(PARA_R<1)
				PARA_R=10;
		}
		else
		{
			PARA_K--;
			if(PARA_K<1)
				PARA_K=10;
		}
	}
	else if(B1_key==1)
	{
		if(PWM_C==1)//³¤°´
		{
			
			HAL_TIM_Base_Start_IT(&htim6);
			while(HAL_TIM_Base_GetState(&htim6)==HAL_TIM_STATE_BUSY)
			{
				if(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin)==GPIO_PIN_SET)
				{
					HAL_TIM_Base_Stop_IT(&htim6);
					return;
				}
			}
			while(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin)==GPIO_PIN_RESET);
			HAL_Delay(50);
		}
		else
		{
				PWM_C=1;
		}
	}
}

//°´¼üɨÃ躯Êý
void KeyScan()
{
	uint32_t keyDelay=50;
	if(HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin)==GPIO_PIN_RESET)
	{
		HAL_Delay(keyDelay);
		if(HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin)==GPIO_PIN_RESET)
		{
			B1Fun();
		}
	}
	
	if(HAL_GPIO_ReadPin(B2_GPIO_Port,B2_Pin)==GPIO_PIN_RESET)
	{
		HAL_Delay(keyDelay);
		if(HAL_GPIO_ReadPin(B2_GPIO_Port,B2_Pin)==GPIO_PIN_RESET)
		{
			B2Fun();
		}
	}
	
	if(HAL_GPIO_ReadPin(B3_GPIO_Port,B3_Pin)==GPIO_PIN_RESET)
	{
		HAL_Delay(keyDelay);
		if(HAL_GPIO_ReadPin(B3_GPIO_Port,B3_Pin)==GPIO_PIN_RESET)
		{
			B3Fun();
		}
	}
	
	if(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin)==GPIO_PIN_RESET)
	{
		HAL_Delay(keyDelay);
		if(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin)==GPIO_PIN_RESET)
		{
			B4Fun();
		}
	}
}

/* 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 */
	LCD_Init();
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
	LCD_Clear(Black);
  /* 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_ADC2_Init();
  MX_TIM2_Init();
  MX_TIM3_Init();
  MX_TIM6_Init();
  MX_TIM7_Init();
  MX_TIM15_Init();
  MX_TIM4_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
	HAL_TIM_Base_Start(&htim2);
	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
	
	HAL_TIM_Base_Start(&htim3);
	HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
	HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);
  while (1)
  {
		KeyScan();
		Read_ADC();
		Set_V();
		if(B1_key==1)
		{

			LED_Switch(LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin|LED5_Pin|LED6_Pin|LED7_Pin|LED8_Pin,GPIO_PIN_SET);
			if(PWM_C==0)
				LED_Switch(LED3_Pin,GPIO_PIN_RESET);
			LED_Switch(LED1_Pin,GPIO_PIN_RESET);
			
			LCD_DisplayStringLine(Line2,(u8*)"        DATA");
			if(PWMOut_Mode==1)
				LCD_DisplayStringLine(Line4,(u8*)"     M=L");
			else
				LCD_DisplayStringLine(Line4,(u8*)"     M=H");
			
			sprintf(LCD_str,"     P=%2d%c",PWMOut_Pluse,'%');
			LCD_DisplayStringLine(Line5,(u8*)LCD_str);
			
			sprintf(LCD_str,"     V=%.1f",Data_V);
			LCD_DisplayStringLine(Line6,(u8*)LCD_str);
		}
		else if(B1_key==2)
		{
			LED_Switch(LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin|LED5_Pin|LED6_Pin|LED7_Pin|LED8_Pin,GPIO_PIN_SET);
			LCD_DisplayStringLine(Line2,(u8*)"        PARA");

			sprintf(LCD_str,"     R=%2d",PARA_R);
			LCD_DisplayStringLine(Line4,(u8*)LCD_str);
			
			sprintf(LCD_str,"     K=%2d",PARA_K);
			LCD_DisplayStringLine(Line5,(u8*)LCD_str);
		}
		else if(B1_key==3)
		{
			LED_Switch(LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin|LED5_Pin|LED6_Pin|LED7_Pin|LED8_Pin,GPIO_PIN_SET);
			
			rem_V();
			LCD_DisplayStringLine(Line2,"        RECD");

			sprintf(LCD_str,"     N=%d",changeNum);
			LCD_DisplayStringLine(Line4,(u8*)LCD_str);
			
			sprintf(LCD_str,"     MH=%.1f",V_Hmax);
			LCD_DisplayStringLine(Line5,(u8*)LCD_str);			
			
			sprintf(LCD_str,"     ML=%.1f",V_Lmax);
			LCD_DisplayStringLine(Line6,(u8*)LCD_str);		
		}
    /* 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();
  }
}

main.h:

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MAIN_H
#define __MAIN_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "stm32g4xx_hal.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "lcd.h"
#include <stdio.h>
/* USER CODE END Includes */

/* Exported types ------------------------------------------------------------*/
/* USER CODE BEGIN ET */

/* USER CODE END ET */

/* Exported constants --------------------------------------------------------*/
/* USER CODE BEGIN EC */

/* USER CODE END EC */

/* Exported macro ------------------------------------------------------------*/
/* USER CODE BEGIN EM */

/* USER CODE END EM */

/* Exported functions prototypes ---------------------------------------------*/
void Error_Handler(void);

/* USER CODE BEGIN EFP */
void LED_Switch(uint16_t GPIO_Pin,GPIO_PinState PinState);
/* USER CODE END EFP */

/* Private defines -----------------------------------------------------------*/
#define LED6_Pin GPIO_PIN_13
#define LED6_GPIO_Port GPIOC
#define LED7_Pin GPIO_PIN_14
#define LED7_GPIO_Port GPIOC
#define LED8_Pin GPIO_PIN_15
#define LED8_GPIO_Port GPIOC
#define B4_Pin GPIO_PIN_0
#define B4_GPIO_Port GPIOA
#define B1_Pin GPIO_PIN_0
#define B1_GPIO_Port GPIOB
#define B2_Pin GPIO_PIN_1
#define B2_GPIO_Port GPIOB
#define B3_Pin GPIO_PIN_2
#define B3_GPIO_Port GPIOB
#define LED1_Pin GPIO_PIN_8
#define LED1_GPIO_Port GPIOC
#define LED2_Pin GPIO_PIN_9
#define LED2_GPIO_Port GPIOC
#define LED3_Pin GPIO_PIN_10
#define LED3_GPIO_Port GPIOC
#define LED4_Pin GPIO_PIN_11
#define LED4_GPIO_Port GPIOC
#define LED5_Pin GPIO_PIN_12
#define LED5_GPIO_Port GPIOC
#define LED_LE_Pin GPIO_PIN_2
#define LED_LE_GPIO_Port GPIOD

/* USER CODE BEGIN Private defines */
extern uint8_t B1_key;
extern uint8_t PWMOut_Mode;
extern uint32_t PWMOut_Pluse;
extern uint32_t PWMIn_f;

extern uint8_t PARA_mode;
extern uint16_t PARA_R;
extern uint16_t PARA_K;
extern float Data_V;//(uint32_t)((PWMIn_f*6.28*PARA_R)/(100*PARA_K));

extern uint8_t changeMode;
extern uint32_t changeNum;
extern uint8_t PWM_C;
extern char LCD_str[];
extern uint16_t PWMChangeTim;
extern uint32_t Period;
extern uint8_t V_change;
extern float V_Hmax;
extern float V_Lmax;
/* USER CODE END Private defines */

#ifdef __cplusplus
}
#endif

#endif /* __MAIN_H */

/**
  * @brief This function handles ADC1 and ADC2 global interrupt.
  */
void ADC1_2_IRQHandler(void)
{
  /* USER CODE BEGIN ADC1_2_IRQn 0 */

  /* USER CODE END ADC1_2_IRQn 0 */
  HAL_ADC_IRQHandler(&hadc2);
  /* USER CODE BEGIN ADC1_2_IRQn 1 */

  /* USER CODE END ADC1_2_IRQn 1 */
}

/**
  * @brief This function handles TIM1 break interrupt and TIM15 global interrupt.
  */
void TIM1_BRK_TIM15_IRQHandler(void)
{
  /* USER CODE BEGIN TIM1_BRK_TIM15_IRQn 0 */

  /* USER CODE END TIM1_BRK_TIM15_IRQn 0 */
  HAL_TIM_IRQHandler(&htim15);
  /* USER CODE BEGIN TIM1_BRK_TIM15_IRQn 1 */

  /* USER CODE END TIM1_BRK_TIM15_IRQn 1 */
}

/**
  * @brief This function handles TIM2 global interrupt.
  */
void TIM2_IRQHandler(void)
{
  /* USER CODE BEGIN TIM2_IRQn 0 */

  /* USER CODE END TIM2_IRQn 0 */
  HAL_TIM_IRQHandler(&htim2);
  /* USER CODE BEGIN TIM2_IRQn 1 */

  /* USER CODE END TIM2_IRQn 1 */
}

/**
  * @brief This function handles TIM3 global interrupt.
  */
void TIM3_IRQHandler(void)
{
  /* USER CODE BEGIN TIM3_IRQn 0 */

  /* USER CODE END TIM3_IRQn 0 */
  HAL_TIM_IRQHandler(&htim3);
  /* USER CODE BEGIN TIM3_IRQn 1 */

  /* USER CODE END TIM3_IRQn 1 */
}

/**
  * @brief This function handles TIM4 global interrupt.
  */
void TIM4_IRQHandler(void)
{
  /* USER CODE BEGIN TIM4_IRQn 0 */

  /* USER CODE END TIM4_IRQn 0 */
  HAL_TIM_IRQHandler(&htim4);
  /* USER CODE BEGIN TIM4_IRQn 1 */
	V_change=1;
	if(PWMOut_Mode==1)
	{
		if(Data_V>V_Lmax)
			V_Lmax=Data_V;
	}
	else
	{
		if(Data_V>V_Hmax)
			V_Hmax=Data_V;		
	}
	HAL_TIM_Base_Stop_IT(&htim4);
  /* USER CODE END TIM4_IRQn 1 */
}

/**
  * @brief This function handles TIM6 global interrupt, DAC1 and DAC3 channel underrun error interrupts.
  */
void TIM6_DAC_IRQHandler(void)
{
  /* USER CODE BEGIN TIM6_DAC_IRQn 0 */

  /* USER CODE END TIM6_DAC_IRQn 0 */
  HAL_TIM_IRQHandler(&htim6);
  /* USER CODE BEGIN TIM6_DAC_IRQn 1 */

		PWM_C=0;
		LED_Switch(LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin|LED5_Pin|LED6_Pin|LED7_Pin|LED8_Pin,GPIO_PIN_SET);
		LED_Switch(LED1_Pin|LED3_Pin,GPIO_PIN_RESET);
		HAL_TIM_Base_Stop_IT(&htim6);

  /* USER CODE END TIM6_DAC_IRQn 1 */
}

/**
  * @brief This function handles TIM7 global interrupt.
  */
void TIM7_IRQHandler(void)
{
  /* USER CODE BEGIN TIM7_IRQn 0 */

  /* USER CODE END TIM7_IRQn 0 */
  HAL_TIM_IRQHandler(&htim7);
  /* USER CODE BEGIN TIM7_IRQn 1 */
	PWMChangeTim++;
	if(PWMChangeTim==50)
	{
		PWMChangeTim=0;
		changeMode=1;
		if(PWMOut_Mode==1)
		{
			PWMOut_Mode=0;
			__HAL_TIM_SetAutoreload(&htim2,100);
		}
		else
		{
			PWMOut_Mode=1;
			__HAL_TIM_SetAutoreload(&htim2,200);
		}
		
		HAL_TIM_Base_Stop_IT(&htim7);
	}
	else 
	{
		if(PWMOut_Mode==1)
			Period=200-PWMChangeTim*2;
		else
			Period=100+PWMChangeTim*2;
		
		__HAL_TIM_SetAutoreload(&htim2,Period);
		__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,(uint32_t)(Period/PWMOut_Pluse));
		
		LED_Switch(LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin|LED5_Pin|LED6_Pin|LED7_Pin|LED8_Pin,GPIO_PIN_SET);
		LED_Switch(LED1_Pin,GPIO_PIN_RESET);
		HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
		HAL_GPIO_WritePin(GPIOD,LED_LE_Pin,GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOD,LED_LE_Pin,GPIO_PIN_RESET);
	}
  /* USER CODE END TIM7_IRQn 1 */
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年EI会议论文已见刊/检索进展汇总

2023年录用的会议论文已在SPIE、ACM、IEEE等出版社正式上线见刊&#xff0c;并已陆续完成EI Compendex数据库收录&#xff0c;详情如下&#xff1a; EIECT 2023——IEEE出版&#xff0c;并完成EI收录 会议信息&#xff1a; 第三届电子信息工程与计算机技术国际学术会议&…

MapReduce [OSDI‘04] 论文阅读笔记

原论文&#xff1a;MapReduce: Simplified Data Processing on Large Clusters (OSDI’04) 1. Map and Reduce Map&#xff1a;处理键值对&#xff0c;生成一组中间键值对Reduce&#xff1a;合并与同一中间键相关的所有中间值process overview&#xff1a;分割输入数据&#x…

EF数据持久化(三层架构,公司查,改)

效果图 Model设置具体流程在下面链接中 https://blog.csdn.net/Mr_wangzu/article/details/136805824?spm1001.2014.3001.5501 DAL using System; using System.Collections.Generic; using System.Linq; using System.Web; using WebApplication2.Models; namespace WebAppli…

力扣由浅至深 每日一题.20 环形链表

山穷水尽&#xff0c;柳暗花明 —— 24.4.3 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整…

实战webSocket压测(一)webSocket背景

一、什么是webSocket&#xff1f; WebSocket是一种在单个TCP连接上进行全双工通信的协议。它允许在客户端&#xff08;如Web浏览器&#xff09;和服务器之间建立持久的连接&#xff0c;实现全双工通信。 二、WebSocket出现的背景 1、http协议背景&#xff1a; 以B/S架构为例…

【数据结构】学会了波兰表达式与逆波兰表达式,怎么能允许自己不会通过计算机进行表达式转换呢?

栈在表达式转换中的应用 导读一、中缀表达式二、表达式的组成部分2.1 单一运算符2.2 不带括号的混合运算符2.3 带括号的混合运算符 三、表达式改写3.1 问题分析3.2 算法设计3.3 算法实现3.4 算法测试 结语 导读 大家好&#xff01;很高兴又和大家见面啦&#xff01;&#xff0…

moveit中RM65-B适配拓展轴一体规划

Moveit适配拓展轴 1.概述 睿尔曼关节模组和机械臂连接时可以被自动识别&#xff0c;并且睿尔曼机械臂提供同时控制机械臂和拓展关节模组的通信协议&#xff08;限一个拓展关节&#xff09;。因此&#xff0c;用户可以在RM机械臂的基础上添加外部关节&#xff0c;构建新的机器…

顶级Layer-3 通证正在飙升,布局龙头Degen Chain(含bitget教程)

近期以太坊生态内&#xff0c;Base 一枝独秀&#xff0c;其 TVL 突破 25 亿美元&#xff0c;创历史新高。并且生态内的社交文化和 DeFi 板块的龙头都很惹眼。 Farcaster 协议上的 meme 币 DEGEN 目前价格为 0.018 美元&#xff0c;7 日涨幅达 376%。 DEGEN 兴起于 Farcaster 的…

备考2024年思维100春季线上比赛?来做做官方模拟题(附答案)

2024年春季思维100活动第一阶段线上比赛&#xff08;4月20日&#xff0c;星期六&#xff0c;上午&#xff09;的报名正在进行中&#xff0c;报名时间截止到为4月6日&#xff08;本周六&#xff09;&#xff0c;请设置好闹钟提醒以免错过。更多安排和需要提前了解的关键点可以见…

制作一个一键运行的10多M的go-cqhttp最简docker镜像

一直有个想自己部署一个QQ机器人&#xff0c;虽然成功完成在Windows环境下基于 go-cqhttp 的搭建工作。但考虑到我有一台常年在线的群晖 NAS&#xff0c;并且已经配置并启用了 Docke r服务&#xff0c;可否将go-cqhttp 迁移至 NAS 上的 Docker 容器中运行吗呢&#xff1f;同时&…

rasa trian 报错解决---Project validation completed with errors.

rasa train 过程中&#xff1a;出现一下问题&#xff1b; Project validation completed with errors. 解决措施:python 3.10版本&#xff0c;rasa 3.6.19, 降低版本 pip3 install rasa3.5.17 -i https://pypi.tuna.tsinghua.edu.cn/simple成功解决

洛谷P1007独木桥(暴力枚举)

题目描述&#xff1a; 说明提示&#xff1a; 思路&#xff1a; 本题的核心思想在于&#xff1a;两人相遇后&#xff0c;转身不计入时间&#xff0c;所以我们可以看作直接穿过去&#xff0c;那么一个人走下桥的时间有两种&#xff0c;一个是本身所在位置x&#xff0c;另一个是l…

CSS基础选择器 小案例复习(画三个小盒子)

&#xff08;大家好&#xff0c;前面我们学习了基础的选择器&#xff0c;俗话说&#xff1a;温故而知新。所以今天我们将通过小案例来复习前面学过的小知识点。另&#xff0c;十分感谢大家对我文章的支持❤️&#xff09; 通过这个案例复习两个地方&#xff1a; 类选择器的使用…

MySQL的基本操作(超详细)

&#x1f468;‍&#x1f4bb;作者简介&#xff1a;&#x1f468;&#x1f3fb;‍&#x1f393;告别&#xff0c;今天 &#x1f4d4;高质量专栏 &#xff1a;☕java趣味之旅 &#x1f4d4;&#xff08;零基础&#xff09;专栏&#xff1a;MSQL数据库 欢迎&#x1f64f;点赞&…

基于k8s的web服务器构建

文章目录 k8s综合项目1、项目规划图2、项目描述3、项目环境4、前期准备4.1、环境准备4.2、ip划分4.3、静态配置ip地址4.4、修改主机名4.5、部署k8s集群4.5.1、关闭防火墙和selinux4.5.2、升级系统4.5.3、每台主机都配置hosts文件&#xff0c;相互之间通过主机名互相访问4.5.4、…

iMessage是怎么成为“黑灰产的乐园”

垃圾/骚扰/色情/钓鱼短信已经成为苹果手机iMessage无法解决的难题。几乎每一位iPhone用户都曾收到过这类短信&#xff0c;被吐槽“每一个iPhone里都藏着一个澳门葡京赌场”。 对于这些垃圾短信&#xff0c;最好的办法就是别点开直接删除&#xff0c;上当/被骗的第一步就是从点开…

go包下载时报proxyconnect tcp: dial tcp 127.0.0.1:80: connectex错误的解决方案

一大早的GoLand就开始抽风了&#xff0c;好几个文件import都红了&#xff0c;于是我正常操作点击提示的sync&#xff0c;但是却报了一堆错&#xff1a; go: downloading google.golang.org/grpc v1.61.1 go: downloading google.golang.org/genproto v0.0.0-20240228224816-df9…

Lambda表达式,Stream流

文章目录 Lambda表达式作用前提函数式接口特点 语法省略模式和匿名对象类的区别 Stream流思想作用三类方法获取方法单列集合(Collection[List,Set双列集合Map(不能直接获取)数组同一类型元素(Stream中的静态方法) 常见的中间方法终结方法收集方法 Optional类 Lambda表达式 作用…

C 回调函数的两种使用方法

对回调&#xff08;callback&#xff09;函数的一点粗陋理解&#xff0c;在我小时候&#xff0c;隔壁村有家月饼小作坊&#xff08;只在中秋那段时间手工制作一些月饼出售&#xff0c;后来好像不做了&#xff09;&#xff0c;做出的月饼是那种很传统很经典的款式&#xff0c;里…

C 练习实例97 - 读磁盘 写磁盘

题目&#xff1a;从键盘输入一些字符&#xff0c;逐个把它们送到磁盘上去&#xff0c;直到输入一个‘#’为止 在桌面新建一个hello.txt文件&#xff0c;内容示例&#xff1a; 代码&#xff1a; #include <stdio.h> #include <stdlib.h>int main() {FILE *fp; //文…