第十三届蓝桥杯嵌入式省赛第二场——程序设计题

一、题目

题目

二、CubeMx配置

1.RCC配置
RCC配置
2.时钟树配置
!!!!注意!!!在HCLK输入80后需要按回车!!!
时钟树配置

3.SYS配置
SYS配置

4.GPIO配置
GPIO配置1
按键配置
GPIO配置3

5.时钟配置和PWM配置
(1)配置定时器4
TIM4
TIM4
(2)配置定时器2,设置PA1输出频率为2KHZ,占空比为5%的PWM脉冲信号
频率为2KHZ
占空比
6.配置串口
串口
串口
7.配置EEPROM
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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值