【STM32G431RBTx】备战蓝桥杯嵌入式→决赛试题→第十三届

news/2024/10/21 23:30:09/

文章目录

    • 前言
    • 一、题目
    • 二、模块初始化
    • 三、代码实现
      • interrupt.h:
      • interrupt.c:
      • main.h:
      • main.c:
    • 四、完成效果
    • 五、总结

前言

一、题目

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

二、模块初始化

1.LCD这里不用配置,直接使用提供的资源包就行
2.ADC:开启ADCsingle-ended
3.LED:开启PC8-15,PD2输出模式就行了。
4.定时器:TIM3(按键消抖定时器):PSC:80-1,ARR:10000-1,TIM17(PWM输出定时器):PSC:80,ARR:65535,TIM2:80-1,ARR:0xffffffff
5.i2c:设置PB6,PB7为GPIO_Output模式即可
6.打开串口串行输出输入

三、代码实现

bsp组中共有:
在这里插入图片描述

interrupt.h:

#ifndef __INTERRUPT_H__
#define __INTERRUPT_H__#include "main.h"
#include "stdbool.h"struct keys
{bool key_sta;unsigned char key_judge;bool single_flag;unsigned int key_time;bool long_flag;
};#endif

interrupt.c:

#include "interrupt.h"struct keys key[4] = {0, 0, 0, 0, 0};void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef * htim)
{if(htim->Instance == TIM3){key[0].key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);key[1].key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);key[2].key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2);key[3].key_sta = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);for(unsigned char i = 0; i < 4; i++){switch(key[i].key_judge){case 0:{if(key[i].key_sta == 0){key[i].key_time = 0;key[i].key_judge = 1;}break;}case 1:{if(key[i].key_sta == 0){key[i].key_judge = 2;}else{key[i].key_judge = 0;}break;}case 2:{if(key[i].key_sta == 1){key[i].key_judge = 0;if(key[i].key_time <= 100){key[i].single_flag = 1;}if(key[i].key_time > 100){key[i].long_flag = 1;}}else{key[i].key_time++;}break;}}}}
}
/* Captured Values */
uint32_t uwIC2Value1_T2CH2 = 0;
uint32_t uwIC2Value2_T2CH2 = 0;
uint32_t uwLowCapture_T2CH2 = 0;
uint32_t uwHighCapture_T2CH2 = 0;
/* Capture index */
uint16_t uhCaptureIndex_T2CH2 = 0;/* Frequency Value */
uint32_t uwFrequency_T2CH2 = 0;
double uwDuty_T2CH2 = 0;void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2){if(uhCaptureIndex_T2CH2 == 0){/* Get the 1st Input Capture value */uwIC2Value1_T2CH2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING);uhCaptureIndex_T2CH2 = 1;}else if(uhCaptureIndex_T2CH2 == 1){/* Get the 2nd Input Capture value */uwIC2Value2_T2CH2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING);/* Capture computation */if (uwIC2Value2_T2CH2 > uwIC2Value1_T2CH2){uwHighCapture_T2CH2 = (uwIC2Value2_T2CH2 - uwIC2Value1_T2CH2); }else if (uwIC2Value2_T2CH2 < uwIC2Value1_T2CH2){/* 0xFFFF is max TIM1_CCRx value */uwHighCapture_T2CH2 = ((0xFFFFFFFF - uwIC2Value1_T2CH2) + uwIC2Value2_T2CH2) + 1;}else{/* If capture values are equal, we have reached the limit of frequencymeasures */Error_Handler();}uhCaptureIndex_T2CH2 = 2;uwIC2Value1_T2CH2 = uwIC2Value2_T2CH2;/* Frequency computation: for this example TIMx (TIM1) is clocked byAPB2Clk */      }else if(uhCaptureIndex_T2CH2 == 2){uwIC2Value2_T2CH2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); if (uwIC2Value2_T2CH2 > uwIC2Value1_T2CH2){uwLowCapture_T2CH2 = (uwIC2Value2_T2CH2 - uwIC2Value1_T2CH2); }else if (uwIC2Value2_T2CH2 < uwIC2Value1_T2CH2){/* 0xFFFF is max TIM1_CCRx value */uwLowCapture_T2CH2 = ((0xFFFFFFFF - uwIC2Value1_T2CH2) + uwIC2Value2_T2CH2) + 1;}uwFrequency_T2CH2 = 1000000 / (uwHighCapture_T2CH2 + uwLowCapture_T2CH2);uwDuty_T2CH2 = uwHighCapture_T2CH2 * 100.0 / (uwHighCapture_T2CH2 + uwLowCapture_T2CH2);uhCaptureIndex_T2CH2 = 0;}}}
}char RxBuffer[30];
unsigned char BufIndex = 0;
unsigned char Rxdat;void HAL_UART_RxCpltCallback(UART_HandleTypeDef * huart)
{if(huart->Instance == USART1){RxBuffer[BufIndex++] = Rxdat;HAL_UART_Receive_IT(huart, &Rxdat, 1);}
}

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) 2023 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 *//* 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 -----------------------------------------------------------*//* USER CODE BEGIN Private defines */
#define DATA 0
#define PARA 1
#define REC 2
#define REC_PA4 3
#define REC_PA5 4
#define MUL 0
#define DIV 1
/* USER CODE END Private defines */#ifdef __cplusplus
}
#endif#endif /* __MAIN_H */

main.c:

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** Copyright (c) 2023 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 "adc.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "interrupt.h"
#include "lcd.h"
#include "stdio.h"
#include "i2c.h"
#include "dadc.h"
#include "stdlib.h"
#include "string.h"
#include "led.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 */
extern struct keys key[4];
unsigned char eeprom_readData;
unsigned char eeprom_writeData;
char text[30];
extern uint32_t uwFrequency_T2CH2;
extern double uwDuty_T2CH2;
double PA4_Volt[1024] = {0}, PA5_Volt[1024] = {0};
unsigned char DisplayMode;
unsigned char REC_DisplayMode = REC_PA4;
unsigned char X = 1;
unsigned char Y = 1;
unsigned char outputMode = MUL;
unsigned int N_PA4;
unsigned int N_PA5;
double A_PA4 = 0;
double A_PA5 = 0;
double T_PA4 = 0;
double T_PA5 = 0;
double SUM_PA4 = 0;
double SUM_PA5 = 0;
double H_PA4 = 0;
double H_PA5 = 0;
extern char RxBuffer[30];
extern unsigned char BufIndex;
extern unsigned char Rxdat;
unsigned char ScanMode;
unsigned char LED;
unsigned int LEDtick;
/* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void DisposeKey(void);
void LCD_Disp(void);
void Rx_Proc(void);
void LED_Control(void);
/* 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_ADC2_Init();MX_TIM2_Init();MX_TIM17_Init();MX_USART1_UART_Init();MX_TIM3_Init();/* USER CODE BEGIN 2 */LCD_Init();LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);getDualADC(&hadc2);HAL_Delay(2);getDualADC(&hadc2);HAL_TIM_Base_Start_IT(&htim3);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);if(eeprom_read(2) == 0x83 && eeprom_read(3) == 0x84 && eeprom_read(4) == 0x85) //²»ÊǵÚÒ»´Î{X = eeprom_read(1);Y = eeprom_read(0);}else{eeprom_write(1, X);HAL_Delay(10);eeprom_write(0, Y);HAL_Delay(10);eeprom_write(2, 0x83);HAL_Delay(10);eeprom_write(3, 0x84);HAL_Delay(10);eeprom_write(4, 0x85);}__HAL_TIM_SET_PRESCALER(&htim17, 80000000 / 100 / (uwFrequency_T2CH2 * X));HAL_TIM_PWM_Start_IT(&htim17, TIM_CHANNEL_1);HAL_UART_Receive_IT(&huart1, &Rxdat, 1);LED_Disp(0x00);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if(BufIndex != 0){unsigned char temp = BufIndex;HAL_Delay(1);if(temp == BufIndex)Rx_Proc();}DisposeKey();LCD_Disp();LED_Control();LED_Disp(LED);
//		sprintf(text, "%.2f%%", uwDuty_T2CH2);
//		LCD_DisplayStringLine(Line1, text);
//		sprintf(text, "%dHz", uwFrequency_T2CH2);
//		LCD_DisplayStringLine(Line2, text);
//		sprintf(text, "%.2f", adc2_in17_AO1 * 3.3 / 4096);
//		LCD_DisplayStringLine(Line3, text);
//		sprintf(text, "%.2f", adc2_in13_AO2 * 3.3 / 4096);
//		LCD_DisplayStringLine(Line4, text);}/* 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 */
void DisposeKey(void)
{if(key[0].single_flag){LCD_Clear(Black);DisplayMode++;DisplayMode %= 3;key[0].single_flag = 0;}if(key[1].single_flag){if(DisplayMode==PARA){X++;if(X==5)X = 1;if(outputMode == MUL)__HAL_TIM_SET_PRESCALER(&htim17, 80000000 / 100 / (uwFrequency_T2CH2 * X));else__HAL_TIM_SET_PRESCALER(&htim17, 80000000 / 100 / (uwFrequency_T2CH2 / X));eeprom_write(1, X);}key[1].single_flag = 0;}if(key[2].single_flag){if(DisplayMode==PARA){Y++;if(Y==5)Y = 1;eeprom_write(0, Y);}key[2].single_flag = 0;}if(key[3].single_flag){if(DisplayMode == DATA){getDualADC(&hadc2);if(N_PA4 + 1 <= 1000){PA4_Volt[N_PA4] = adc2_in17_AO1 * 3.3 / 4096;N_PA4++;A_PA4 = PA4_Volt[0];for(unsigned int i = 0; i < N_PA4; i++){if(A_PA4 < PA4_Volt[i]){A_PA4 = PA4_Volt[i];}}T_PA4 = PA4_Volt[0];for(unsigned int i = 0; i < N_PA4; i++){if(T_PA4 > PA4_Volt[i]){T_PA4 = PA4_Volt[i];}}SUM_PA4 = 0;for(unsigned int i = 0; i < N_PA4; i++){SUM_PA4 += PA4_Volt[i];}H_PA4 = SUM_PA4 / N_PA4;}else{for(unsigned int i = 0; i < 999; i++){PA4_Volt[i] = PA4_Volt[i+1];}PA4_Volt[999] = adc2_in17_AO1 * 3.3 / 4096;A_PA4 = PA4_Volt[0];for(unsigned int i = 0; i < 1000; i++){if(A_PA4 < PA4_Volt[i]){A_PA4 = PA4_Volt[i];}}T_PA4 = PA4_Volt[0];for(unsigned int i = 0; i < 1000; i++){if(T_PA4 > PA4_Volt[i]){T_PA4 = PA4_Volt[i];}}SUM_PA4 = 0;for(unsigned int i = 0; i < 1000; i++){SUM_PA4 += PA4_Volt[i];}H_PA4 = SUM_PA4 / N_PA4;}if(N_PA5 + 1 <= 1000){PA5_Volt[N_PA5] = adc2_in13_AO2 * 3.3 / 4096;N_PA5++;A_PA5 = PA5_Volt[0];for(unsigned int i = 0; i < N_PA5; i++){if(A_PA5 < PA5_Volt[i]){A_PA5 = PA5_Volt[i];}}T_PA5 = PA5_Volt[0];for(unsigned int i = 0; i < N_PA5; i++){if(T_PA5 > PA5_Volt[i]){T_PA5 = PA5_Volt[i];}}SUM_PA5 = 0;for(unsigned int i = 0; i < N_PA5; i++){SUM_PA5 += PA5_Volt[i];}H_PA5 = SUM_PA5 / N_PA5;}else{for(unsigned int i = 0; i < 999; i++){PA5_Volt[i] = PA5_Volt[i+1];}PA5_Volt[999] = adc2_in13_AO2 * 3.3 / 4096;A_PA5 = PA5_Volt[0];for(unsigned int i = 0; i < 1000; i++){if(A_PA5 < PA5_Volt[i]){A_PA5 = PA5_Volt[i];}}T_PA5 = PA5_Volt[0];for(unsigned int i = 0; i < 1000; i++){if(T_PA5 > PA5_Volt[i]){T_PA5 = PA5_Volt[i];}}SUM_PA5 = 0;for(unsigned int i = 0; i < 1000; i++){SUM_PA5 += PA5_Volt[i];}H_PA5 = SUM_PA5 / N_PA5;}}if(DisplayMode == PARA){outputMode = !outputMode; if(outputMode == MUL)__HAL_TIM_SET_PRESCALER(&htim17, 80000000 / 100 / (uwFrequency_T2CH2 * X));else__HAL_TIM_SET_PRESCALER(&htim17, 80000000 / 100 / (uwFrequency_T2CH2 / X));}if(DisplayMode == REC){if(REC_DisplayMode == REC_PA4)REC_DisplayMode = REC_PA5;else if(REC_DisplayMode == REC_PA5)REC_DisplayMode = REC_PA4;}key[3].single_flag = 0;}if(key[3].long_flag){if(DisplayMode == REC){if(REC_DisplayMode == REC_PA4){for(unsigned int i = 0; i < 1000; i++){PA4_Volt[i] = 0;}N_PA4 = 0;A_PA4 = 0;T_PA4 = 0;H_PA4 = 0;}if(REC_DisplayMode == REC_PA5){for(unsigned int i = 0; i < 1000; i++){PA5_Volt[i] = 0;}N_PA5 = 0;A_PA5 = 0;T_PA5 = 0;H_PA5 = 0;}}key[3].long_flag = 0;}
}void LCD_Disp(void)
{if(DisplayMode == DATA){LCD_DisplayStringLine(Line1, "        DATA ");if(N_PA4 >= 1 && N_PA5 >= 1){sprintf(text, "     PA4=%.2f", PA4_Volt[N_PA4 - 1]);LCD_DisplayStringLine(Line3, text);sprintf(text, "     PA5=%.2f", PA5_Volt[N_PA5 - 1]);LCD_DisplayStringLine(Line4, text);}else{sprintf(text, "     PA4=%.2f", PA4_Volt[0]);LCD_DisplayStringLine(Line3, text);sprintf(text, "     PA5=%.2f", PA5_Volt[0]);LCD_DisplayStringLine(Line4, text);}sprintf(text, "     PA1=%d     ", uwFrequency_T2CH2);LCD_DisplayStringLine(Line5, text);}if(DisplayMode == PARA){LCD_DisplayStringLine(Line1, "        PARA");sprintf(text, "     X=%d", X);LCD_DisplayStringLine(Line3, text);sprintf(text, "     Y=%d", Y);LCD_DisplayStringLine(Line4, text);}if(DisplayMode == REC){if(REC_DisplayMode == REC_PA4){LCD_DisplayStringLine(Line1, "        REC-PA4");sprintf(text, "     N=%d", N_PA4);LCD_DisplayStringLine(Line3, text);sprintf(text, "     A=%.2f", A_PA4);LCD_DisplayStringLine(Line4, text);sprintf(text, "     T=%.2f", T_PA4);LCD_DisplayStringLine(Line5, text);sprintf(text, "     H=%.2f", H_PA4);LCD_DisplayStringLine(Line6, text);}if(REC_DisplayMode == REC_PA5){LCD_DisplayStringLine(Line1, "        REC-PA5");sprintf(text, "     N=%d", N_PA5);LCD_DisplayStringLine(Line3, text);sprintf(text, "     A=%.2f", A_PA5);LCD_DisplayStringLine(Line4, text);sprintf(text, "     T=%.2f", T_PA5);LCD_DisplayStringLine(Line5, text);sprintf(text, "     H=%.2f", H_PA5);LCD_DisplayStringLine(Line6, text);}}
}int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart1, (unsigned char *)&ch, 1, HAL_MAX_DELAY);return ch;
}void Rx_Proc(void)
{if(BufIndex == 1){if(RxBuffer[0] == 'X')printf("X:%d\r\n", X);else if(RxBuffer[0] == 'Y')printf("Y:%d\r\n", Y);else if(RxBuffer[0] == '#'){LCD_Clear(Black);ScanMode = !ScanMode;if(ScanMode) //反向{LCD_WriteReg(R1, 0x0100); //垂直对称翻转LCD_WriteReg(R96, 0xA700); //水平对称翻转}else //正向{LCD_WriteReg(R1, 0x0000);LCD_WriteReg(R96, 0x2700);}}}if(BufIndex == 3){if(RxBuffer[0] == 'P' && RxBuffer[1] == 'A'){if(RxBuffer[2] == '1')printf("PA1:%d\r\n", uwFrequency_T2CH2);else if(RxBuffer[2] == '4'){if(N_PA4){printf("PA4:%.2f\r\n", PA4_Volt[N_PA4 - 1]);}else{printf("PA4:%.2f\r\n", PA4_Volt[0]);}}else if(RxBuffer[2] == '5'){if(N_PA4){printf("PA5:%.2f\r\n", PA5_Volt[N_PA5 - 1]);}else{printf("PA5:%.2f\r\n", PA5_Volt[0]);}}}}memset(RxBuffer, 0, 30);BufIndex = 0;
}void LED_Control(void)
{if(uwTick - LEDtick >= 100){LEDtick = uwTick;if(PA4_Volt[N_PA4-1] > PA5_Volt[N_PA5-1] * Y){LED ^= 0x04;}}if(outputMode == MUL){LED |= 0x01;LED &= ~0x02;}else{LED &= ~0x01;LED |= 0x02;}if(ScanMode == 0){LED |= 0x08;}else{LED &= ~0x08;}
}/* 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 */

四、完成效果

蓝桥杯嵌入式第十三届国赛试题实现效果

五、总结

本篇文章只是为了存放我的代码,所以看不懂很正常,如果需要代码可以找我私信。
十三届考了LCD翻转是从未有过的,我是看了第十三届蓝桥杯嵌入式国赛真题(基于HAL库的巨简代码+超级详解)才明白的,大家也可以学习一下链接中文章的写法。


http://www.ppmy.cn/news/93178.html

相关文章

leetcode 917. 仅仅反转字母

题目描述解题思路执行结果 leetcode 917. 仅仅反转字母. 题目描述 仅仅反转字母 给你一个字符串 s &#xff0c;根据下述规则反转字符串&#xff1a; 所有非英文字母保留在原有位置。 所有英文字母&#xff08;小写或大写&#xff09;位置反转。 返回反转后的 s 。 示例 1&…

SQL注入 - Part 3(带外)

1、DNSLog注入 &#xff08;一种注入新思路&#xff09; 可以看到DNS的解析日志中包含了用户名。 基于此原理&#xff0c;可以手工构造注入点&#xff0c;让DNSlog显示库名、表名等&#xff0c;也可以使用自动化脚本Dnslogsqlinj进行获取。 2、SQL注入的防御 基于关键字&…

如何获取HTTP请求时间与响应时间【附源码】

文章目录 一、问题描述二、抓包观察三、查找文档四、思考尝试五、精益求精六、源码解说 一、问题描述 今日遇到了一个问题&#xff0c;要去获取HTTP报文在请求和响应的时间&#xff0c;因为没有原生的API可以调用&#xff0c;所以需要一定的技巧~ 下面主体的框架和代码&#xf…

超级独角兽 Databricks 的崛起之路

在数据扩张以及 AI 兴起的时代&#xff0c;数据存储和分析平台拥有巨大价值和能量。 随着互联网数据的爆炸性增长&#xff0c;数据已经成为企业的新型资源&#xff0c;犹如石油般重要。越来越多的企业希望利用各种结构化和非结构化数据来发挥自己的优势。 然而&#xff0c;他…

android 12.0app安装黑名单(限制app安装)

1.概述 在12.0定制化开发中,最近由项目需求要实现对某些app应用安装限制也就是app安装黑名单功能,在黑名单之中的应用会被限制安装,不能安装到系统中 功能分析 在系统中PMS就是负责管理app安装和卸载的,在安装的时候判断是不是在安装黑名单中,然后决定是否安装这个app 2.…

【华为OD机试真题2023B卷 JAVA】代码编辑器

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 代码编辑器 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 某公司为了更高效的编写代码, 邀请你开发一款代码编辑器程序。 程序的输入为 已有的代码文本和指令序列,程序需输出编辑后的最终文本。指针初始位置位于…

CSDN如何获得铁粉

文章目录 前言一、提供有价值的内容二、坚持写作并保持频率三、积极互动和维护粉丝关系四、针对受众变化调整文章方向总结 前言 最近看到CSDN也是有这个活动&#xff0c;我也想参加一下&#xff0c;现在我就为大家分享一下怎么样获得铁粉吧。 一、提供有价值的内容 提供有价…

Linux 内核启动流程与入口函数分析

从启动引导程序 bootloader&#xff08;uboot&#xff09;跳转到 Linux 内核后&#xff0c;Linux 内核开始启动&#xff0c;今天我们分析一下 Linux 内核启动入口。 跳转过去初始化肯定是在汇编文件中&#xff0c;根据架构可以选择不同的平台&#xff0c;这里看一下链接汇编文…