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