当前位置: 首页 > news >正文

【蓝桥杯嵌入式】第十三届省赛(第二场)

目录

0 前言

1 展示

1.1 源码

1.2 演示视频

1.3 题目展示

2 CubeMX配置(第十三届省赛第二场真题)

2.1 设置下载线

2.2 HSE时钟设置

2.3 时钟树配置

2.4 生成代码设置

2.5 USART1

2.5.1 基本配置

2.5.2 NVIC

2.5.3 DMA 

2.6 TIM

2.6.1 TIM2

2.6.2 TIM4

2.6.3 TIM6

3 引脚配置

4 代码相关定义、声明

4.1 变量声明

4.2 函数声明

5 主要函数

5.1 LCD

5.2 KEY

5.3 EEPROM

5.4 LED

5.5 PWM

5.6 定时器回调函数

5.7 串口回调函数

 5.8 串口

5.9 上电初始化

6 测试

7 做题感受


菜狗上线~~~


0 前言

  • 开发板:CT117E-M4(STM32G431RBT6)
  • 软件环境:CubeMX + Keil5
  • 涉及题目:第十三届蓝桥杯嵌入式省赛第二场真题

1 展示

1.1 源码

Gitee链接:

1.2 演示视频

B站链接:

1.3 题目展示


2 CubeMX配置(第十三届省赛第二场真题)

2.1 设置下载线

2.2 HSE时钟设置

2.3 时钟树配置

晶振一定要改成24M,晶振一定要改成24M,晶振一定要改成24M,主频80M

2.4 生成代码设置

2.5 USART1

2.5.1 基本配置

题目要求串口1波特率9600

2.5.2 NVIC

串口一定要使能NVIC

2.5.3 DMA 

添加两个DMA即可

2.6 TIM

2.6.1 TIM2

TIM2用作PWM输出功能,通过引脚PA1输出

配置成2KHz的PWM

定时器2也要使能NVIC

2.6.2 TIM4

TIM4做基准定时器,10ms定时,专门用来按键扫描

预分频系数80-1

重装载值10000-1

定时器4也要使能NVIC

2.6.3 TIM6

定时器65用来实现倒计时5S,不开定时器6也可以用定时器4实现,这里我不想让倒计时和按键有联系,就多开了一个定时器,配置如下

定时器6也要使能NVIC


3 引脚配置

  • 配置8个LED         PD2  outpp    PC8~PC15   outpp
  • 配置4个按键         PA0、PB0、PB1、PB2    配置为上拉输入模式
  • 配置串口1            PA9  PA10
  • PWM                   PA1(TIM2-CH2)


4 代码相关定义、声明

4.1 变量声明

主要的变量定义如下所示,用了两个结构体,一个是写参数的,一个是写标志位的

/* 定义结构体 */
struct Param_TypeDef
{u32 LED_Tick; // LED定时 函数减速u32 LCD_Tick; // LCD定时 函数减速u32 RX_Tick;  // RX 定时 函数减速u32 PWM_Tick; // PWM定时 函数减速u32 EEP_Tick; // EEPROM 定时u8 LED_State; // LED状态变量u16 Set_PA1_Freq; //u8 Set_PA1_Duty;u8 Shop_Num_X; // 购买数量Xu8 Shop_Num_Y; // 购买数量Yfloat Price_X; // 单价Xfloat Price_Y; // 单价Yu8 REP_X;	   // 库存Xu8 REP_Y;	   // 库存Yfloat All_Price; // 总价u8 last_rep_X; // 上次的Xu8 last_rep_Y; // 上次的Yfloat Last_Price_X; // 单价Xfloat Last_Price_Y; // 单价Y
};struct Flag_TypeDef
{bool LCD_Dir;u8 LCD_View;		 // LCD界面u8 Current_Platform; // 当前平台bool Key4_Press;	 // KEY4按下bool led2_state;
};extern struct Param_TypeDef param;
extern struct Flag_TypeDef flag;/* 定义结构体 */// 定义状态机状态
#define SHOP 0
#define PRICE 1
#define REP 2

4.2 函数声明

/* 函数声明 */
void LED_proc(void);
void LCD_Disp_proc(void);
void Key_proc_Loop(void);
void Power_Init(void); // 上电初始化
void RX_Proc(void); // 串口接收函数
void PWM_Set_Proc(void);
void EEPROM_Proc(void);

5 主要函数

5.1 LCD

LCD一共有三个界面,分别是购买界面、单价界面、库存界面,分别题目要求到的标题和内容~

这里的MYLCD_printf()函数是我自己封装的

// LCD显示
void LCD_Disp_proc(void)
{// 函数减速if (uwTick - param.LCD_Tick < 50)return;param.LCD_Tick = uwTick;// 执行任务if (flag.LCD_View == SHOP){ // 购买界面MYLCD_printf(Line1, "        SHOP         ");MYLCD_printf(Line3, "     X:%2d           ", param.Shop_Num_X);MYLCD_printf(Line4, "     Y:%2d           ", param.Shop_Num_Y);}else if (flag.LCD_View == PRICE){ // 单价界面MYLCD_printf(Line1, "        PRICE        ");MYLCD_printf(Line3, "     X:%.1f           ", param.Price_X);MYLCD_printf(Line4, "     Y:%.1f           ", param.Price_Y);}else if (flag.LCD_View == REP){ // 库存界面MYLCD_printf(Line1, "        REP          ");MYLCD_printf(Line3, "     X:%2d           ", param.REP_X);MYLCD_printf(Line4, "     Y:%2d           ", param.REP_Y);}
}

正常的LCD显示语句,每次都要使用之前清零,再用sprint函数拼接字符串再调用LCD的显示函数,为了显示的更加简洁我用可变参数列表封装了这三行代码~代码如下

// // 使用之前先清除显示数组,再填写内容
// memset(LCD_Show_text, '\0', sizeof(LCD_Show_text));
// sprintf(LCD_Show_text, "    LED:OFF     ");
// LCD_DisplayStringLine(Line5, (uint8_t *)LCD_Show_text);
void MYLCD_printf(unsigned char linex, char *format, ...)
{char LCD_Show_text[30];memset(LCD_Show_text, '\0', sizeof(LCD_Show_text));va_list arg;                          // 定义可变参数列表数据类型的变量argva_start(arg, format);                // 从format开始,接收参数列表到arg变量vsprintf(LCD_Show_text, format, arg); // 使用vsprintf打印格式化字符串和参数列表到字符数组中LCD_DisplayStringLine(linex, (uint8_t *)LCD_Show_text);va_end(arg); // 结束变量arg//	sprintf((char *)LCD_Show_text, str);
}

思路如下: 

  1. //先清除数组的内容
  2. // 定义可变参数列表数据类型的变量arg
  3. // 从format开始,接收参数列表到arg变量
  4. // 使用vsprintf打印格式化字符串和参数列表到字符数组中
  5. //LCD显示
  6. // 结束变量arg

5.2 KEY

按键处理函数,使用01Stdio的按键扫描函数,放在定时器4里10ms扫描一次

按键1是切换界面

按键2是购买数量,注意越界回滚

按键3是购买单价,注意越界回滚,这个但是是浮点数,这里就有说到了,浮点数的2.0f其实不准确,如果判断当前价格>2.0了就参数回滚,会出现1.9直接跳变到2.0,所以我们把比较的数值改成2.01f就完美解决了~~~

按键4 计算总计,串口上传数据,发送完成,单价清零

void Key_proc_Loop(void)
{if (bkey[1].short_flag == 1){flag.LCD_View++;if (flag.LCD_View >= 3)flag.LCD_View = 0; // 三个界面bkey[1].short_flag = 0;}if (bkey[2].short_flag == 1){if (flag.LCD_View == SHOP){ // 购买界面param.Shop_Num_X++;if (param.Shop_Num_X > param.REP_X) // 超过库存,越界回滚成0param.Shop_Num_X = 0;}else if (flag.LCD_View == PRICE){ // 单价界面param.Price_X += 0.1f;if (param.Price_X > 2.01f) // 注意浮点数param.Price_X = 1.0f;  // 越界回滚}else if (flag.LCD_View == REP){ // 库存界面param.REP_X++;}bkey[2].short_flag = 0;}if (bkey[3].short_flag == 1) //{if (flag.LCD_View == SHOP){ // 购买界面param.Shop_Num_Y++;if (param.Shop_Num_Y > param.REP_Y) // 超过库存,越界回滚成0param.Shop_Num_Y = 0;}else if (flag.LCD_View == PRICE){ // 单价界面param.Price_Y += 0.1f;if (param.Price_Y > 2.01f) // 注意浮点数param.Price_Y = 1.0f;  // 越界回滚}else if (flag.LCD_View == REP){ // 库存界面param.REP_Y++;}bkey[3].short_flag = 0;}if (bkey[4].short_flag == 1) //{if (flag.LCD_View == SHOP){ // 购买界面flag.Key4_Press = 1;param.REP_X -= param.Shop_Num_X;param.REP_Y -= param.Shop_Num_Y;param.All_Price = param.Shop_Num_X * param.Price_X + param.Shop_Num_Y * param.Price_Y;memset(USART_tx_string, '\0', sizeof(USART_tx_string)); // 变量清零sprintf(USART_tx_string, "X:%d,Y:%d,Z:%.1f", param.Shop_Num_X, param.Shop_Num_Y, param.All_Price);HAL_UART_Transmit_DMA(&huart1, (uint8_t *)USART_tx_string, strlen(USART_tx_string));// 发送完成,单价清零param.Shop_Num_X = 0;param.Shop_Num_Y = 0;}bkey[4].short_flag = 0;}
}

5.3 EEPROM

这个函数100ms调用一次,在函数里判断当前值和100ms以前的值是否相等,如果不相等,就说明数据变化了,就需要存储到EEPROM中,存到对应的地址里

要存储的单价是一位浮点数,乘以10变成整数存进去,读取的时候不要忘记除以10即可

这里的逻辑是先判断,后赋值,如果先赋值后判断,永远检测不出来数据跳变,这里要细细品味一下,有之前写的按键扫描的味道~

void EEPROM_Proc(void)
{if (uwTick - param.EEP_Tick < 100)return;param.EEP_Tick = uwTick;if (param.last_rep_X != param.REP_X){EEPROM_WriteByte(0, param.REP_X); // 剩余数量XHAL_Delay(10);}if (param.last_rep_Y != param.REP_Y){EEPROM_WriteByte(1, param.REP_Y); // 剩余数量YHAL_Delay(10);}if (param.Last_Price_X != param.Price_X){EEPROM_WriteByte(2, (param.Price_X * 10)); // 单价XHAL_Delay(10);}if (param.Last_Price_Y != param.Price_Y){EEPROM_WriteByte(3, (param.Price_Y * 10)); // 单价YHAL_Delay(10);}param.last_rep_X = param.REP_X;param.last_rep_Y = param.REP_Y;param.Last_Price_X = param.Price_X;param.Last_Price_Y = param.Price_Y; // 延迟赋值
}

5.4 LED

LED显示函数,只需要写一次即可,我们只需要修改param.LED_State这个变量,就能达到控制哪一位LED亮灭的状态

LED显示多用位运算,非常巧妙~

//LED驱动函数
void LED_Disp(unsigned char state)
{HAL_GPIO_WritePin(GPIOC, 0xFF00, GPIO_PIN_SET);		  // 先全部熄灭 1HAL_GPIO_WritePin(GPIOC, state << 8, GPIO_PIN_RESET); // 点亮 0HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);	  // 锁存器置高,使能HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET); // 锁存器置低,失能
}
// LED处理函数
void LED_proc(void)
{static u8 led1, led2;// 函数减速if (uwTick - param.LED_Tick < 20)return;param.LED_Tick = uwTick;led1 = flag.Key4_Press << 0; // 5S内是1led2 = flag.led2_state << 1;param.LED_State = led1 | led2;LED_Disp(param.LED_State);
}

5.5 PWM

  • 设置频率,设置占空比,只修改变量即可
  • __HAL_TIM_SetAutoreload设置重装载值,80分频之后是1MHz = 1e6,用1e6/要设置的频率就是重装载值
  • __HAL_TIM_SetCompare设置比较值,设置高电平时间,即设置占空比,比较值=重装载值*占空比
void PWM_Set_Proc(void)
{if (uwTick - param.PWM_Tick < 100)return;param.PWM_Tick = uwTick;// 设置频率HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);param.Set_PA1_Freq = 2000;    //2000Hz__HAL_TIM_SetAutoreload(&htim2, 1e6 / param.Set_PA1_Freq - 1);// 设置占空比if (flag.Key4_Press == 1) // 5S内param.Set_PA1_Duty = 30;    //30%占空比elseparam.Set_PA1_Duty = 5;    //5%占空比__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, (1e6 / param.Set_PA1_Freq - 1) * param.Set_PA1_Duty / 100 + 1);    //设置占空比函数
}

5.6 定时器回调函数

定时器4专门用来10ms扫描一次按键

定时器6用来处理LED的5S点亮,和0.1S闪烁,使用标志位判断即可,这些都是常规操作~

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{static uint16_t LED_cnt, LED_cnt2;if (htim->Instance == TIM4){key_serv_double(); // 10ms按键处理}if (htim->Instance == TIM6) // 10ms进入一次 处理倒计时{if (flag.Key4_Press == 1){if (++LED_cnt >= 500){LED_cnt = 0;flag.Key4_Press = 0;}}if ((param.REP_X == 0) && (param.REP_Y == 0)) // 如果XY的库存都等于0{if (++LED_cnt2 >= 10){LED_cnt2 = 0; // 100msflag.led2_state = !flag.led2_state;}}elseflag.led2_state = 0;}
}

5.7 串口回调函数

// 串口的接收 回调函数
char USART_tx_string[50];
char rxdata[100];
uint8_t RX_Str_Data;
unsigned char rx_pointer; // 自己定义的指针,判断接收到哪了void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if (huart->Instance == USART1) // 如果是USART1{param.RX_Tick = uwTick;rxdata[rx_pointer++] = RX_Str_Data;				// 接收到的字符串存放在这里HAL_UART_Receive_DMA(&huart1, &RX_Str_Data, 1); // 最后这个参数只能写1}
}

 5.8 串口

void RX_Proc(void)
{if (uwTick - param.RX_Tick < 50)return;param.RX_Tick = uwTick;// 执行任务if (rx_pointer == 1 && rxdata[0] == '?') // 如果收到一个数据,并且是#{memset(USART_tx_string, '\0', sizeof(USART_tx_string)); // 变量清零sprintf(USART_tx_string, "X:%.1f,Y:%.1f", param.Price_X, param.Price_Y);HAL_UART_Transmit_DMA(&huart1, (uint8_t *)USART_tx_string, strlen(USART_tx_string));}else if (rx_pointer > 0){}rx_pointer = 0;						  // 指针归位memset(rxdata, '\0', sizeof(rxdata)); // 变量清零
}

5.9 上电初始化

  1. LCD初始化
  2. 按键初始化
  3. 定时器初始化
  4. PWM初始化
  5. 串口DMA发送初始化
  6. 串口DMA接收初始化
  7. 检测是否第一次上电,如果是第一次上电,就初始化库存和单价
// 上电初始化
void Power_Init(void)
{LED_Disp(0x00); // 关掉所有LEDLCD_Init(); // LCD初始化LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);LCD_DrawLine(120, 0, 320, Horizontal);LCD_DrawLine(0, 160, 240, Vertical);HAL_Delay(150);LCD_Clear(Blue);LCD_DrawRect(70, 210, 100, 100);HAL_Delay(150);LCD_Clear(Blue);LCD_DrawCircle(120, 160, 50);HAL_Delay(150);LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);KEY_GPIO_Init(); // 手动初始化,防止忘记配置CubeMX// 定时器初始化HAL_TIM_Base_Start_IT(&htim4);HAL_TIM_Base_Start_IT(&htim6); // 用于倒计时//	// PWM初始化HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); // 打开定时器2 通道2HAL_UART_Transmit_DMA(&huart1, (uint8_t *)USART_tx_string, strlen(USART_tx_string));HAL_UART_Receive_DMA(&huart1, &RX_Str_Data, 1); // IT改为DMA// 参数初始化if (EEPROM_ReadByte(111) != 11) // 第一次进入是不等于的{// 先执行这里的代码// 第一次就先初始化param.REP_X = 10; // 库存默认10param.REP_Y = 10; // 库存默认10param.Price_X = 1.0;param.Price_Y = 1.0f;EEPROM_WriteByte(111, 11); // 在111写111}else // 不是第一次上电{// 上电先读取EEPROMparam.REP_X = EEPROM_ReadByte(0);HAL_Delay(1);param.REP_Y = EEPROM_ReadByte(1);HAL_Delay(1);param.Price_X = EEPROM_ReadByte(2) / 10.0;HAL_Delay(1);param.Price_Y = EEPROM_ReadByte(3) / 10.0;HAL_Delay(1);}
}

6 测试

按键可以自行测试,这里我只展示串口部分的效果


7 做题感受

  • 注意浮点数的比较 2.0f与2.01f的区别,看上面5.2 KEY 按键3的解释
  • 串口收发不到数据,没使用rx_proc函数,然后重新配置了一下TX和RX的DMA就可以使用了
  • PWM没有输出,使用定时器2通道2,我写成了通道1,所以没有输出...
  • EEPROM存储的数据不能是小数;
  • 试题中比较难的部分是如何判定设备是否是第一次启动以及EEPROM连续读取需要一定的时间间隔
  • 总的来说,该试题还是比较简单的,就剩一些常见的解题模式框架,🚀🚀🚀!!!

相关文章:

【蓝桥杯嵌入式】第十三届省赛(第二场)

目录 0 前言 1 展示 1.1 源码 1.2 演示视频 1.3 题目展示 2 CubeMX配置(第十三届省赛第二场真题) 2.1 设置下载线 2.2 HSE时钟设置 2.3 时钟树配置 2.4 生成代码设置 2.5 USART1 2.5.1 基本配置 2.5.2 NVIC 2.5.3 DMA 2.6 TIM 2.6.1 TIM2 2.6.2 TIM4 2.6.3 …...

maya节点绕轴旋转

目录 旋转后并尝试冻结变换 绕x轴旋转90度 使用Python脚本 使用图形界面 使用MEL脚本 绕y轴旋转90度 使用Python脚本 ok 旋转后并尝试冻结变换 import maya.cmds as cmdsdef adjust_root_rotation_for_export(joint_name):# 选择根节点cmds.select(joint_name)# 应用旋…...

如何水出第一篇SCI:SCI发刊历程,从0到1全过程经验分享!!!

如何水出第一篇SCI&#xff1a;SCI发刊历程&#xff0c;从0到1全路程经验分享&#xff01;&#xff01;&#xff01; 详细的改进教程以及源码&#xff0c;戳这&#xff01;戳这&#xff01;&#xff01;戳这&#xff01;&#xff01;&#xff01;B站&#xff1a;Ai学术叫叫兽e…...

SpringBoot表单防止重复提交

哪些因素会引起重复提交&#xff1f; 开发的项目中可能会出现下面这些情况&#xff1a; 前端下单按钮重复点击导致订单创建多次 网速等原因造成页面卡顿&#xff0c;用户重复刷新提交请求 黑客或恶意用户使用postman等http工具重复恶意提交表单 重复提交会带来哪些问题&…...

java面向对象.day17(什么是面向对象)

先认识&#xff1a;面向过程思想&#xff0c;面向对象思想 面向过程思想&#xff08;具体&#xff09; 步骤清晰简单&#xff0c;第一步做什么&#xff0c;第二步做什么.... 面对过程适合处理一些较为简单的问题 面向对象思想&#xff08;抽象&#xff09; 物以类聚&#x…...

mysql处理并发简单示例

处理并发的基本思路是使用锁来控制对共享资源的访问。在MySQL中&#xff0c;可以使用事务和行级锁来处理并发。 具体处理方式如下&#xff1a; 创建一个用于存储并发任务的MySQL表&#xff0c;该表包含一个自增的ID字段和任务名称字段。设置一个最大并发数量&#xff0c;用来…...

顺序表——功能实现

✨✨欢迎&#x1f44d;&#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页&#xff1a;秋邱博客 所属栏目&#xff1a;C语言 &#xff08;感谢您的光临&#xff0c;您的光临蓬荜生辉&#xff09; 目录 1.0 前言 2.0 线性表 2.1 顺序表 2.2 顺序表的分类 2.3 顺序表功能的实现…...

达梦导出工具dexp

基础环境 操作系统&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) 数据库版本&#xff1a;DM Database Server 64 V8 架构&#xff1a;单实例dexp 逻辑导出 dexp 工具可以对本地或者远程数据库进行数据库级、用户级、模式级和表级的逻辑备份。备份的内容非…...

Ubuntu 22.04安装新硬盘并启动时自动挂载

方法一 要在Ubuntu 22.04系统中安装一个新硬盘、对其进行格式化并实现启动时自动挂载&#xff0c;需要按以下步骤操作&#xff1a; 1. 安装硬盘 - 确保你的硬盘正确连接到计算机上&#xff08;涉及硬件安装&#xff09;。 2. 发现新硬盘 - 在系统启动后&#xff0c;打开终端…...

Mybatis中sqlSession.getMapper背后的原理

在通过MyBatis操作数据库之前我们一定先通过Session对象获取指定Mappper接口的代理对象。如下代码所示&#xff1a; public class UserMapper{Select(value"SELECT * FROM user")public List<User> findAll(); }public static void main(String [] args){Conf…...

[环境配置]conda 64位安装32位python

进入32模式 set CONDA_FORCE_32BIT1创建环境 conda create --name yourEnv python3.8退出32模式 set CONDA_FORCE_32BIT0ok...

某虚假交友APP(信息窃取)逆向分析

应用初探 在群里水群的时候 群u发了一个交友APP 于是拿来分析一下 可以看到应用打开后又一个登录的界面 需要用户输入手机号与验证码进行登录 #在线云沙箱分析 将APK放入某安信云沙箱中分析 提示应用请求了过多的敏感权限 逆向分析 直接拖入Jadx分析 好在程序没有加固 也没…...

基于FPGA的按键消抖

按键工作原理 当KEY1按下时&#xff0c;整条电路就会导通&#xff0c;这个时候KEY1就是低电平&#xff1b; 当KEY1松开时&#xff0c;整条电路就会断开&#xff0c;这个时候KEY1就是高定平&#xff1b; 我们可以通过判断KEY1的高低电平来判断按键是否被按下。 为什么按键消…...

1.网络编程-网络协议

目录 网络编程是什么 网络编程三要素 OSI七层网络模型 TCP/IP五层模型 SSL/TLS 是哪层协议 网络编程是什么 网络编程是计算机科学中的一个重要领域&#xff0c;它涉及到编写能够在网络环境中进行通信的程序。网络编程的核心目标是使不同的设备能够通过网络交换信息&#…...

代码+视频,手动绘制logistic回归预测模型校准曲线(Calibration curve)(2)

校准曲线图表示的是预测值和实际值的差距&#xff0c;作为预测模型的重要部分&#xff0c;目前很多函数能绘制校准曲线。 一般分为两种&#xff0c;一种是通过Hosmer-Lemeshow检验&#xff0c;把P值分为10等分&#xff0c;求出每等分的预测值和实际值的差距 另外一种是calibrat…...

金融数据_Scikit-Learn决策树(DecisionTreeClassifier)实例

金融数据_Scikit-Learn决策树(DecisionTreeClassifier)实例 逻辑回归: 逻辑回归常被用于二分类问题, 比如涨跌预测。你可以将涨跌标记为类别, 然后使用逻辑回归进行训练。 决策树和随机森林: 决策树和随机森林是用于分类问题的强大模型。它们能够处理非线性关系, 并且对于特征…...

bash的login shell与non-login shell,以及各自的初始化过程

识别login shell与non-login shell login shell 可能是以-开头的 [almalinuxVM-AlmaLinux8-tmpl-wanlinwang ~]$ echo $0 -bash # "-" is the first character. Therefore, this is a login shell.或者以--login启动的bash [almalinuxVM-AlmaLinux8-tmpl-wanlinw…...

为什么苹果 Mac 电脑需要使用清理软件?

尽管 Apple Mac 电脑因其卓越的性能、简洁高效的 macOS 操作系统及独特的美学设计备受全球用户青睐&#xff0c;但任何电子设备在长期使用后都难以避免面临系统资源日渐累积的问题。其中一个重要维护需求在于&#xff0c;随着使用时间的增长&#xff0c;Mac电脑可能会由于系统垃…...

33. UE5 RPG使用增强输入激活GameplayAbility(三)

在前面的文章&#xff0c;我们实现了使用GameplayTag和InputAction的对应绑定的数据&#xff0c;并且添加到了增强输入映射的上下文中&#xff0c;实现了通过按键打印对应的GameplayTag&#xff0c;这只是我们基础需要制作的。目的主要是为了实现在GameplayAblity上面设置对应的…...

speech to text 库FastASR交叉编译arm target的配置

FastASR是一个比较方便的SPEECH TO TEXT的AI库。开源。下面介绍下其在交叉编译到ARM target时候的交叉编译的cmake配置&#xff1a; cmake_minimum_required(VERSION 3.10)project(FastASR)SET(CMAKE_C_COMPILER "/home/xxx/buildroot/output/platform_name/host/bin/aar…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...