【蓝桥杯嵌入式】蓝桥杯嵌入式2023年第十四届省赛真题解答

news2024/12/22 22:45:00

 

目录

0 题目介绍

1 题目分析

2 Cubemx配置

4 代码

5 效果显示


 

0 题目介绍

具体要求如下图

775a27b2985b4fdbabccfd01b2bd04a6.png

 93c99c4eab41493f8d9364108cd38e5f.png

 5c8d99aa31344d39b2497c25bf1ecd59.png5a99c3226b9a41299bf0679445491a79.png

 b0b57759057c47e7b08669e14136a5ca.png

1 题目分析

拿到题目咋一看,就是基本操作,实际做起来一堆定时器操作,很容易把人绕晕。

首先看看需要用到的外设

1. GPIO(key/led)

2.LCD

3.输入捕获(TIM3通道2)和PWM(TIM2通道2)

4.ADC(R37)

这里首先得有个概念,碰到定时之类的,应该想到标志位+计数器的组合,用标志位触发定时器计数,把开始的过程和最终执行的过程分离开来,减少代码耦合。

2 Cubemx配置

配置完成如下:

2efd736556fd4bf6a2d24099df8befaf.png

 

时钟树配置如下(确保SYSCLK=80M)

8cb74e0d758549cba6ed45c97db6d933.png

GPIO配置过(LED设置INPUT初始状态高,PD12使能位INPUT,KEY设置位OUTPUT) 

ADC配置如下

6520b0c7ff9847cc9de3bbcd35163ca4.png

 73becc45b7144549ade436510c53b7c6.png

定时器2  TIM2通道二(PWM输出配置PA1)这里80M预分频79后为1M,初始阶段频率1M/(999+1)=1Khz(题目要求4000,后面代码里具体设置)

87881957a43d47439f0985a6c804c92c.png

 94182d4fe1ce42ce86f4bdd7c8ff4bcf.png

 定时器3 TIM3通道二(输入捕获输出配置PA7)

这里简单介绍一下:触发源选TI2FP2(因为PA7是TIM3_CH2),选这个后PA7就会变绿,时钟选内部时钟(80M),通道二(Channel)作为主通道(PA7对的是通道二),通道一作为从通道。

主通道(通道2)检测上升沿,从通道(通道1)检测下降沿(计算频率只需要计算上升沿的捕获值,计算占空比根据上升沿和下降沿的比例关系计算)。

预分频还是79(+1)后到1M。

9a1bf77ea4004a0eabb3c49826b233c9.png

 ebed3370306b4be0836b2127eaeaa586.png

 tim2中断打开(整个题目唯一用到的中断)935e6d229aa1458e960f6eaac8289cd3.png

 生成文件

478e290bfb51429787b823328f61fe54.png

 b76be019249e4011828ba18d2f4c5414.png

 移植lcd相关文件头文件,创建一个user.c和user.h(个人习惯)放一些功能代码,主要代码全写在main.c文件中(如果缺少.s文件,请自行添加)299db79e8e2147a5bc2c042e2a0c92cb.png

 编译保证不报错。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGnmn5DlvIDov4flhYnvvIg15Z2X77yJ,size_12,color_FFFFFF,t_70,g_se,x_16

4 代码

自己需要写的文件只有两个

1. user.c和user.h

2.main.c

user文件如下,这个没啥好说的

user.h:

#include "main.h"

void Led_Disp(unsigned char c);
unsigned char Key_Scan(void);

uint16_t getADC2(void);

user.c:

#include "user.h"
#include "adc.h"

//灯
void Led_Disp(unsigned char c)
{
	//全部熄灭
	  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
                          |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12, 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, c<<8, GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
	  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}

//按键扫描
unsigned char Key_Scan(void)
{
	unsigned char c;
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET)
	{
		c = 1;
	}
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==GPIO_PIN_RESET)
	{
		c = 2;
	}
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==GPIO_PIN_RESET)
	{
		c = 3;
	}
	else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)
	{
		c = 4;
	}
	
	return c;
}

//adc
uint16_t getADC2(void)
{
	uint16_t adc = 0;
	
	HAL_ADC_Start(&hadc2);
	adc = HAL_ADC_GetValue(&hadc2);
	
	return adc;
}

主函数这里使用了一个100ms执行一次的计数器和50ms执行一次的计数器,100ms主要控制那个灯闪烁的需求,其他定时都放在50ms函数中。

可以根据测试数据来观察定时器的作用

497a4d13eb2a4eaf8a79256cf6df1952.png

 timer_b2是按键2相关的计时器, timer_b4是按键4相关的计时器,timer_MH是题目那个保持2s需求的计时器

flag是对应的标志位,具体功能见注释

屏幕第九行是adc电压值和cap采集的频率

main.c


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



#include "lcd.h"
#include "user.h"
#include <stdio.h>

void keyPro(void);
void lcdPro(void);
void ledPro(void);
void ADCPro(void);
void timer_100(void);
void timer_50(void);


//tim2   pwm
//tim3   cap

__IO uint32_t uwtick_Key,uwtick_Lcd,uwtick_Led,uwtick_ADC,uwtick_timer_200,uwtick_timer_100,uwtick_timer_50;

//key
unsigned char Key_Value,Key_Old,Key_Up,Key_Dowm;
unsigned char page = 1;


//lcd
unsigned char str[25];
unsigned char test;

//*pwm相关变量

unsigned char PWM_Mode = 0;
unsigned char PWM_p = 0;
float V = 10;  //V值
float V_old = 10;  //上一次的V值,用于判断V是否稳定

uint16_t CAP1_UP_Count;  //上升沿捕获值
uint16_t CAP1_DOWM_Count;  //下降沿捕获值
float CAP1_Duty;  //捕获占空比

int32_t PWM1_Duty = 10;  //PWM输出占空比控制
int32_t PWM1_F = 249;   //PWM输出频率控制


unsigned char R = 1;  //R
unsigned char K = 1;  //K
unsigned char N = 0;  //N
float MH = 10;  //低频最大值
float ML = 10;  //高频最大值

unsigned char select_R_K = 0;  //选择R K
unsigned char lock_b4 = 0;  //ADC上锁
float adc_value = 0;  //ADC值


//timer 
int timer_b2 = 0;
int timer_b4 = 0;
int timer_MH = 0; 
int timer_ML = 0; 
//标志位
unsigned flag_b2 = 0;  //1代表正在运行中
int flag_b4 = 0;  //0 没有按下  1上升沿 2下降沿
int flag_MHL = 0; //0没超过  1低超过 2高超过



void SystemClock_Config(void);

int main(void)
{

  HAL_Init();

  SystemClock_Config();

	LCD_Init();

  MX_GPIO_Init();
  MX_ADC2_Init();
  MX_TIM2_Init();
  MX_TIM3_Init();

		
	//cap
	HAL_TIM_Base_Start(&htim3);
	HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
	HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);

	//pwm
	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);

	__HAL_TIM_SET_AUTORELOAD(&htim2,124);   //4k=249   8k=124
	//__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,124/10);  

	LCD_Clear(Black);
	LCD_SetBackColor(Black); 
	LCD_SetTextColor(White);

  while (1)
  {
		 ADCPro();
		 lcdPro();
		 keyPro();
		 ledPro();

		 timer_100();//灯闪烁时用
		 timer_50();
  }

}

void lcdPro(void)
{
	if(uwTick - uwtick_Lcd<100) return;
	uwtick_Lcd = uwTick;
	
	if(page == 1)  //数据界面
	{
		sprintf((char *)str,"        DATA  ");			
		LCD_DisplayStringLine(Line1,str);	
		if(PWM_Mode == 0)
		{
			sprintf((char *)str,"     M=L ");	
		}
		else
		{
			sprintf((char *)str,"     M=H ");	
		}	
		
		PWM_p = PWM1_Duty;
		LCD_DisplayStringLine(Line3,str);	
		sprintf((char *)str,"     P=%02d%%     ",PWM_p);			
		LCD_DisplayStringLine(Line4,str);	
		
		
		sprintf((char *)str,"     V=%3.1f     ",V);			
		LCD_DisplayStringLine(Line5,str);	
		

	}
	else if(page == 2)  //参数界面
	{
		sprintf((char *)str,"        PARA  ");		
		LCD_DisplayStringLine(Line1,str);		
		
		if(select_R_K == 0)
		{
			LCD_SetTextColor(Green);
		}
		sprintf((char *)str,"     R=%d   ",R);			
		LCD_DisplayStringLine(Line3,str);		
		LCD_SetTextColor(White);  //恢复
		
		if(select_R_K == 1)
		{
			LCD_SetTextColor(Green);
		}
		sprintf((char *)str,"     K=%d   ",K);	
		LCD_DisplayStringLine(Line4,str);		
		LCD_SetTextColor(White);  //恢复
		
	}
	else if (page == 3)  //统计界面
	{
		sprintf((char *)str,"        RECD  ");			
		LCD_DisplayStringLine(Line1,str);		
		sprintf((char *)str,"     N=%d  ",N);			
		LCD_DisplayStringLine(Line3,str);		
		sprintf((char *)str,"     MH=%4.1f  ",MH);			
		LCD_DisplayStringLine(Line4,str);		
		sprintf((char *)str,"     ML=%4.1f  ",ML);			
		LCD_DisplayStringLine(Line5,str);				
	}
	

	//测试用  提交时屏蔽
	sprintf((char *)str,"t1:%dt2:%dt3:%dt4:%d    ",timer_b2,timer_b4,timer_ML,timer_MH);			
	LCD_DisplayStringLine(Line7,str);
	
	sprintf((char *)str,"b2:%d b4:%d MHL:%d   ",flag_b2,flag_b4,flag_MHL);			
	LCD_DisplayStringLine(Line8,str);
			//adc
	sprintf((char *)str, "R37:%4.2fV PWM:%d ",adc_value,1000000/CAP1_UP_Count);
	LCD_DisplayStringLine(Line9, str);		
}


void keyPro(void)
{
	if(uwTick - uwtick_Key<50) return;
	uwtick_Key = uwTick;
	
	Key_Value = Key_Scan();
	Key_Dowm = Key_Value&(Key_Value^Key_Old);
	Key_Up = ~Key_Value&(Key_Value^Key_Old);
	
	if(Key_Value==4&&Key_Old==4&&page==1)
	{
		flag_b4 = 1;
	}
	else if(Key_Value!=4&&Key_Old==4&&page==1)
	{
		flag_b4 = 2;
	}
	else
	{
		flag_b4 = 0;
	}
	Key_Old = Key_Value;
	
	if(Key_Dowm == 1)
	{
		LCD_Clear(Black);
		if(page == 1)
		{
			page = 2;
		}
		else if(page == 2)
		{
			page = 3;
		}
		else
		{
			page = 1;
		}
	}
	else if(Key_Dowm == 2)
	{
		if(page == 1)  //数据界面
		{
				if(flag_b2 == 0)
				{
					flag_b2 =1;
				}
		}
		if(page == 2)	//参数界面
		{
			if(select_R_K == 0)
			{
				select_R_K = 1;
			}
			else
			{
				select_R_K = 0;
			}
		}
	}
	else if(Key_Dowm == 3)
	{
		if(page == 2)
		{
			if(select_R_K == 0) //R++
			{
				R++;
				if(R>10)
				{
					R=1;
				}
			}
			else  //K++
			{
				K++;
				if(K>10)
				{
					K=1;
				}		
			}
		}
	}
	else if(Key_Dowm == 4)
	{
		if(page == 2)
		{
			if(select_R_K == 0) //R--
			{
				R--;
				if(R==0)
				{
					R=10;
				}
			}
			else  //K--
			{
				K--;
				if(K==0)
				{
					K=10;
				}		
			}
		}		
	}
}

//定时相关处理 50ms/次
void timer_50(void)
{
	if(uwTick - uwtick_timer_50<50) return;
	uwtick_timer_50 = uwTick;
	
	//时间累加
	if(flag_b4==1)
	{
		timer_b4+=50;
	}
	if(flag_b2 == 1)
	{
		timer_b2+=50;
		
		if(PWM_Mode ==1)//4000-8000对应249-124  125/5次 
		{
			PWM1_F += 2;   
			if(PWM1_F>249)
			{
				PWM1_F = 249;
			}
		}
		else
		{
			PWM1_F -= 2; 
			if(PWM1_F<124)
			{
				PWM1_F=124;
			}
		}
	}
	if(flag_MHL == 1)
	{
		timer_ML+=50;
	}
	else if(flag_MHL == 2)
	{
		timer_MH+=50;
	}
	else
	{
		timer_ML = 0;
		timer_MH = 0;
	}
	
	//判断执行
	
	//b4长短按2s
	if(flag_b4==2)
	{
		if(page==1&&timer_b4>2000)//长按
		{
			if(lock_b4 == 0)
			{
				lock_b4 = 1;						
			}
		}
		else  //短按
		{
			if(page==1&&lock_b4 == 1)
			{
				lock_b4 = 0;
			}
		}
	}
	else if(flag_b4==0)
	{
		timer_b4 = 0;
	}
	
	//b2记时5s PWM高低模式切换	
	if(flag_b2 == 1&&timer_b2>5000)
	{
		flag_b2 = 0;
		timer_b2 = 0;
		N++;
		if(PWM_Mode == 0)
		{
			PWM_Mode = 1;					
		}
		else
		{
			PWM_Mode = 0;
		}
	}
	//MH2s
	if(timer_MH>2000)//低频最大值
	{
		MH = V;
		flag_MHL = 0;
	}
	else if(timer_ML>2000)
	{
		ML = V;
		flag_MHL = 0;
	}
}


unsigned char lednum;  

void ledPro(void)
{
	if(uwTick - uwtick_Led<100) return;
	uwtick_Led = uwTick;
	
	if(page == 1)
	{
		lednum|=0x1;
	}
	else
	{
		lednum&=0xfe;
	}
	if(lock_b4 == 1)
	{
		lednum|=0x04;
	}
	else
	{
		lednum&=0xfb;
	}
		Led_Disp(lednum);
}

unsigned char led2flag;  //闪烁标志

void timer_100(void)
{
		if(uwTick - uwtick_timer_100<100) return;
		uwtick_timer_100 = uwTick;
	
		if(timer_b2>0) //闪烁
		{
			if(led2flag ==0)
			{
				led2flag = 1;
			lednum |=0x2;
			}
			else if(led2flag == 1)
			{
				led2flag = 0;
				lednum &=0xfd;
			}
		}	
		else
		{
			lednum &=0xfd;
		}	
}

void ADCPro(void)
{
	if(uwTick - uwtick_ADC<150) return;
	uwtick_ADC = uwTick;
	
	adc_value = getADC2()*3.3/4096;
	
	//ad转换成占空比
	if(lock_b4 ==0)
	{
		if(adc_value<1.0)
		{
			PWM1_Duty = 10;
		}
		else if(adc_value>3.0)
		{
			PWM1_Duty = 85;
		}
		else
		{
			PWM1_Duty = 10+ (adc_value-1)*75/2;
		}
  }
	
	V = (1000000/CAP1_UP_Count)*2*3.14*R/100/K;
	//需要判断V值是否保持
	if(V==V_old&&PWM_Mode==0&&V>ML)  //低频下
	{
		flag_MHL = 1;
	}
	else if(V==V_old&&PWM_Mode==1&&V>MH) //高频下
	{
		flag_MHL = 2;
	}
	else
	{
		flag_MHL = 0;
	}
	V_old = V;
		//频率
		__HAL_TIM_SET_AUTORELOAD(&htim2,PWM1_F);   //4k
		//占空比
		__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,PWM1_F*PWM1_Duty/100);  
	
}

//中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
			if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
			{
				CAP1_UP_Count =  HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2)+1;
				CAP1_Duty = (float)CAP1_DOWM_Count/CAP1_UP_Count;
			}
				else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
			{
				CAP1_DOWM_Count =  HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1)+1;
			}		
}



void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {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();
  }
  /** Initializes the peripherals clocks
  */
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC12;
  PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

5 效果显示

抖音同名

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/425786.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud:ElasticSearch之RestClient查询文档

文档的查询同样适用RestHighLevelClient对象&#xff0c;基本步骤包括&#xff1a; 1&#xff09;准备Request对象2&#xff09;准备请求参数3&#xff09;发起请求4&#xff09;解析响应 1.快速入门 我们以match_all查询为例 1.1.发起查询请求 代码解读&#xff1a; 第一步…

Downie4如何使用?Downie4最常用的几种下载方法

Downie 4是一款流行的 Mac 视频下载工具&#xff0c;可让您从各种网站下载视频&#xff0c;包括 YouTube、Vimeo、Twitter 等。但是Downie有多少种下载视频的方法你知道吗&#xff1f;接下来为大家带来最常用的几种下载方法&#xff0c;欢迎大家点赞收藏&#xff01; 拖链接下载…

〖Python网络爬虫实战①〗- HTTP原理

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付费…

道路病害识别领域创新产品RADSDS系统让道路检测更高效更实用

自从我国公路总里程数居世界第一&#xff0c;道路养护成为交通运维工作的重要环节。公路养护维修工作的开展&#xff0c;离不开对公路客观状况的检测。以往&#xff0c;我国依靠人工步行完成这项工作&#xff0c;不但干扰公路上车辆的正常通行&#xff0c;对检测人员安全不利&a…

【Linux】来写一个udp的服务端+客户端

来写一个udp的代码 1.socket编程接口 // 创建 socket 文件描述符 (TCP/UDP, 客户端 服务器) int socket(int domain, int type, int protocol); // 绑定端口号 (TCP/UDP, 服务器) int bind(int socket, const struct sockaddr *address,socklen_t address_len); // 开始…

个人邮箱与企业邮箱的区别有哪些?如何选择?

很多用户不了解企业邮箱&#xff0c;认为使用个人邮箱完全可以满足需求&#xff0c;其实这都是错误的观点&#xff0c;企业邮箱不同于个人邮箱&#xff0c;企业邮箱更适于商务应用的邮箱。今天就简单的做个对比。 个人邮箱与企业邮箱的区别&#xff1a; 1、企业形象 企业邮箱&…

STC单片机DS1307+ssd1306 oled时钟显示

STC单片机DS1307+ssd1306 oled时钟显示 📌相关篇《STC单片机DS1302+ssd1306 oled时钟显示》📍《STC单片机对DS1307读写操作》✨效果演示: 🌿实验对象:STC12C5A60S2🌿屏幕型号:I2C ssd1306 0.96“ oled🌿晶振频率:11.059MHz🌿串口波特率:9600📜串口打印读取信…

rk3568 点亮HDMI

rk3568 Android11/12 适配HDMI HDMI&#xff08;High-Definition Multimedia Interface&#xff09;是一种数字化音视频接口标准&#xff0c;用于连接高清电视、电脑、游戏机、蓝光播放器等设备。它是由HDMI联盟&#xff08;HDMI Licensing, LLC&#xff09;制定的&#xff0c…

奥威BI数据可视化大屏分享|多场景、多风格

数据可视化大屏一般应用在品牌推广展示、商务交流、数据分析决策、数据监控等场景&#xff0c;由此催生出各种不同风格的BI数据可视化大屏设计。下面就从奥威BI软件的BI报表模板中截取几个有着不同风格&#xff0c;起着不同作用的BI数据可视化大屏报表&#xff0c;一起来了解一…

【Transformer系列(3)】 《Attention Is All You Need》论文超详细解读(翻译+精读)

前言 哒哒~时隔好久终于继续出论文带读了&#xff0c;这次回归当然要出一手王炸呀——没错&#xff0c;今天我们要一起学习的就是传说中的Transformer&#xff01;在2021年Transformer一经论文《Attention is All You Need》提出&#xff0c;就如龙卷风一般震惊学术界&#xf…

关于ROS机器人-文心一言和CatGPT怎么看-

交流截图&#xff1a; 文字版本如下&#xff08;W-文心&#xff1b;C-猿如意&#xff09;&#xff1a; 如何通过蓝桥云课学习ROS机器人&#xff1f; W&#xff1a; 如果你想通过蓝桥云课学习ROS机器人&#xff0c;可以按照以下步骤进行&#xff1a; 确认ROS机器人的版本和教…

【记录】笔记本新加SSD,重装系统win10,再装双系统ubuntu18.04

记录一下&#xff0c;希望下次装系统可以来的晚一点一、前言二、换SSD三、装Windows1.安装系统2.删除多余系统3.遇到问题&#xff1a;无法关机4.改注册表&#xff0c;开不开机&#xff0c;黑屏有鼠标三、装ubuntu1.安装完&#xff0c;设置root2.更新源3.时间设置4.win和ubuntu共…

大语言模型及其应用

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 机器学习 机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09;是指从数据中自动学习规律和模式&#xff0c;并利用这些规律和模式&#xff0c;在新的数据中完成…

nssctf web 入门(6)

这里通过nssctf的题单web安全入门来写&#xff0c;会按照题单详细解释每题。题单在NSSCTF中。 想入门ctfweb的可以看这个系列&#xff0c;之后会一直出这个题单的解析&#xff0c;题目一共有28题&#xff0c;打算写10篇。 目录 [SWPUCTF 2021 新生赛]caidao [SWPUCTF 2021 新…

力扣题库刷题笔记64-最小路径和

1、题目如下&#xff1a; 2、个人Python代码实现&#xff1a; 以上代码主要是照抄题解&#xff0c;根据调试bug了解每一步的逻辑&#xff0c;然后注释利于读懂本题&#xff0c;写本篇文章的目的在于初步了解动态规划。 本题的逻辑主要如下&#xff1a; a、列表中每个数字代表当…

【Redis笔记03】Redis运行环境之Cluster集群模式

这篇文章&#xff0c;主要介绍Redis运行环境之Cluster集群模式。 目录 一、Cluster集群模式 1.1、集群模式原理 &#xff08;1&#xff09;普通集群 &#xff08;2&#xff09;什么是分片&#xff1f;&#xff1f;&#xff1f; &#xff08;3&#xff09;如何分片存储&…

基于springboot的音乐网站的设计与实现(带论文)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

【OCR】CTC loss原理

1 CTC loss出现的背景 在图像文本识别、语言识别的应用中&#xff0c;所面临的一个问题是神经网络输出与ground truth的长度不一致&#xff0c;这样一来&#xff0c;loss就会很难计算&#xff0c;举个例子来讲&#xff0c;如果网络的输出是”-sst-aa-tt-e’, 而其ground truth…

JVM:并发的可达性分析

当前主流编程语言的垃圾收集器基本上都是依靠可达性分析算法来判定对象是否存活的&#xff0c;可达性分析算法理论上要求全过程都基于一个能保障一致性的快照中才能够进行分析&#xff0c;这意味着必须全程冻结用户线程的运行。 在根节点枚举这个步骤中&#xff0c;由于 GC Ro…

0303Kruskal算法和小结-最小生成树-图-数据结构和算法(Java)

1 算法概述 定义。按照边的权重顺序&#xff08;从小到大&#xff09;&#xff0c;将边加入最小生成树中。加入的边不会与已经加入的边构成环&#xff0c;知道树中含有V-1条边为主。这些黑色的边逐渐由一片森林合并为一棵树&#xff0c;也就是最小生成树。这种计算方法被称为Kr…