蓝桥杯嵌入式第10届真题(完成) STM32G431
题目
main.c
#include "main.h"
#include "adc.h"
#include "tim.h"
#include "gpio.h"
#include "led.h"
#include "key.h"
#include "myadc.h"
#include "stdbool.h"
#include "stdio.h"
int8_t upled = 0x01;
int8_t uplednum = 1;
int8_t lowled = 0x02;
int8_t lowlednum = 2;
float upval = 2.4;
float lowval = 1.2;
float val;
uint32_t led1time = 0;
uint32_t led2time = 0;
uint8_t led1enable = 0;
uint8_t led2enable = 0;
uint8_t view = 0;
uint8_t lcdtext[30];
uint8_t status[30];
extern struct Key key[4];
void SystemClock_Config(void);
void led_process(void);
void lcd_process(void);
void adc_process(void);
void key_process(void);
void lcdclear(void)
{
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC2_Init();
MX_TIM2_Init();
HAL_TIM_Base_Start_IT(&htim2);
LCD_Init();
lcdclear();
led_display(0x00);
while (1)
{
key_process();
adc_process();
lcd_process();
led_process();
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV2;
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();
}
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();
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC12;
PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();
}
}
void led_process(void)
{
static bool led1flag = false;
static bool led2flag = false;
uint32_t currentTick = HAL_GetTick();
if(led1enable && (currentTick - led1time >= 200))
{
led1time = currentTick;
led1flag = !led1flag;
if(led1flag)
{
led_display(upled);
}
else
{
led_display(0x00);
}
}
if(led2enable && (currentTick - led2time >= 200))
{
led2time = currentTick;
led2flag = !led2flag;
if(led2flag)
{
led_display(lowled);
}
else
{
led_display(0x00);
}
}
}
void lcd_process(void)
{
switch(view)
{
case 0:
{
sprintf((char *)lcdtext," Main");
LCD_DisplayStringLine(Line1,lcdtext);
sprintf((char *)lcdtext," Volt:%.2f",val);
LCD_DisplayStringLine(Line4,lcdtext);
sprintf((char *)lcdtext," Status:%s",status);
LCD_DisplayStringLine(Line6,lcdtext);
}break;
case 1:
{
sprintf((char *)lcdtext," Setting");
LCD_DisplayStringLine(Line1,lcdtext);
sprintf((char *)lcdtext," Max Volt:%.2f",upval);
LCD_DisplayStringLine(Line3,lcdtext);
sprintf((char *)lcdtext," Min Volt:%.2f",lowval);
LCD_DisplayStringLine(Line5,lcdtext);
sprintf((char *)lcdtext," Upper:LD%d",uplednum);
LCD_DisplayStringLine(Line7,lcdtext);
sprintf((char *)lcdtext," Lower:LD%d",lowlednum);
LCD_DisplayStringLine(Line9,lcdtext);
}break;
case 2:
{
sprintf((char *)lcdtext," Setting");
LCD_DisplayStringLine(Line1,lcdtext);
sprintf((char *)lcdtext," Max Volt:%.2f",upval);
LCD_SetBackColor(Green);
LCD_DisplayStringLine(Line3,lcdtext);
LCD_SetBackColor(Black);
sprintf((char *)lcdtext," Min Volt:%.2f",lowval);
LCD_DisplayStringLine(Line5,lcdtext);
sprintf((char *)lcdtext," UpperLD:%d",uplednum);
LCD_DisplayStringLine(Line7,lcdtext);
sprintf((char *)lcdtext," Lower:LD%d",lowlednum);
LCD_DisplayStringLine(Line9,lcdtext);
}break;
case 3:
{
sprintf((char *)lcdtext," Setting");
LCD_DisplayStringLine(Line1,lcdtext);
sprintf((char *)lcdtext," Max Volt:%.2f",upval);
LCD_DisplayStringLine(Line3,lcdtext);
sprintf((char *)lcdtext," Min Volt:%.2f",lowval);
LCD_SetBackColor(Green);
LCD_DisplayStringLine(Line5,lcdtext);
LCD_SetBackColor(Black);
sprintf((char *)lcdtext," Upper:LD%d",uplednum);
LCD_DisplayStringLine(Line7,lcdtext);
sprintf((char *)lcdtext," Lower:LD%d",lowlednum);
LCD_DisplayStringLine(Line9,lcdtext);
}break;
case 4:
{
sprintf((char *)lcdtext," Setting");
LCD_DisplayStringLine(Line1,lcdtext);
sprintf((char *)lcdtext," Max Volt:%.2f",upval);
LCD_DisplayStringLine(Line3,lcdtext);
sprintf((char *)lcdtext," Min Volt:%.2f",lowval);
LCD_DisplayStringLine(Line5,lcdtext);
sprintf((char *)lcdtext," Upper:LD%d",uplednum);
LCD_SetBackColor(Green);
LCD_DisplayStringLine(Line7,lcdtext);
LCD_SetBackColor(Black);
sprintf((char *)lcdtext," Lower:LD%d",lowlednum);
LCD_DisplayStringLine(Line9,lcdtext);
}break;
case 5:
{
sprintf((char *)lcdtext," Setting");
LCD_DisplayStringLine(Line1,lcdtext);
sprintf((char *)lcdtext," Max Volt:%.2f",upval);
LCD_DisplayStringLine(Line3,lcdtext);
sprintf((char *)lcdtext," Min Volt:%.2f",lowval);
LCD_DisplayStringLine(Line5,lcdtext);
sprintf((char *)lcdtext," Upper:LD%d",uplednum);
LCD_DisplayStringLine(Line7,lcdtext);
sprintf((char *)lcdtext," Lower:LD%d",lowlednum);
LCD_SetBackColor(Green);
LCD_DisplayStringLine(Line9,lcdtext);
LCD_SetBackColor(Black);
}break;
}
}
void adc_process(void)
{
val = getADcVal(&hadc2);
if(val>upval)
{
led1enable = 1;
led2enable = 0;
sprintf((char *)status,"Upper ");
}else if(val<=upval&&val>=lowval)
{
led1enable = 0;
led2enable = 0;
led_display(0x00);
sprintf((char *)status,"Normal ");
}else{
led1enable = 0;
led2enable = 1;
sprintf((char *)status,"Lower ");
}
}
void key_process(void)
{
if(key[0].key_single_flag)
{
lcdclear();
key[0].key_single_flag = 0;
if(view==0)
{
view = 1;
}else if(view==1||view==2||view==3||view==4||view==5)
{
view = 0;
}
}
if(key[1].key_single_flag)
{
lcdclear();
key[1].key_single_flag = 0;
if(view==1)
{
view = 2;
}else if(view>=2&&view<=5)
{
view++;
if(view>5)
view = 2;
}
}
if(key[2].key_single_flag) {
key[2].key_single_flag = 0;
if(view == 4) {
uplednum = (uplednum % 8) + 1;
upled = 0x01 << (uplednum - 1);
} else if(view == 5) {
lowlednum = (lowlednum % 8) + 1;
lowled = 0x01 << (lowlednum - 1);
}
}
if(key[3].key_single_flag) {
key[3].key_single_flag = 0;
if(view == 4) {
uplednum = (uplednum == 1) ? 8 : uplednum - 1;
upled = 0x01 << (uplednum - 1);
} else if(view == 5) {
lowlednum = (lowlednum == 1) ? 8 : lowlednum - 1;
lowled = 0x01 << (lowlednum - 1);
}
}
}
void Error_Handler(void)
{
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif
key.c
#include "key.h"
struct Key key[4]={0,0,0,0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2)
{
key[0].key_gpio = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
key[1].key_gpio = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
key[2].key_gpio = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
key[3].key_gpio = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
for(int i = 0;i<4;i++)
{
switch(key[i].key_status)
{
case 0:
{
if(key[i].key_gpio==0)
{
key[i].key_status = 1;
}
}break;
case 1:
{
if(key[i].key_gpio==0)
{
key[i].key_single_flag = 1;
key[i].key_status = 2;
}else{
key[i].key_status = 0;
}
}break;
case 2:
{
if(key[i].key_gpio==1)
{
key[i].key_status = 0;
}
}break;
}
}
}
}
led.c
#include "led.h"
void led_display(uint8_t led)
{
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);
HAL_GPIO_WritePin(GPIOC,led<<8,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
myadc.c
#include "myadc.h"
float getADcVal(ADC_HandleTypeDef *hadc)
{
float val;
HAL_ADC_Start(hadc);
val = HAL_ADC_GetValue(hadc);
return val*3.3f/4096;
}