【蓝桥杯嵌入式】 第六届国赛
目录
题目
配置
注意事项
代码 - 默写大师
EEPROM读写函数
LED驱动函数
ADC采集
上电初始化
LCD
按键
PWM互补输出
全部代码
hardware.c
hardware.h
control.c
control.h
main.c

题目



配置
注意事项
复制LCD的工程,先配置资源 --- 勾选完选项一定要再看一眼,可能选择错误

ADC:配置ADC2_IN15,对应PB15引脚

EEROM,配置PB6和PB7


按键 输入模式PB0、PB1、PB2、PA0
LED 一定要使能PD2
PWM互补输出,用TIM15


TIM6 - 10ms基准定时器

代码 - 默写大师
先默写几个函数
EEPROM读写函数
随机地址读函数 - 参考手册的时序

uint8_t EEPROM_ReadByte(uint8_t address)
{uint8_t data;I2CStart();I2CSendByte(0xA0); // address + writeI2CWaitAck();I2CSendByte(address);I2CWaitAck();I2CStop();I2CStart();I2CSendByte(0xA1); // address + readI2CWaitAck();data = I2CReceiveByte();I2CSendNotAck();I2CStop();return data;
}

void EEPROM_WriteByte(uint8_t address, uint8_t data)
{I2CStart();I2CSendByte(0xA0);I2CWaitAck();I2CSendByte(address);I2CWaitAck();I2CSendByte(data);I2CWaitAck();I2CStop();
}
定义几个结构体
//-----------------------
void power_init(void);
void LCD_Disp(void);
void Key_Proc(void);
void ADC_Proc(void);
void PWM_Proc(void);//-----------------------
struct Tick{uint32_t lcd;uint32_t key;uint32_t adc;uint32_t pwm;
};
extern struct Tick tick;struct Flag{bool PWM_Mode;uint8_t LCD_View;
};
extern struct Flag flag;struct Param{double ADC;uint16_t PWM_Frq; //频率uint8_t PWM_Duty_PA9;uint8_t PWM_Duty_PA14;
};
extern struct Param param;
//定义变量
struct Tick tick;
struct Flag flag;
struct Param param;
struct Keys key;
LED驱动函数
void LED_Disp(uint8_t state)
{HAL_GPIO_WritePin(GPIOC, 0xFF00, GPIO_PIN_SET); //0ffHAL_GPIO_WritePin(GPIOC, state << 8, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}
ADC采集
double Get_ADC(ADC_HandleTypeDef *hadc)
{uint32_t adc;HAL_ADC_Start(hadc);adc = HAL_ADC_GetValue(hadc);return adc*3.3/4040; //这里应该是adc*3.3/4096
}
double Get_ADC(ADC_HandleTypeDef *hadc)
{uint32_t adc;HAL_ADC_Start(hadc);adc = Hal_ADC_GetValue(hadc);return adc*3.3/4040;
}
返回值应该是adc*3.3/4096,但是这里我改成了return adc*3.3/4040; 补偿电压采集的数据,范围是0~3.30V
void ADC_Proc(void)
{if (uwTick - tick.adc < 250)return;tick.adc = uwTick;param.ADC = Get_ADC(&hadc2);
}
上电初始化
void power_init(void)
{LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);LED_Disp(0x00); //0ffI2CInit();if (EEPROM_ReadByte(0x55) != 0x11) //第一次上电{param.PWM_Frq = 1000; //初始化参数EEPROM_WriteByte(0x55, 0x11);HAL_Delay(10);EEPROM_WriteByte(0x01, 1);HAL_Delay(10);}else{param.PWM_Frq = EEPROM_ReadByte(0x01)*1000;}
}
LCD
封装LCD显示函数,使用可变参数列表
#include "stdio.h"
#include "string.h"
#include "stdarg.h"void LCD_Printf(uint8_t linex, char *format, ...)
{char lcd_show_text[30];memset(lcd_show_text, '\0', sizeof(lcd_show_text));va_list arg;va_start(arg, format);vsprintf(lcd_show_text, format, arg);LCD_DisplayStringLine(linex, (uint8_t *)lcd_show_text);va_end(arg);
}
LCD界面
void LCD_Disp(void)
{if (uwTick - tick.lcd < 200)return;tick.lcd = uwTick;if (flag.LCD_View == 0){LCD_Printf(Line0, " Para");LCD_Printf(Line2, " ADC_V:%.2fV ", param.ADC);LCD_Printf(Line4, " State:%s ", (flag.PWM_Mode) ? "start" : "stop" ); //三目运算符LCD_Printf(Line6, " Siginal:PA9: %2d%% ", (flag.PWM_Mode) ? (param.PWM_Duty_PA9) : 0);LCD_Printf(Line7, " PB14:%2d%% ", (flag.PWM_Mode) ? (param.PWM_Duty_PA14) :0);LCD_Printf(Line8, " %dKHz ", param.PWM_Frq/1000);LCD_Printf(Line9, " 1"); }else if (flag.LCD_View == 1){LCD_Printf(Line1, " Setting");LCD_Printf(Line5, " Signal_Frq:%dKHz ", param.PWM_Frq/1000);LCD_Printf(Line9, " 2");}
}
按键
按键扫描
void Key_Read(void)
{if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0)key.value = 1;else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0)key.value = 2;else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0)key.value = 3;else if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 0)key.value = 4;elsekey.value = 0;key.down = key.value & (key.value ^ key.old);key.up = ~key.value & (key.value ^ key.old);key.old = key.value;
}
按键处理函数
void Key_Proc(void)
{if (uwTick - tick.key < 10) //10msreturn;tick.key = uwTick;Key_Read();if (key.down == 1) //“B1”按键设定为“启动/停止”按键{flag.PWM_Mode = !flag.PWM_Mode;}if (key.down == 2){//先判断是否存入E2PROMif (flag.LCD_View == 1){//eepromEEPROM_WriteByte(0x01, param.PWM_Frq/1000); //存整数部分HAL_Delay(10);}// 再刷新界面flag.LCD_View ++;if (flag.LCD_View == 2) flag.LCD_View = 0;LCD_Clear(Black); }if (key.down == 3){if (flag.LCD_View == 1){param.PWM_Frq += 1000;if (param.PWM_Frq > 10000) param.PWM_Frq = 1000;}}
}
PWM互补输出
PWM配置的定时器,给的80-1预分频,那计数值就是80M/80 = 1M
频率设置:TIMx->ARR = 1e6/频率
占空比设置:TIMx->CCRx = (1e6/频率)*占空比
我代码里的占空比只保留整数部分,所以我的CCR赋值时候最后除以100。
void PWM_Proc(void)
{if (uwTick - tick.pwm < 100)return;tick.pwm = uwTick;//计算占空比param.PWM_Duty_PA9 = (uint8_t)(param.ADC*100.0/3.3);param.PWM_Duty_PA14 = 100-param.PWM_Duty_PA9;TIM15->ARR = 1e6 / param.PWM_Frq; //计算频率if (flag.PWM_Mode == 0) //stop{ //关闭PWM输出LED_Disp(0);HAL_TIM_PWM_Stop(&htim15, TIM_CHANNEL_1);HAL_TIMEx_PWMN_Stop(&htim15, TIM_CHANNEL_1);}else{LED_Disp(0x01);TIM15 -> CCR1 = (TIM15->ARR + 1) * param.PWM_Duty_PA9 / 100;HAL_TIM_PWM_Start(&htim15, TIM_CHANNEL_1);HAL_TIMEx_PWMN_Start(&htim15, TIM_CHANNEL_1);}
}
互补PWM的函数
//PWM开启
HAL_TIM_PWM_Start(&htim15, TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start(&htim15, TIM_CHANNEL_1);
//PWM关闭
HAL_TIM_PWM_Stop(&htim15, TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Stop(&htim15, TIM_CHANNEL_1);
全部代码
hardware.c
#include "hardware.h"struct Keys key;void LED_Disp(uint8_t state)
{HAL_GPIO_WritePin(GPIOC, 0xFF00, GPIO_PIN_SET); //0ffHAL_GPIO_WritePin(GPIOC, state << 8, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}void Key_Read(void)
{if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0)key.value = 1;else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0)key.value = 2;else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0)key.value = 3;else if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 0)key.value = 4;elsekey.value = 0;key.down = key.value & (key.value ^ key.old);key.up = ~key.value & (key.value ^ key.old);key.old = key.value;
}double Get_ADC(ADC_HandleTypeDef *hadc)
{uint32_t adc;HAL_ADC_Start(hadc);adc = HAL_ADC_GetValue(hadc);return adc*3.3/4040;
}
hardware.h
#ifndef __HARDWARE_H
#define __HARDWARE_H#include "stm32g4xx_hal.h"void LED_Disp(uint8_t state);
void Key_Read(void);
double Get_ADC(ADC_HandleTypeDef *hadc);struct Keys{uint8_t value;uint8_t old;uint8_t down;uint8_t up;
};
extern struct Keys key;#endif
control.c
#include "control.h"//定义变量
struct Tick tick;
struct Flag flag;
struct Param param;void power_init(void)
{LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);LED_Disp(0x00); //0ffI2CInit();if (EEPROM_ReadByte(0x55) != 0x11) //第一次上电{param.PWM_Frq = 1000; //初始化参数EEPROM_WriteByte(0x55, 0x11);HAL_Delay(10);EEPROM_WriteByte(0x01, 1);HAL_Delay(10);}else{param.PWM_Frq = EEPROM_ReadByte(0x01)*1000;}
}void LCD_Disp(void)
{if (uwTick - tick.lcd < 200)return;tick.lcd = uwTick;if (flag.LCD_View == 0){LCD_Printf(Line0, " Para");LCD_Printf(Line2, " ADC_V:%.2fV ", param.ADC);LCD_Printf(Line4, " State:%s ", (flag.PWM_Mode) ? "start" : "stop" ); //三目运算符LCD_Printf(Line6, " Siginal:PA9: %2d%% ", (flag.PWM_Mode) ? (param.PWM_Duty_PA9) : 0);LCD_Printf(Line7, " PB14:%2d%% ", (flag.PWM_Mode) ? (param.PWM_Duty_PA14) :0);LCD_Printf(Line8, " %dKHz ", param.PWM_Frq/1000);LCD_Printf(Line9, " 1"); }else if (flag.LCD_View == 1){LCD_Printf(Line1, " Setting");LCD_Printf(Line5, " Signal_Frq:%dKHz ", param.PWM_Frq/1000);LCD_Printf(Line9, " 2");}
}void Key_Proc(void)
{if (uwTick - tick.key < 10) //10msreturn;tick.key = uwTick;Key_Read();if (key.down == 1) //“B1”按键设定为“启动/停止”按键{flag.PWM_Mode = !flag.PWM_Mode;}if (key.down == 2){//先判断是否存入E2PROMif (flag.LCD_View == 1){//eepromEEPROM_WriteByte(0x01, param.PWM_Frq/1000); //存整数部分HAL_Delay(10);}// 再刷新界面flag.LCD_View ++;if (flag.LCD_View == 2) flag.LCD_View = 0;LCD_Clear(Black); }if (key.down == 3){if (flag.LCD_View == 1){param.PWM_Frq += 1000;if (param.PWM_Frq > 10000) param.PWM_Frq = 1000;}}
}void ADC_Proc(void)
{if (uwTick - tick.adc < 250)return;tick.adc = uwTick;param.ADC = Get_ADC(&hadc2);
}void PWM_Proc(void)
{if (uwTick - tick.pwm < 100)return;tick.pwm = uwTick;//计算占空比param.PWM_Duty_PA9 = (uint8_t)(param.ADC*100.0/3.3);param.PWM_Duty_PA14 = 100-param.PWM_Duty_PA9;TIM15->ARR = 1e6 / param.PWM_Frq; //计算频率if (flag.PWM_Mode == 0) //stop{ //关闭PWM输出LED_Disp(0);HAL_TIM_PWM_Stop(&htim15, TIM_CHANNEL_1);HAL_TIMEx_PWMN_Stop(&htim15, TIM_CHANNEL_1);}else{LED_Disp(0x01);TIM15 -> CCR1 = (TIM15->ARR + 1) * param.PWM_Duty_PA9 / 100;HAL_TIM_PWM_Start(&htim15, TIM_CHANNEL_1);HAL_TIMEx_PWMN_Start(&htim15, TIM_CHANNEL_1);}
}
control.h
#ifndef __CONTROL_H
#define __CONTROL_H#include "stm32g4xx_hal.h"
#include "string.h"
#include "stdio.h"
#include "stdbool.h"#include "hardware.h"
#include "i2c_hal.h"
#include "tim.h"
#include "adc.h"
#include "lcd.h"//-----------------------
void power_init(void);
void LCD_Disp(void);
void Key_Proc(void);
void ADC_Proc(void);
void PWM_Proc(void);//-----------------------
struct Tick{uint32_t lcd;uint32_t key;uint32_t adc;uint32_t pwm;};
extern struct Tick tick;struct Flag{bool PWM_Mode;uint8_t LCD_View;};
extern struct Flag flag;struct Param{double ADC;uint16_t PWM_Frq; //频率uint8_t PWM_Duty_PA9;uint8_t PWM_Duty_PA14;};
extern struct Param param;
//-----------------------#endif
main.c
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "tim.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */#include "control.h"/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* 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_TIM6_Init();MX_ADC2_Init();MX_TIM15_Init();/* USER CODE BEGIN 2 */LCD_Init();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */power_init();while (1){Key_Proc();LCD_Disp();ADC_Proc();PWM_Proc();/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
完结,第六届国赛比较简单,只有PWM互补输出是没有写过的
后续会更新其他届的赛题,同步源码到我的Gitee~
波形展示:具体见B站演示视频
相关文章:
【蓝桥杯嵌入式】 第六届国赛
目录 题目 配置 注意事项 代码 - 默写大师 EEPROM读写函数 LED驱动函数 ADC采集 上电初始化 LCD 按键 PWM互补输出 全部代码 hardware.c hardware.h control.c control.h main.c 题目 配置 注意事项 复制LCD的工程,先配置资源 --- 勾选完选项一…...
图片裁剪与上传处理方案 —— 基于阿里云 OSS 处理用户资料
目录 01: 通用组件:input 构建方案分析 02: 通用组件:input 构建方案 03: 构建用户资料基础样式 04: 用户基本资料修改方案 05: 处理不保存时的同步问题 06: 头像修改方案流程分析 07: 通用组件:Dialog 构建方案分析 08: 通用组件&…...
迷你主机Esxi 6.7挂载新硬盘
背景 硬件:零刻SER Pro 6 系统:vmware Exsi 6.7.0 Update 3 现有的硬盘槽位占满了,但空间不够用,想要通过USB外接移动硬盘来进行扩容。使用了一块250G的硬盘做测试。 步骤 TL;DR # 停止usbarbitrator服务 /etc/init.d/usbarbi…...
解决VSCode右键没有Open In Default Browser问题
在VSCode进行Web小程序测试时,我们在新建的HTML文件中输入 !会自动生成页面代码骨架,写入内容后,我们想要右键在浏览器中预览。发现右键没有“Open In Default Browser”选项。原因是没有安装插件。 下面是解决方案:首先在VSCode找…...
httpsok-v1.12.0支持LB证书自动部署
🔥httpsok-v1.12.0支持LB证书自动部署 介绍 httpsok 是一个便捷的 HTTPS 证书自动续签工具,基于全新的设计理念,专为 Nginx 、OpenResty 服务器设计。已服务众多中小企业,稳定、安全、可靠。 一行命令,一分钟轻松搞…...
基于Pytorch框架的深度学习EfficientNetV2神经网络中草药识别分类系统源码
第一步:准备数据 5种中草药数据:self.class_indict ["百合", "党参", "山魈", "枸杞", "槐花", "金银花"] ,总共有900张图片,每个文件夹单独放一种数据 第二步&a…...
网络协议。
一、流程案例 接下来揭秘我要说的大事情,“双十一”。这和我们要讲的网络协议有什么关系呢? 在经济学领域,有个伦纳德里德(Leonard E. Read)创作的《铅笔的故事》。这个故事通过一个铅笔的诞生过程,来讲述…...
Excel单元格格式无法修改的原因与解决方法
Excel单元格格式无法更改可能由多种原因造成。以下是一些可能的原因及相应的解决方法: 单元格或工作表被保护: 如果单元格或工作表被设置为只读或保护状态,您将无法更改其中的格式。解决方法:取消单元格或工作表的保护。在Excel中…...
CasaOS玩客云安装全平台高速下载器Gopeed并实现远程访问
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
JAVA学习-练习试用Java实现“最长回文子串”
问题: 给定一个字符串 s,找到 s 中最长的回文子串。 示例 1: 输入:s "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。 示例 2: 输入:s …...
深入探索Qt框架系列之信号槽原理(三)
前面两篇分别介绍了QObject::connect和QMetaObject::Connection,那么信号槽机制的基础已经介绍完了,本文将介绍信号槽机制是如何从信号到槽的,以及多线程下是如何工作的。 信号槽机制源码解析 1. 信号的触发 以该系列的第一篇文章中的示例举…...
npm镜像源管理、nvm安装多版本node异常处理
查看当前使用的镜像源 npm config get registry --locationglobal 设置使用官方源 npm config set registry https://registry.npmjs.org/ --locationglobal 设置淘宝镜像源 npm config set registry https://registry.npm.taobao.org/ --locationglobal 需要更改淘宝镜像源地址…...
异步编程的魔力:如何显著提升系统性能
异步编程的魔力:如何显著提升系统性能 今天我们来聊聊一个对开发者非常重要的话题——异步编程。异步编程是提升系统性能的一种强大手段,尤其在需要高吞吐量和低时延的场景中,异步设计能够显著减少线程等待时间,从而提升整体性能。 异步设计如何提升系统性能? 我们通过…...
优选算法一:双指针算法与练习(移动0)
目录 双指针算法讲解 移动零 双指针算法讲解 常见的双指针有两种形式,一种是对撞指针,一种是快慢指针。 对撞指针:一般用于顺序结构中,也称左右指针。 对撞指针从两端向中间移动。一个指针从最左端开始,另一个从最…...
数据结构第二篇【关于java线性表(顺序表)的基本操作】
【关于java线性表(顺序表)的基本操作】 线性表是什么?🐵🐒🦍顺序表的定义🦧🐶🐵创建顺序表新增元素,默认在数组最后新增在 pos 位置新增元素判定是否包含某个元素查找某个…...
人工智能和大模型的区别
人工智能(AI)和大模型是两个相关但有区别的概念。理解它们之间的区别有助于更好地掌握现代科技的发展动态。 人工智能(AI) 人工智能(Artificial Intelligence, AI)是一个广义的概念,指的是通过…...
k8s处于pending状态的原因有哪些
k8s处于pending状态的原因 资源不足:集群中的资源(如CPU、内存)不足以满足Pod所需的资源请求,导致Pod无法调度。 调度器问题:调度器无法为Pod找到合适的节点进行调度,可能是由于节点资源不足或调度策略配置…...
【C++】入门(一):命名空间、缺省参数、函数重载
目录 一、关键字 二、命名空间 问题引入(问题代码): 域的问题 1.::域作用限定符 的 用法: 2.域的分类 3.编译器的搜索原则 命名空间的定义 命名空间的使用 举个🌰栗子: 1.作用域限定符指定命名空间名称 2. using 引入…...
深入分析 Android Activity (四)
文章目录 深入分析 Android Activity (四)1. Activity 的生命周期详解1.1 onCreate1.2 onStart1.3 onResume1.4 onPause1.5 onStop1.6 onDestroy1.7 onRestart 2. Activity 状态的保存与恢复2.1 保存状态2.2 恢复状态 3. Activity 的启动优化3.1 延迟初始化3.2 使用 ViewStub3.…...
Java实现顺序表
Java顺序表 前言一、线性表介绍常见线性表总结图解 二、顺序表概念顺序表的分类顺序表的实现throw具体代码 三、顺序表会出现的问题 前言 推荐一个网站给想要了解或者学习人工智能知识的读者,这个网站里内容讲解通俗易懂且风趣幽默,对我帮助很大。我想与…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
