一、题目
二、CubuMX配置
1.RCC配置
2.时钟树配置
注意在HCLK里面输入80后,需要按回车!!!!
3.SYS配置
4.GPIO配置
5.配置定时器
(1)配置定时器4
(2)配置定时器2,使得PA1输出占空比为1KHZ 50%的脉冲信号
6.配置串口
三、题目解析
这一届的题目用到的模块是LED、按键,LCD、串口和PWM输出。
其中在这届题目中需要改变PWM的频率和占空比。
修改PWM的占空比:所用到的函数是__HAL_TIM_SetCompare,该函数的第一个参数是所用到的定时器,第二个参数是所选择的通道,第三个参数是比较值。占空比=(比较值/(1+重装载值))*100,所以一般我都是把重装载值设为100,这样比较值的值就相当于占空比的值
__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,50);
修改PWM的频率:所用到的函数是__HAL_TIM_SET_PRESCALER,该函数的第一个参数是所用到的时钟,第二个参数是预分频系数
频率=80MHZ/(预分频系数+1)/(重装载值+1)
__HAL_TIM_SET_PRESCALER(&htim2,(80000000/1000.0/100.0));
!!!注意:修改频率也可以选择修改重装载值,但是为了好计算占空比,我选择了修改预分频系数;修改重装载值用到的函数是__HAL_TIM_SET_AUTORELOAD,该函数有两个参数,第一个参数是所用到的定时器,第二个参数是修改后的重装载值。
四、代码实现
源码地址:
gitee源码地址:第十三届蓝桥杯嵌入式省赛第一场——gitee
github源码地址:第十三届蓝桥杯嵌入式省赛第一场——github
1.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 "tim.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "lcd.h"
#include "led.h"
#include "timer.h"
#include "myusart.h"
#include "stdio.h"
#include "string.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
unsigned char ucled=0x00;
unsigned char lcd_text[30];
unsigned char usart_text[30];
unsigned char view=0;
__IO uint32_t uwTick_Lcd;
__IO uint32_t uwTick_Led;
unsigned char B1='1';
unsigned char B2='2';
unsigned char B3='3';
unsigned char Input_B1='@';
unsigned char Input_B2='@';
unsigned char Input_B3='@';
int F=1000;
int D=50;
unsigned char success_flag=0;//密码正确标志位
int lose_count=0;//输错次数
/* 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 */
void lcd_proc(void);
void key_proc(void);
void usart_proc(void);
void led_proc(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_TIM2_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
led_disp(ucled);
LCD_Init();
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
HAL_TIM_Base_Start_IT(&htim4);
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
HAL_UART_Receive_IT(&huart1,&rxdat,1)</