前言

文中颇有不足,请多多指正!

题目要求

框架图

功能要求

功能概述

  1. 使用 STM32 微控制器 ADC 通道(PB0)测量竞赛板电位器 R37 输出的模拟电压信号 VR37。
  2. 使用 PA6 输出频率固定为 100Hz,占空比可调节的脉冲信号。
  3. 使用 PA7 输出频率固定为 200Hz,占空比可调节的脉冲信号。
  4. 完成 B1、 B2、 B3、 B4 四个独立按键的动作扫描。
  5. 按照显示要求,通过 LCD 显示数据和参数

性能要求

  1. 数据显示界面下电压值更新时间:≤0.1 秒;
  2. PA6、 PA7 输出信号占空比跟随响应时间:≤1 秒;
  3. 按键响应时间:≤0.1 秒;
  4. 输出信号频率精度要求:≤±5%;
  5. 输出信号占空比精度要求:≤±5%。

运行模式

  1. 自动模式: PA6 和 PA7 输出信号占空比相同,与 VR37的关系如下:
    ‘ VR37 = 3.3 * D ’

    ​ - 当 VR37 = 0V 时, PA6 和 PA7 持续输出低电平。

    ​ - 当 VR37 = 3.3V 时, PA6 和 PA7 持续输出高电平。

  2. 手动模式: PA6、 PA7 输出信号占空比通过按键控制,与 VR37值无关。

LCD 显示界面

  1. 数据显示界面

在数据显示界面下,通过 LCD 显示采集电压值和当前运行模式,电压数据保留小数点后两位有效数字。

  1. 参数显示界面

在参数显示界面下,通过 LCD 显示 PA6 通道和 PA7 通道输出占空比参数。

注意:
占空比参数仅在手动模式下起作用,在自动模式下,输出信号占空比取决于电位器电压值 VR37。

  1. LCD 通用显示要求

    • 显示背景色(BackColor):黑色
    • 显示前景色(TextColor):白色
    • 请严格按照图示 2、 3 要求设计各个信息项的名称(区分字母大小写)
      和行列位置。

按键功能

  1. B1:定义为“界面切换”按键,切换 LCD 显示“数据界面”和参数界面。
  2. B2:每次按下 B2 按键, PA6 手动模式占空比参数加 10%,占空比可调整范围10% - 90%,占空比参数增加到90%后,再次按下 B2 按键,返回 10%。
  3. B3:每次按下 B3 按键, PA7 手动模式占空比参数加 10%,占空比可调整范围10% - 90%, 占空比参数增加到 90%后,再次按下 B3 按键,返回 10%。
  4. B4:定义为“模式控制”按键,切换“手动模式”和自动模式。
  5. 通用按键设计要求
    • 按键应进行有效的防抖处理,避免出现一次按下、多次触发等情形。
    • 按键 B2、 B3 仅在参数显示界面有效。

LED 指示灯功能

  1. 自动模式 LD1 点亮, 手动模式 LD1 熄灭。
  2. 数据界面 LD2 点亮,参数界面 LD2 熄灭。

初识状态说明

  1. 上电默认处于“自动模式”。
  2. 上电默认处于数据显示界面。
  3. 上电默认参数,PA6 通道占空比 10%, PA7 通道占空比 10%。

实现

因为是竞赛类比赛,非做项目,为了方便,把所有代码放在main.c中了。

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:*                        opensource.org/licenses/BSD-3-Clause********************************************************************************/
/* USER CODE END Header *//* Includes ------------------------------------------------------------------*/
#include "main.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "string.h"
#include "lcd.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 ---------------------------------------------------------*/
ADC_HandleTypeDef hadc2;TIM_HandleTypeDef htim3;
TIM_HandleTypeDef htim17;/* USER CODE BEGIN PV */
uint8_t KEY1_Flag = 0;
uint8_t KEY4_Flag = 0;
uint16_t adc;
char ADC_BUFF[50];
char PA6_BUFF[50];
char PA7_BUFF[50];
double V;
uint16_t Pules6;
uint16_t Pules7;
uint16_t Pules6_MANU;
uint16_t Pules7_MANU;/* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC2_Init(void);
static void MX_TIM3_Init(void);
static void MX_TIM17_Init(void);
/* USER CODE BEGIN PFP */
void Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
//double Get_ADC();
/* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin){           /*检测是否有按键按下 */if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == RESET )  {    /*等待按键释放 */while(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == RESET);   KEY4_Flag = !KEY4_Flag;}}double Get_ADC()
{HAL_ADC_Start(&hadc2);adc = HAL_ADC_GetValue(&hadc2);return (adc * 3.3/4096);}
/* 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_TIM3_Init();MX_TIM17_Init();/* USER CODE BEGIN 2 */LCD_Init();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */HAL_TIM_PWM_Start_IT(&htim3,TIM_CHANNEL_1);HAL_TIM_PWM_Start_IT(&htim17,TIM_CHANNEL_1);LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);while (1){/* USER CODE END WHILE */V = Get_ADC();//数据界面if(KEY1_Flag == 0){sprintf(ADC_BUFF,"     V:%.2fV ",V);LCD_SetTextColor(White);LCD_DisplayStringLine(Line0, (uint8_t*)"      Data ");LCD_DisplayStringLine(Line3, (uint8_t*)ADC_BUFF);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);Key_Scan(GPIOA, GPIO_PIN_0);//自动模式if(KEY4_Flag == 0){LCD_SetTextColor(White);LCD_DisplayStringLine(Line5, (uint8_t*)"     Mode:AUTO ");//自动调整占空比Pules6 = (V/3.3)*10000;__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,Pules6);Pules7 = (V/3.3)*5000;__HAL_TIM_SET_COMPARE(&htim17,TIM_CHANNEL_1,Pules7);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);Pules6_MANU = Pules6/100;Pules7_MANU = Pules7/50;}//手动模式else{LCD_SetTextColor(White);LCD_DisplayStringLine(Line5, (uint8_t*)"     Mode:MANU ");HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);}}//参数界面if(KEY1_Flag == 1){LCD_SetTextColor(White);LCD_DisplayStringLine(Line0, (uint8_t*)"      Para ");sprintf(PA6_BUFF,"     PA6:%d %%   ",Pules6_MANU);LCD_DisplayStringLine(Line3, (uint8_t*)PA6_BUFF);__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,Pules6_MANU*100);sprintf(PA7_BUFF,"     PA7:%d %%   ",Pules7_MANU);LCD_DisplayStringLine(Line5, (uint8_t*)PA7_BUFF);__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,Pules7_MANU*50);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);}/* 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};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};/** Configure the main internal regulator output voltage */HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);/** Initializes the CPU, AHB and APB busses clocks */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 busses 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_3) != HAL_OK){Error_Handler();}/** Initializes the peripherals clocks */PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC12;PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}
}/*** @brief ADC2 Initialization Function* @param None* @retval None*/
static void MX_ADC2_Init(void)
{/* USER CODE BEGIN ADC2_Init 0 *//* USER CODE END ADC2_Init 0 */ADC_ChannelConfTypeDef sConfig = {0};/* USER CODE BEGIN ADC2_Init 1 *//* USER CODE END ADC2_Init 1 *//** Common config */hadc2.Instance = ADC2;hadc2.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;hadc2.Init.Resolution = ADC_RESOLUTION_12B;hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;hadc2.Init.GainCompensation = 0;hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE;hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;hadc2.Init.LowPowerAutoWait = DISABLE;hadc2.Init.ContinuousConvMode = DISABLE;hadc2.Init.NbrOfConversion = 1;hadc2.Init.DiscontinuousConvMode = DISABLE;hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;hadc2.Init.DMAContinuousRequests = DISABLE;hadc2.Init.Overrun = ADC_OVR_DATA_PRESERVED;hadc2.Init.OversamplingMode = DISABLE;if (HAL_ADC_Init(&hadc2) != HAL_OK){Error_Handler();}/** Configure Regular Channel */sConfig.Channel = ADC_CHANNEL_15;sConfig.Rank = ADC_REGULAR_RANK_1;sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;sConfig.SingleDiff = ADC_SINGLE_ENDED;sConfig.OffsetNumber = ADC_OFFSET_NONE;sConfig.Offset = 0;if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK){Error_Handler();}/* USER CODE BEGIN ADC2_Init 2 *//* USER CODE END ADC2_Init 2 */}/*** @brief TIM3 Initialization Function* @param None* @retval None*/
static void MX_TIM3_Init(void)
{/* USER CODE BEGIN TIM3_Init 0 *//* USER CODE END TIM3_Init 0 */TIM_MasterConfigTypeDef sMasterConfig = {0};TIM_OC_InitTypeDef sConfigOC = {0};/* USER CODE BEGIN TIM3_Init 1 *//* USER CODE END TIM3_Init 1 */htim3.Instance = TIM3;htim3.Init.Prescaler = 79;htim3.Init.CounterMode = TIM_COUNTERMODE_UP;htim3.Init.Period = 10000;htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_PWM_Init(&htim3) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK){Error_Handler();}sConfigOC.OCMode = TIM_OCMODE_PWM1;sConfigOC.Pulse = 1000;sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN TIM3_Init 2 *//* USER CODE END TIM3_Init 2 */HAL_TIM_MspPostInit(&htim3);}/*** @brief TIM17 Initialization Function* @param None* @retval None*/
static void MX_TIM17_Init(void)
{/* USER CODE BEGIN TIM17_Init 0 *//* USER CODE END TIM17_Init 0 */TIM_OC_InitTypeDef sConfigOC = {0};TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};/* USER CODE BEGIN TIM17_Init 1 *//* USER CODE END TIM17_Init 1 */htim17.Instance = TIM17;htim17.Init.Prescaler = 79;htim17.Init.CounterMode = TIM_COUNTERMODE_UP;htim17.Init.Period = 5000;htim17.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim17.Init.RepetitionCounter = 0;htim17.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_Base_Init(&htim17) != HAL_OK){Error_Handler();}if (HAL_TIM_PWM_Init(&htim17) != HAL_OK){Error_Handler();}sConfigOC.OCMode = TIM_OCMODE_PWM1;sConfigOC.Pulse = 500;sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;if (HAL_TIM_PWM_ConfigChannel(&htim17, &sConfigOC, TIM_CHANNEL_1) != HAL_OK){Error_Handler();}sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;sBreakDeadTimeConfig.DeadTime = 0;sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;sBreakDeadTimeConfig.BreakFilter = 0;sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;if (HAL_TIMEx_ConfigBreakDeadTime(&htim17, &sBreakDeadTimeConfig) != HAL_OK){Error_Handler();}/* USER CODE BEGIN TIM17_Init 2 *//* USER CODE END TIM17_Init 2 */HAL_TIM_MspPostInit(&htim17);}/*** @brief GPIO Initialization Function* @param None* @retval None*/
static void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOF_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();__HAL_RCC_GPIOD_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8 |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_RESET);/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);/*Configure GPIO pins : PC13 PC14 PC15 PC8 PC9 PC10 PC11 PC12 */GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8 |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);/*Configure GPIO pin : PA0 */GPIO_InitStruct.Pin = GPIO_PIN_0;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/*Configure GPIO pins : PB0 PB1 PB2 */GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);/*Configure GPIO pin : PD2 */GPIO_InitStruct.Pin = GPIO_PIN_2;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);/* EXTI interrupt init*/HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);HAL_NVIC_EnableIRQ(EXTI0_IRQn);HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 0);HAL_NVIC_EnableIRQ(EXTI1_IRQn);HAL_NVIC_SetPriority(EXTI2_IRQn, 0, 0);HAL_NVIC_EnableIRQ(EXTI2_IRQn);}/* USER CODE BEGIN 4 *//*** @brief This function handles EXTI line0 interrupt.*/
void EXTI0_IRQHandler(void)
{/* USER CODE BEGIN EXTI0_IRQn 0 */if(__HAL_GPIO_EXTI_GET_FLAG(GPIO_PIN_0) != RESET){KEY1_Flag = !KEY1_Flag;__HAL_GPIO_EXTI_CLEAR_FLAG(GPIO_PIN_0);}/* USER CODE END EXTI0_IRQn 0 *//* USER CODE BEGIN EXTI0_IRQn 1 *//* USER CODE END EXTI0_IRQn 1 */
}/*** @brief This function handles EXTI line1 interrupt.*/
void EXTI1_IRQHandler(void)
{/* USER CODE BEGIN EXTI1_IRQn 0 */if(__HAL_GPIO_EXTI_GET_FLAG(GPIO_PIN_1) != RESET){if(KEY1_Flag == 1){Pules6_MANU +=  10;if(Pules6_MANU >= 90){Pules6_MANU = 10;}}__HAL_GPIO_EXTI_CLEAR_FLAG(GPIO_PIN_1);}/* USER CODE END EXTI1_IRQn 0 *//* USER CODE BEGIN EXTI1_IRQn 1 *//* USER CODE END EXTI1_IRQn 1 */
}/*** @brief This function handles EXTI line2 interrupt.*/
void EXTI2_IRQHandler(void)
{/* USER CODE BEGIN EXTI2_IRQn 0 */if(__HAL_GPIO_EXTI_GET_FLAG(GPIO_PIN_2) != RESET){if(KEY1_Flag == 1){Pules7_MANU +=  10;if(Pules7_MANU >= 90){Pules7_MANU = 10;}}__HAL_GPIO_EXTI_CLEAR_FLAG(GPIO_PIN_2);}/* USER CODE END EXTI2_IRQn 0 *//* USER CODE BEGIN EXTI2_IRQn 1 *//* USER CODE END EXTI2_IRQn 1 */
}/* 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 *//* 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,tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

最后

笔者才疏学浅,若有不足,还请大佬多多指教!

第十一届蓝桥杯嵌入式省赛练习(STM32G4与HAL库)相关推荐

  1. 蓝桥杯嵌入式——第十一届蓝桥杯嵌入式国赛

    蓝桥杯嵌入式--第十一届蓝桥杯嵌入式国赛 之前准备省赛的时候用的是旧版的STM32F103,从准备国赛开始就用新版STM32G431平台了,主要是想经过新版的准备学习一下HAL库以及CubeMX的使用 ...

  2. 第十一届蓝桥杯嵌入式研究生组赛题

    成绩已经出来了,很难受没有得奖,本来预计能拿到二等,结果连三等都没混上,思前想后只有两种可能: ①我自己提交的axf文件出了问题  ②题目太简单,这届实力太强 复查结果出来了,确认是自己犯了低级错误, ...

  3. 蓝桥杯嵌入式国赛模块训练之数码管

    文章目录 前言 一.电路原理图 1.共阴极数码管 2.SN74LS595N 3. 扩展板跳线帽连接 二.驱动代码 1.seg.h 2.seg.c 总结 前言 数码管是蓝桥杯嵌入式国赛需准备的第一个模块 ...

  4. 蓝桥杯嵌入式——第十二届蓝桥杯嵌入式国赛

    蓝桥杯嵌入式--第十二届蓝桥杯嵌入式国赛 之前准备省赛的时候用的是旧版的STM32F103,从准备国赛开始就用新版STM32G431平台了,主要是想经过新版的准备学习一下HAL库以及CubeMX的使用 ...

  5. 第十一届蓝桥杯JavaA省赛填空题

    第十一届蓝桥杯JavaA省赛填空题 A public class Main {public static void main(String[] args) {int ans = 0;for(int i ...

  6. 【蓝桥杯嵌入式】比赛笔记(2)根据固件库快速配置各模块初始化

    [蓝桥杯嵌入式]比赛笔记(2)根据固件库快速配置各模块初始化 因为蓝桥杯比赛时间很短,并且如果自己去记忆各模块初始化的话,也难免有问题,所以这里给出一个通过固件库的快速初始化模块的方法. 比赛提供固件 ...

  7. 第十三届蓝桥杯嵌入式备赛-STM32G431-基础模块调试①LED/LCD调试

    目录 0.前言 时钟设置 项目设置 1.功能要求 电路原理图 2.STM32Cubemx初始化 3.程序实现 LCD LED 编写LED灯亮灭的相关函数 LED关闭函数 LEDx开启函数 LEDx关闭 ...

  8. 【B类比赛】 第十一届蓝桥杯 省国赛经历

    Now 拿起键盘写下这段话的时候,已经是第12届蓝桥杯省赛前的一天了(2021.4.17). 距离上次蓝桥杯省赛正好6个月了. 如今的我仍在ACM里,这半年经历了挺多事情,退ACM已经势在必行,且行且 ...

  9. 【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式国赛程序设计试题以及详细题解

    文章目录 原题展示 原题分析 详细题解 LED模块 按键模块 串口 LCD模块 模拟电压读取(ADC) 脉冲输入输出 文章福利 原题展示 原题分析   本届国赛试题主要包含LCD.LED.按键.EEP ...

最新文章

  1. 二十八、Node.js中的RESTful API和接口设计
  2. Android开发三:常用控件1--TextView、EditText、Button
  3. 前端工程师后端转型实录
  4. pthread 立即停止线程_pthread线程的终止退出 | 线程的大量创建
  5. 程序语言python循环_Python 循环语句
  6. 常用T-Code总结
  7. 《Python黑帽子》python3代码实现(第五章)
  8. 手把手从零开始学习树莓派教程
  9. 华为设备无线环境中的Portal认证
  10. 关于破解ewebeditor V10.9 编辑器的问题
  11. python 500行 小项目 --- 简单对象模型
  12. 22个免费的UI界面设计工具、资源及网站
  13. 什么是跨域?跨域解决方法
  14. 关于头条上需要总结的文章
  15. 关于gvim的高级应用
  16. 李群SE(3)即欧式变换Euclidean transformation(刚性变换Rigid Transformation)
  17. Jeesite4图片上传
  18. 给Java小白,整理一套能上手的简单编程算法题【含答案】!!!
  19. 【关联分析实战篇】为什么 BI 软件都搞不定关联分析
  20. web类靶机暴力破解

热门文章

  1. STM32F407VET6擦除内部flash时报“cannot halt the core”无法进入debug模式的问题
  2. 车载DVD做E-mark认证有什么意义?
  3. Android系统的改进(四)-- 短信直接加入黑名单功能
  4. Oracle显示中文出现问号(乱码)????
  5. 蓝桥杯 试题 算法训练 印章 C++ 详解
  6. HP2700提示需注意解决方法
  7. Android进阶2之图片倒影效果
  8. java如何测试定时器_如何测试定时任务 - 邓竣的个人页面 - OSCHINA - 中文开源技术交流社区...
  9. patch-wise分类
  10. 网易云10万+音乐竟然能用Python一键下载!