第15届蓝桥杯嵌入式省赛总结

一、比赛经历总结

       看到题目那一刻,个人觉得很简单。模块很少,只有按键切换、输入捕获频率、LCD显示和LED控制,Cubmax配置也不难。但是在做了一个半小时候,突然遇到很多问题,但都是基础性的,比如LCD显示无法消除之前的数据、数据无法从整数转化成小数等等。我当时想到的方法是用标志位,发现会陷入死循环,导致逻辑非常混乱,就因为这个,我耽误了两个小时。其次,就是我的按键三段代码实现长短按,始终有一点小bug,LED的显示也全是漏洞。再者,就是我的数据处理和显示,数据处理就应该单独放在一个模块里面,LCD显示出现残留可以通过空格来消除。最后,就是使用滴答定时器来做调度需要理清楚函数的先后顺序,以及需要明确滴答定时器具体的作用。考试的时候由于没想到自己会有那么多细节问题,瞬间就慌了,然后逻辑就彻底乱了。这是我第一次线上考蓝桥杯,不完美我也必须接收,因为这都是我平时不注意细节。明年再战,结局一定不会像今天这样。

二、未来计划

1、进一步学习C语言,尤其是指针和结构体。

2、培养规范的编程习惯,进一步训练逻辑思维。

3、心态还需要调整,越挫越勇。

三、十五届蓝桥杯嵌入式省赛代码

#include "main.h"
#include "tim.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "lcd.h"
#include "stdio.h"
#include "string.h"

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
   
   
   //key
   uint8_t key_value;
   uint8_t key_up,key_down;
   uint8_t key_old;
   __IO uint32_t uWTick_key,key_long;

   //lcd
   uint8_t str[30];
   uint8_t page=0;
    __IO uint32_t uWTick_lcd;
	

	
	
	//参数
	uint16_t PD=1000;
	uint16_t PH=5000;
	int16_t  PX=0;
	uint32_t NDA=0,NDB=0,NHA=0,NHB=0;
	float khz_a,ms_a,khz_b,ms_b;
	
	//输入捕获
	uint16_t get_up_a,get_up_b;
	uint16_t frq_a,frq_b;
	uint16_t tm_a,tm_b;
	uint16_t now_frq_a,now_frq_b;
	
	//标志位
	uint8_t CanShu_flag=0;
	uint8_t Shujv_change_flag=0;
	uint16_t maxa,mina,maxb,minb;
	uint8_t danwei_flag_a=0,danwei_flag_b=0,danwei_flag_a2=0,danwei_flag_b2=0;
	
	
	//led
	 __IO uint32_t uWTick_led;
	 
	 //数据处理
	 __IO uint32_t uWTick_shujv_proc;
	 __IO uint32_t uWTick_shujv_check;
	 __IO uint32_t uWTick_shujv_check_pd;
	 __IO uint32_t uWTick_shujv_check_pd_3s;
	  uint16_t frq_a_temp,frq_b_temp,frq_a_temp2,frq_b_temp2;
	  
   
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
 uint8_t key_scan();
 void key_process();
 void lcd_process();
 void led_disp(uint8_t led);
 void led_process();
 void shujv_chuli();
 void shujv_jiancha();
 
/* 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 */

/* 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_TIM2_Init();
  MX_TIM3_Init();
  /* USER CODE BEGIN 2 */
  LCD_Init();
  LCD_Clear(Black);
  LCD_SetTextColor(White);
  LCD_SetBackColor(Black);
  /* USER CODE END 2 */
  


  /* Infinite loop */
  /* USER CODE BEGIN WHILE */

	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_All, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
	
	HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
	HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);
    
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  key_process();
	  shujv_chuli();
	  shujv_jiancha();
      lcd_process(); 
	  led_process();
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV3;
  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();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  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();
  }
}

/* USER CODE BEGIN 4 */
uint8_t key_scan()
{
	uint8_t key;
	if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0)==GPIO_PIN_RESET)  key= 1;
	if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1)==GPIO_PIN_RESET)  key= 2;
	if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2)==GPIO_PIN_RESET)  key= 3;
	if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==GPIO_PIN_RESET)  key= 4;
	
	return key;
}

void key_process()
{
	if(uwTick-uWTick_key<50) return;
	uWTick_key=uwTick;

	
	key_value = key_scan();
	key_down = key_value & (key_old^key_value);
	key_up = ~key_value & (key_old^key_value);
	key_old = key_value;
	
	
  if(key_down)
	{

	 if(uwTick-key_long>1000) 
	{
        key_long =uwTick;
		switch(key_up)
		{
			case 4:
			{
				NDA=0;
				NDB=0;
				NHA=0;
				NHB=0;
			}
		}
	}
	else
	{
		switch(key_up)
		{
			case 1:
			{
				LCD_Clear(Black);
				if(page==1)
				{
					if(CanShu_flag==0)
						PD+=100;
					if(CanShu_flag==1)
						PH+=100;
					if(CanShu_flag==2)
						PX+=100;
				}
			}break;
			case 2:
			{
				LCD_Clear(Black);
				if(page==1)
				{
					if(CanShu_flag==0)
						PD-=100;
					if(CanShu_flag==1)
						PH-=100;
					if(CanShu_flag==2)
						PX-=100;
				}
			}break;
			case 3:
			{
				LCD_Clear(Black);
				if(page==0)
				{
					Shujv_change_flag++;
					if(Shujv_change_flag==2)
					   Shujv_change_flag=0;
					
				}
				if(page==1)
				{
					CanShu_flag++;
					if(CanShu_flag==3)
						CanShu_flag=0;
				}
				
			}break;
			case 4:
			{
				LCD_Clear(Black);
				page++;
				if(page==3)
					page=0;
				
			}break;
		}
	}
    }
}

void lcd_process()
{
	if(uwTick-uWTick_lcd<100) return;
	uWTick_lcd=uwTick;
	
	if(page==0)
	{
		sprintf((char*)str,"        DATA");
        LCD_DisplayStringLine(Line2,str);
		 	
		if(Shujv_change_flag==0)
	   { 
          if(danwei_flag_a==1)
		  {
			  sprintf((char*)str,"     A=%dHz       ",now_frq_a);
	          LCD_DisplayStringLine(Line4,str);
		  }
		  if(danwei_flag_a==2)
		  {
			  
		      sprintf((char*)str,"     A=%.2fKHz    ",khz_a);
	          LCD_DisplayStringLine(Line4,str);	
		  }
          if(danwei_flag_b==1)
		  {
			  sprintf((char*)str,"     B=%dHz       ",now_frq_b);
	          LCD_DisplayStringLine(Line5,str);
		  }
		  if(danwei_flag_b==2)
		  {
			  
		      sprintf((char*)str,"     B=%.2fKHz    ",khz_b);
	          LCD_DisplayStringLine(Line5,str);	
		  }

	   }
	   if(Shujv_change_flag==1)
	   {
          if(danwei_flag_a2==1)
		  {
			  sprintf((char*)str,"     A=%duS       ",tm_a);
	          LCD_DisplayStringLine(Line4,str);
		  }
		  if(danwei_flag_a2==2)
		  {
			  
		      sprintf((char*)str,"     A=%.2fmS    ",ms_a);
	          LCD_DisplayStringLine(Line4,str);	
		  }
          if(danwei_flag_b2==1)
		  {
			  sprintf((char*)str,"     B=%duS       ",tm_b);
	          LCD_DisplayStringLine(Line5,str);
		  }
		  if(danwei_flag_b2==2)
		  {
			  
		      sprintf((char*)str,"     B=%.2fmS    ",ms_b);
	          LCD_DisplayStringLine(Line5,str);	
		  }


	   }
	}
	
	if(page==1)
	{
		sprintf((char*)str,"        PARA");
        LCD_DisplayStringLine(Line2,str);
		sprintf((char*)str,"     PD=%d          ",PD);
        LCD_DisplayStringLine(Line4,str);
		sprintf((char*)str,"     PH=%d          ",PH);
        LCD_DisplayStringLine(Line5,str);
		sprintf((char*)str,"     PX=%d          ",PX);
        LCD_DisplayStringLine(Line6,str);
	}
	if(page==2)
	{
		sprintf((char*)str,"        RECD");
        LCD_DisplayStringLine(Line2,str);
		sprintf((char*)str,"     NDA=%d        ",NDA);
        LCD_DisplayStringLine(Line4,str);
		sprintf((char*)str,"     NDB=%d       ",NDB);
        LCD_DisplayStringLine(Line5,str);
		sprintf((char*)str,"     NHA=%d       ",NHA);
        LCD_DisplayStringLine(Line6,str);
		sprintf((char*)str,"     NHB=%d       ",NHB);
        LCD_DisplayStringLine(Line7,str);
	}

}

void led_disp(uint8_t led)
{
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_All, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
	
    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, led<<8, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}

void led_process()
{
	if(uwTick-uWTick_led<100) return;
	uWTick_led=uwTick;
	uint8_t ledd=0x00;
	if(page==0)
	{
		ledd|=0x01;
		led_disp(ledd);
	}
	else
	{
		ledd&=0xfe;
		led_disp(ledd);
	}
	
	if(now_frq_a>PH)
	{
		ledd|=0x02;
		led_disp(ledd);
	}
	else
	{
		ledd&=0xfd;
		led_disp(ledd);
	}
	
	if(now_frq_b>PH)
	{
		ledd|=0x04;
		led_disp(ledd);
	}
	else
	{
		ledd&=0xfb;
		led_disp(ledd);
	}
	
	if(NDA>=3||NDB>=3)
	{
		ledd|=0x80;
		led_disp(ledd);
	}
	else
	{
		ledd&=0x7f;
		led_disp(ledd);
	}
}

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM2)
	{
		if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)
		{
			get_up_a=HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
			__HAL_TIM_SetCounter(htim,0);

		}
	}
	if(htim->Instance==TIM3)
	{
		if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)
		{
			get_up_b=HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
			__HAL_TIM_SetCounter(htim,0);
			
		}
	}
	
}

void shujv_chuli()
{
	if(uwTick-uWTick_shujv_proc<200) return;
	uWTick_shujv_proc=uwTick;
	
    frq_a =(80000000/80)/get_up_a+1;
	
	frq_b =(80000000/80)/get_up_b+1;
	
	
    now_frq_a=frq_a+PX;
	now_frq_b=frq_b+PX;
	tm_a=1*1000000/now_frq_a;
	tm_b=1*1000000/now_frq_b;
	
	if(frq_a<1000) 
	{
        danwei_flag_a=1;
	}
	
	if(frq_a>1000&&frq_a<30000)
	{
		khz_a= (float)now_frq_a/1000;
	    danwei_flag_a=2;  
	}
	if(frq_b<1000) 
	{
		danwei_flag_b=1;
	}
	if(frq_b>1000&&frq_b<30000)
	{
		khz_b= (float)now_frq_b/1000;
	    danwei_flag_b=2;  
	}
	
	
	if(tm_a<1000) 
	{
        danwei_flag_a2=1;
	}
	
	if(tm_a>1000&&tm_a<30000)
	{
		ms_a= (float)tm_a/1000;
	    danwei_flag_a2=2;  
	}
	if(tm_b<1000) 
	{
        danwei_flag_b2=1;
	}
	
	if(tm_b>1000&&tm_b<30000)
	{
		ms_b= (float)tm_b/1000;
	    danwei_flag_b2=2;  
	}
}

void shujv_jiancha()
{
	
   if(uwTick-uWTick_shujv_check_pd_3s<3000) 
   {
	 if(uwTick-uWTick_shujv_check>50) 
	 {
		uWTick_shujv_check=uwTick;
		
		frq_a_temp=now_frq_a;
		frq_b_temp=now_frq_b;
	 }
	 else
	 {
		if(now_frq_a>PH&&frq_a_temp<PH)
		{
			NHA++;
		}
		if(now_frq_b>PH&&frq_b_temp<PH)
		{
			NHB++;
		}
		
		if(now_frq_a>frq_a_temp)
		{
			maxa=now_frq_a;
			mina=frq_a_temp;
		}
		else
		{
			maxa=frq_a_temp;
			mina=now_frq_a;
		}
		if(maxa-mina>PD)
		{
			NDA++;
		}
		
		if(now_frq_b>frq_b_temp)
		{
			maxb=now_frq_b;
			minb=frq_b_temp;
		}
		else
		{
			maxb=frq_b_temp;
			minb=now_frq_b;
		}
		if(maxb-minb>PD)
		{
			NDB++;
		}
		
		
	 }
	    
   }
	else
	{
		uWTick_shujv_check_pd_3s=uwTick;
	}
	
	
}

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值