一、题目
二、CubeMx配置
1.RCC配置
2.时钟树配置
!!!!注意!!!在HCLK输入80后需要按回车!!!
3.SYS配置
4.GPIO配置
5.时钟配置和PWM配置
(1)配置定时器4
(2)配置定时器2,设置PA1输出频率为2KHZ,占空比为5%的PWM脉冲信号
6.配置串口
7.配置EEPROM
三、题目解析
1.这一届的题目需要从EEPROM读取和写入数据,则需要判断是否为第一次上电,如果不是第一次上电,就将从EEPROM里面读取出来的数据分别赋值给商品的库存数量和商品的单价;如果是第一次上电就把商品的库存数量和单价存入到EEPROM中去。当商品的库存数量和单价发生改变时,EEPROM里面对应的也要发生改变,即需要重新写入。
2.在本届试题中,只需要修改PWM的占空比,不需要修改PWM的频率。修改PWM频率所用的函数是__HAL_TIM_SetCompare,该函数的第一个参数是所用到的定时器,第二个参数是所选择的通道,第三个参数是比较值
占空比=(比较值)/(重装载值+1)*100
为了方便计算,我在CubeMx配置时,将重装载值配置成了100-1,这样比较值的值就相当于占空比的值
__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,5);
四、代码实现
源码地址:
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 "stdio.h"
#include "string.h"
#include "lcd.h"
#include "led.h"
#include "myusart.h"
#include "timer.h"
#include "i2c - hal.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 int X_shop=0;
unsigned int Y_shop=0;
double X_price=1.0;
double Y_price=1.0;
unsigned int X_rep=10;
unsigned int Y_rep=10;
unsigned char buy_flag=0;//购买标志
extern unsigned int buy_sec;
/* 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_TIM4_Init();
MX_USART1_UART_Init();
MX_TIM2_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);
//第一次上电
if((eeprom_read(4)!=4)&&(eeprom_read(5)!=5))
{
eeprom_write(0,X_rep);
HAL_Delay(5);
eeprom_write(1,Y_rep);
HAL_Delay(5);
eeprom_write(2,(X_price*10));
HAL_Delay(5);
eeprom_write(3,(Y_price*10));
HAL_Delay(5);
eeprom_write(4,4);
HAL_Delay(5);
eeprom_write(5,5);
HAL_Delay(5);
}
else
{
//不是第一次上电,直接从EEPROM读取
X_rep=eeprom_read(0);
HAL_Delay(5);
Y_rep=eeprom_read(1);
HAL_Delay(5);
X_price=eeprom_read(2)/10.0;
HAL_Delay(5);
Y_price=eeprom_read(3)/10.0;
HAL_Delay(5);
}
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
key_proc();
lcd_proc();
if(rx_pointer!=0)
{
int temp=rx_pointer;
HAL_Delay(2);
if(temp==rx_pointer)
usart_proc();
}
led_proc();
}
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(