【蓝桥杯嵌入式】第十三届省赛(第二场)
目录
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);
}
思路如下:
- //先清除数组的内容
- // 定义可变参数列表数据类型的变量arg
- // 从format开始,接收参数列表到arg变量
- // 使用vsprintf打印格式化字符串和参数列表到字符数组中
- //LCD显示
- // 结束变量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 上电初始化
- LCD初始化
- 按键初始化
- 定时器初始化
- PWM初始化
- 串口DMA发送初始化
- 串口DMA接收初始化
- 检测是否第一次上电,如果是第一次上电,就初始化库存和单价
// 上电初始化
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:SCI发刊历程,从0到1全路程经验分享!!! 详细的改进教程以及源码,戳这!戳这!!戳这!!!B站:Ai学术叫叫兽e…...

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

java面向对象.day17(什么是面向对象)
先认识:面向过程思想,面向对象思想 面向过程思想(具体) 步骤清晰简单,第一步做什么,第二步做什么.... 面对过程适合处理一些较为简单的问题 面向对象思想(抽象) 物以类聚&#x…...

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

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

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

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

Mybatis中sqlSession.getMapper背后的原理
在通过MyBatis操作数据库之前我们一定先通过Session对象获取指定Mappper接口的代理对象。如下代码所示: 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按下时,整条电路就会导通,这个时候KEY1就是低电平; 当KEY1松开时,整条电路就会断开,这个时候KEY1就是高定平; 我们可以通过判断KEY1的高低电平来判断按键是否被按下。 为什么按键消…...

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

代码+视频,手动绘制logistic回归预测模型校准曲线(Calibration curve)(2)
校准曲线图表示的是预测值和实际值的差距,作为预测模型的重要部分,目前很多函数能绘制校准曲线。 一般分为两种,一种是通过Hosmer-Lemeshow检验,把P值分为10等分,求出每等分的预测值和实际值的差距 另外一种是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 操作系统及独特的美学设计备受全球用户青睐,但任何电子设备在长期使用后都难以避免面临系统资源日渐累积的问题。其中一个重要维护需求在于,随着使用时间的增长,Mac电脑可能会由于系统垃…...

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

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

WPS快速将插入Excle数据插入Word
前置条件: 一张有标题、数据的excle表格word中的表格与excle表格标题对应或包含电脑已经安装WPS软件 第一步、根据word模板设计excle模板,标头对应 第二步、word上面选【引用】--【邮件】,选打开数据源,找到excle文件,…...

Springboot 集成Rabbitmq之延时队列
1.首先确保已经引入了Spring AMQP和RabbitMQ的相关依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2. 创建一个普通队列并设置TTL&#x…...

【云开发笔记NO.22】运用云原生产品打造技术中台
一、云原生产品与技术中台的结合点 云原生产品以其容器化、微服务化、自动化等特性,为技术中台的建设提供了强大的技术支持。容器化技术使得应用可以更容易地进行部署和管理,提高了应用的可移植性和弹性。微服务架构则让应用更加模块化,便于…...

C++进阶(五) 哈希
1. unordered系列关联式容器 1.1 unordered_map 1.2 unordered_map的接口说明 2. 底层结构 2.1 哈希概念 2.2 哈希冲突 2.3 哈希函数 2.4 哈希冲突解决 2.4.1 闭散列 2.4.2 开散列 3. 模拟实现 3.1 unordered_set 3.2 unordered_map 4.哈希的应用 4.1 位图 4.1.…...

【算法基础】基于异或的排序、基于异或的经典面试题
文章目录 1. 传统交换2. 异或与异或的规律3. 基于异或的排序4. 需要注意的地方5. 经典面试题15.1 题目5.2 思路5.3 实现 6. 经典面试题26.1 题目6.2 思路6.3 实现 1. 传统交换 传统交换方法如下: def swap(i, j):tmp ii jj tmp通过开辟一个额外的变量空间&…...

HTML2:列表和表格
列表 有序列表 ordered list ol 无序列表 unordered list ul 定义列表 definition list dl 1,有序列表 每条列表前自带一个序号 2,无序列表 每条列表前自带一个小圆点 3,定义列表 注意:dl中放的不是li列表而是dt列表和dd表项 dt代表术语标题 dd代表术语内容 一个…...

用于无人机小型化设计的高精度温补晶振
用于无人机小型化设计的高精度温补晶振:TG2016SMN和TG2520SMN。无人机的发展可以说是非常的迅速,在安防,农业,交通,电力,直播等领域经常能看到无人机大显身手。无人机的应用场最是非常的广泛,功能更强&…...

轨迹规划 | 图解最优控制LQR算法(附ROS C++/Python/Matlab仿真)
目录 0 专栏介绍1 最优控制理论2 线性二次型问题3 LQR的价值迭代推导4 基于差速模型的LQR控制5 仿真实现5.1 ROS C实现5.2 Python实现5.3 Matlab实现 0 专栏介绍 🔥附C/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全…...

工业视觉检测
目录 我对工业视觉检测的了解 一、关键组成部分 二、应用场景 三、技术挑战 我对工业视觉检测的了解 工业视觉检测是利用机器视觉技术对产品质量进行自动化检查的过程,它在制造业中扮演着至关重要的角色,用于确保产品质量、提高生产效率、减少人工成…...

wheeltec轮趣ROS教育机器人的网络连接
一、术语解析 宿主机:宿主机是指物理主机,比如用于开发测试的笔记本电脑和台式机电脑。 虚拟机:虚拟机是指安装在宿主机的VMware,推荐在宿主机上安装虚拟机,官方提供虚拟机的镜像以及配套的开发环境。 ROS主机&…...