蓝桥杯嵌入式第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 ;
}