由于在网上国赛的资源少之又少,导致我在备战国赛的时候走了不少的弯路。现在国赛已经打完了,想着帮助后续的学习者少走弯路,所以就先把13届的国赛真题代码分享出来啦~
由于主包的编程能力也不算很强,所以我的代码里面几乎没用到指针结构体之类的知识点哈哈哈哈哈哈哈
有写的不好的地方大家可以给给建议呀
有不懂的也可以发在评论区问问主包呀(也可以偷偷加主包的v哦~(v1+v2))(v1:L15889)
主包后续也会分享一些4t的真题模拟题出来的,都是在4t测评过满分的!!(v2:258519)
以下是配置
按键为上拉输入(input mode),LED为 Hight
TIM2(要使能)
TIM3
TIM6(用于按键长按)
TIM7(用于串口接收不定长数据)
串口(PA9,PA10 开使能)
ADC2
时钟配置
以下是13届国赛真题代码~
//这里是user.c文件中的代码 #include "headerfile.h" char H[20]; double RECPA4[100]; double RECPA5[100]; double data[2]; uint8_t B0_s=1,B0_e=1; uint8_t B1_s=1,B1_e=1; uint8_t B2_s=1,B2_e=1; uint8_t A0_s=1,A0_e=1; uint8_t mode=1,mode_clean=1,mode_rec=1,mode_pwm=1,mode_lcd=1,mode_lcd_clean=1; uint8_t X=1,Y=1; uint8_t adc_start=0; uint8_t Num_PA4=0,Num_PA5=0; uint32_t campare,fre; double VPA4=0,VPA5=0; double max_PA4=0,min_PA4=0,mean_PA4=0; double max_PA5=0,min_PA5=0,mean_PA5=0; __IO uint32_t ledtick=0; //串口所需参数 char uart_buf[20]; char uart_data=0; uint8_t uart_start=0; uint8_t uart_count=0; //用户初始化 void user_Init(void) { //LCD初始化 LCD_Init(); LCD_Clear(Black); LCD_SetBackColor(Black); LCD_SetTextColor(White); //LED初始化 HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET); //定时器初始化 HAL_TIM_Base_Start(&htim6);//按键 HAL_TIM_Base_Start(&htim7);//串口不定长 HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);//PWM输出 TIM3->CCR2=50; HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);//输入捕获 //串口初始化 HAL_UART_Receive_IT(&huart1,(unsigned char *)&uart_data,1); //Eeprom初始化 I2CInit();RW(); } //掉电保存 void RW(void) { uint8_t dat=eeprom_read(10); if(dat==255) { X=1;Y=1; eeprom_write(0,Y); eeprom_write(1,X); eeprom_write(10,1); } else if(dat==1) { X=eeprom_read(1); Y=eeprom_read(0); } } //用户界面控制 void user_UI(void) { get_v(&hadc2); if(mode!=mode_clean||mode_lcd!=mode_lcd_clean) { LCD_Clear(Black); if(mode!=mode_clean) mode_rec=1; } mode_clean=mode; mode_lcd_clean=mode_lcd; user_LCD(); switch(mode) { case 1:DATA();break; case 2:PARA();break; case 3: if(mode_rec==1) REC_PA4(); if(mode_rec==2) REC_PA5(); break; } LED();PWM(); CAMPARE(); } //屏幕翻转 void user_LCD(void) { switch(mode_lcd) { case 1:LCD_WriteReg(R1,0x0000);LCD_WriteReg(R96,0x2700);break; case 2:LCD_WriteReg(R1,0x0100);LCD_WriteReg(R96,0xA700);break; } HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET); } void user_uart(void) { if(uart_start==1&&TIM7->CNT>=15) { uart_buf[uart_count]='\0'; if(uart_buf[0]=='X'||uart_buf[0]=='Y') { switch(uart_buf[0]) { case 'X':printf("X:%d",X);break; case 'Y':printf("Y:%d",Y);break; } } if(uart_buf[0]=='P'&&uart_buf[1]=='A') { switch(uart_buf[2]) { case '1':printf("PA1:%d",fre);break; case '4':printf("PA4:%.2f",VPA4);break; case '5':printf("PA5:%.2f",VPA5);break; } } if(uart_buf[0]=='#') { if(++mode_lcd>2) mode_lcd=1; } uart_start=0; memset(uart_buf,0,sizeof(uart_buf)); uart_count=0; // HAL_NVIC_DisableIRQ(USART1_IRQn); // memset(uart_buf, 0, sizeof(uart_buf)); // uart_count = 0; // HAL_NVIC_EnableIRQ(USART1_IRQn); } } //重定向 int fputc(int ch,FILE*p) { char c=ch; HAL_UART_Transmit(&huart1,(unsigned char *)&c,1,50); return ch; } //界面1 void DATA(void) { if(adc_start==1) { VPA4=data[0]; VPA5=data[1]; } sprintf(H," DATA "); LCD_DisplayStringLine(Line1,(uint8_t *)H); sprintf(H," PA4=%.2f ",VPA4); LCD_DisplayStringLine(Line3,(uint8_t *)H); sprintf(H," PA5=%.2f ",VPA5); LCD_DisplayStringLine(Line4,(uint8_t *)H); sprintf(H," PA1=%d ",fre); LCD_DisplayStringLine(Line5,(uint8_t *)H); sprintf(H,"uart=%c%c%c%c ",uart_buf[0],uart_buf[1],uart_buf[2],uart_buf[3]); LCD_DisplayStringLine(Line7,(uint8_t *)H); sprintf(H,"%d %d %d ",eeprom_read(1),eeprom_read(0),eeprom_read(10)); LCD_DisplayStringLine(Line8,(uint8_t *)H); } //界面2 void PARA(void) { sprintf(H," PARA "); LCD_DisplayStringLine(Line1,(uint8_t *)H); sprintf(H," X=%d ",X); LCD_DisplayStringLine(Line3,(uint8_t *)H); sprintf(H," Y=%d ",Y); LCD_DisplayStringLine(Line4,(uint8_t *)H); sprintf(H,"%d %d %d ",eeprom_read(1),eeprom_read(0),eeprom_read(10)); LCD_DisplayStringLine(Line8,(uint8_t *)H); } //界面3_1 void REC_PA4(void) { sprintf(H," REC-PA4 "); LCD_DisplayStringLine(Line1,(uint8_t *)H); sprintf(H," N=%d ",Num_PA4); LCD_DisplayStringLine(Line3,(uint8_t *)H); sprintf(H," A=%.2f ",max_PA4); LCD_DisplayStringLine(Line4,(uint8_t *)H); sprintf(H," T=%.2f ",min_PA4); LCD_DisplayStringLine(Line5,(uint8_t *)H); sprintf(H," H=%.2f ",mean_PA4); LCD_DisplayStringLine(Line6,(uint8_t *)H); } //界面3_2 void REC_PA5(void) { sprintf(H," REC-PA5 "); LCD_DisplayStringLine(Line1,(uint8_t *)H); sprintf(H," N=%d ",Num_PA5); LCD_DisplayStringLine(Line3,(uint8_t *)H); sprintf(H," A=%.2f ",max_PA5); LCD_DisplayStringLine(Line4,(uint8_t *)H); sprintf(H," T=%.2f ",min_PA5); LCD_DisplayStringLine(Line5,(uint8_t *)H); sprintf(H," H=%.2f ",mean_PA5); LCD_DisplayStringLine(Line6,(uint8_t *)H); } //按键控制 void KEY(void) { B0_s=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0); B1_s=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1); B2_s=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2); A0_s=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0); if(B0_s==1&&B0_e==0) { if(++mode>3) mode=1; } if(B1_s==1&&B1_e==0) { if(mode==2) { if(++X>4) X=1; eeprom_write(1,X); } } if(B2_s==1&&B2_e==0) { if(mode==2) { if(++Y>4) Y=1; eeprom_write(0,Y); } } if(A0_s==1&&A0_e==0) { if(TIM6->CNT<10000) { if(mode==1) { adc_start=1; } if(mode==2) if(++mode_pwm>2) mode_pwm=1; if(mode==3) if(++mode_rec>2) mode_rec=1; } } if(A0_s==0&&A0_e==0) { if(TIM6->CNT>10000&&mode==3) { TIM6->CNT=10000; // if(mode_rec==1) // { Num_PA4=0;max_PA4=0;min_PA4=0;mean_PA4=0; for(int i=0;i<=Num_PA4;i++) RECPA4[i]=0; // } // else if(mode_rec==2) // { Num_PA5=0;max_PA5=0;min_PA5=0;mean_PA5=0; for(int i=0;i<Num_PA5;i++) RECPA5[i]=0; // } } } else if(A0_s==1&&A0_e==1) { TIM6->CNT=0; } B0_e=B0_s; B1_e=B1_s; B2_e=B2_s; A0_e=A0_s; } //LED控制 void LED(void) { HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET); if(mode_pwm==1) HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET); else HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET); if(mode_pwm==2) HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET); else HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET); if(mode_lcd==1) HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11,GPIO_PIN_RESET); else HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11,GPIO_PIN_SET); if(VPA4>VPA5) { if(uwTick-ledtick>=100) { ledtick=uwTick; HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_10); } } else if(VPA4<=VPA5)HAL_GPIO_WritePin(GPIOC,GPIO_PIN_10,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET); } //PWM处理 void PWM(void) { if(mode_pwm==1) { __HAL_TIM_SET_PRESCALER(&htim3,80000000/100/(fre*X)); __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,50); } else if(mode_pwm==2) { __HAL_TIM_SET_PRESCALER(&htim3,80000000/100/(fre/X)); __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,50); } } void CAMPARE(void) { if(adc_start==1) { double sumPA4=0; double sumPA5=0; RECPA4[++Num_PA4]=VPA4; RECPA5[++Num_PA5]=VPA5; if(Num_PA4==1) { max_PA4=VPA4; min_PA4=VPA4; } if(Num_PA5==1) { max_PA5=VPA5; min_PA5=VPA5; } if(max_PA4<VPA4) max_PA4=VPA4; else if(min_PA4>VPA4) min_PA4=VPA4; if(max_PA5<VPA5) max_PA5=VPA5; else if(min_PA5>VPA5) min_PA5=VPA5; for(int i=1;i<=Num_PA4;i++) { sumPA4+=RECPA4[i]; sumPA5+=RECPA5[i]; } mean_PA4=sumPA4/(Num_PA4); mean_PA5=sumPA5/(Num_PA5); adc_start=0; } } //电压读取 void get_v(ADC_HandleTypeDef *hadc) { for(int i=0;i<2;i++) { HAL_ADC_Start(hadc); uint32_t value = HAL_ADC_GetValue(hadc); data[i]=3.3*value/4096; } } //定时器中断 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { } //输入捕获中断 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if(htim->Instance==TIM2) { campare=HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_2); TIM2->CNT=0; fre=80000000/80/campare; } } //串口回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance==USART1) { TIM7->CNT=0; uart_start=1; uart_buf[uart_count++]=uart_data; HAL_UART_Receive_IT(huart,(unsigned char *)&uart_data,1); } }//这里是user.h 的代码 #ifndef __user_h__ #define __user_h__ #include "stm32g4xx.h" // Device header void user_Init(void); void user_UI(void); void user_LCD(void); void user_uart(void); void DATA(void); void PARA(void); void REC_PA4(void); void REC_PA5(void); void KEY(void); void LED(void); void PWM(void); void RW(void); void CAMPARE(void); void get_v(ADC_HandleTypeDef *hadc); #endif//这里是headerfile.h的代码,放头文件用的 #ifndef __headerfile_h__ #define __headerfile_h__ #include "main.h" #include "gpio.h" #include "adc.h" #include "tim.h" #include "usart.h" #include "stdio.h" #include "stdlib.h" #include "string.h" #include "lcd.h" #include "user.h" #include "i2c_hal.h" #endif在main.c文件中我只写了这些