ADC 的音频实验,无线收发模块( nRF24L01)
nRF24L01 采用 QFN20 封装,有 20 个引脚,以下是各引脚的详细介绍:
1. 电源引脚
◦ VDD:电源输入端,一般接 + 3V 电源,为芯片提供工作电压,供电电压范围为 1.9V~3.6V。
◦ VSS:电源地引脚,接地,为芯片提供电气参考电位。
◦ VDD_PA:为功率放大器供电,输出为 1.8V,给射频功率放大器提供所需的电源。
◦ DVDD:去耦电路电源正极端,用于连接去耦电容,为芯片内部电路提供稳定的电源。
2. SPI 接口引脚
◦ CSN:SPI 片选信号引脚,低电平有效。当 CSN 为低电平时,芯片被选中,微处理器可以通过 SPI 接口对 nRF24L01 进行配置和数据传输。
◦ SCK:SPI 时钟引脚,用于同步 SPI 数据传输,由微处理器提供时钟信号,决定数据传输的速率和时序。
◦ MOSI:主设备输出从设备输入引脚,微处理器通过该引脚将数据发送到 nRF24L01 芯片中,进行寄存器配置、发送数据等操作。
◦ MISO:主设备输入从设备输出引脚,nRF24L01 通过该引脚将数据返回给微处理器,如返回寄存器的值、接收的数据等。
3. 控制与状态引脚
◦ CE:使能发射或接收引脚,数字输入。在 CSN 为低的情况下,CE 协同 CONFIG 寄存器共同决定 nRF24L01 的状态,用于选择芯片的工作模式,如发射模式、接收模式、待机模式等。
◦ IRQ:中断标志位引脚,数字输出,低电平触发。当状态寄存器中 TX_DS(数据发送完成中断位)、RX_DR(接收数据中断位)或 MAX_RT(达到最多次重发中断位)为高时触发中断,通知微处理器进行相应的处理。
4. 晶体振荡器引脚
◦ XC2:晶体振荡器 2 脚,模拟输出,用于连接外部晶体振荡器的一端,与 XC1 共同构成晶体振荡电路,为芯片提供时钟信号。
◦ XC1:晶体振荡器 1 脚 / 外部时钟输入脚,模拟输入,可连接外部晶体振荡器的另一端,也可以作为外部时钟信号的输入引脚。
5. 天线接口引脚
◦ ANT1:天线接口 1,用于连接天线,实现射频信号的发射和接收。
◦ ANT2:天线接口 2,同样用于连接天线,与 ANT1 共同作用,提高射频信号的传输性能。
6. 参考电流输入引脚
◦ IREF:参考电流输入引脚,模拟输入,用于输入参考电流,为芯片内部的电路提供基准电流。
- ADC 配置:
/* ADC 及引脚 定义 */
#define ADC_ADCX_CHY_GPIO_PORT GPIOA
#define ADC_ADCX_CHY_GPIO_PIN GPIO_PIN_5
#define ADC_ADCX_CHY_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOC_CLK_ENABLE();\
}while(0) /* PA 口时钟使能 */
#define ADC_ADCX ADC1
#define ADC_ADCX_CHY ADC_CHANNEL_5 /* 通道 Y, 0 <= Y <= 16 */
/* ADC1 时钟使能 */
#define ADC_ADCX_CHY_CLK_ENABLE() do{ __HAL_RCC_ADC1_CLK_ENABLE();}while(0)
ADC_HandleTypeDef hadc;
void ADC_Init(void)
{
__HAL_RCC_ADC1_CLK_ENABLE();// 使能ADC时钟
// 配置ADC结构体参数
hadc.Instance = ADC1; // 选择使用ADC1,
hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
// 时钟预分频,这里将APB2时钟(PCLK)除以4作为ADC时钟,
hadc.Init.Resolution = ADC_RESOLUTION_12B; // 分辨率设置为12位,这意味着ADC转换结果的范围是0 - 4095
hadc.Init.ScanConvMode = DISABLE; // 禁用扫描模式,因为我们只处理单个通道
hadc.Init.ContinuousConvMode = ENABLE;
// 启用连续转换模式,ADC会不断进行转换,而不是只进行一次
hadc.Init.DiscontinuousConvMode = DISABLE; // 禁用不连续转换模式
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
// 不使用外部触发转换,即采用软件触发
hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; // 软件触发ADC转换
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 数据右对齐,转换结果的低12位有效
hadc.Init.NbrOfConversion = 1; // 转换通道数量为1
hadc.Init.DMAContinuousRequests = DISABLE; // 禁用DMA连续请求,这里不使用DMA传输
hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV; // 单个转换结束标志
// 3. 初始化ADC
if (HAL_ADC_Init(&hadc) != HAL_OK)
{
Error_Handler();// 初始化失败处理
}
ADC_ChannelConfTypeDef sConfig;// 4. 配置ADC通道
sConfig.Channel = ADC_CHANNEL_0; // 选择ADC通道0,可根据实际连接的引脚修改
sConfig.Rank = 1; // 通道转换顺序为第1个
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
// 采样时间设置为3个ADC时钟周期,可根据需要调整
if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
{
Error_Handler();// 通道配置失败处理
}
}
// 错误处理函数示例
void Error_Handler(void)
{
while (1)
{
// 可以添加错误提示代码,如点亮LED等
}
}
音频信号采集,模拟信号转换为数字信号
uint16_t adc_value;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if (hadc->Instance == ADC1)
{
adc_value = HAL_ADC_GetValue(hadc);
// 在这里可以对采集到的数字音频信号进行进一步处理
GPIO_InitTypeDef gpio_init_struct;
ADC_ADCX_CHY_CLK_ENABLE(); /* 使能 ADCx 时钟 */
ADC_ADCX_CHY_GPIO_CLK_ENABLE(); /* 开启 GPIO 时钟 */
/* AD 采集引脚模式设置,模拟输入 */
gpio_init_struct.Pin = ADC_ADCX_CHY_GPIO_PIN;
gpio_init_struct.Mode = GPIO_MODE_ANALOG;
gpio_init_struct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(ADC_ADCX_CHY_GPIO_PORT, &gpio_init_struct);
}
}
编码与调制
#include "nrf24l01.h"
void ASK_Modulate(uint16_t data)
{
// 将数字信号转换为适合ASK调制的形式,例如0对应低电平,非0对应高电平
uint8_t modulated_data = (data == 0)? 0 : 1;
// 发送调制后的数据到nRF24L01
NRF24L01_TxPacket(&modulated_data);
}
无线传输
#include "stm32f4xx_hal.h"
#include "nrf24l01.h"
// 定义nRF24L01相关引脚
#define NRF24L01_CE_Pin GPIO_PIN_0
#define NRF24L01_CE_GPIO_Port GPIOA
#define NRF24L01_CSN_Pin GPIO_PIN_1
#define NRF24L01_CSN_GPIO_Port GPIOA
#define NRF24L01_IRQ_Pin GPIO_PIN_2
#define NRF24L01_IRQ_GPIO_Port GPIOA
// 定义SPI句柄
extern SPI_HandleTypeDef hspi1;
// 初始化nRF24L01相关GPIO引脚
static void NRF24L01_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct
= {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置CE引脚
GPIO_InitStruct
.Pin = NRF24L01_CE_Pin;
GPIO_InitStruct
.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct
.Pull = GPIO_NOPULL;
GPIO_InitStruct
.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(NRF24L01_CE_GPIO_Port, &GPIO_InitStruct);
// 配置CSN引脚
GPIO_InitStruct
.Pin = NRF24L01_CSN_Pin;
GPIO_InitStruct
.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct
.Pull = GPIO_NOPULL;
GPIO_InitStruct
.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(NRF24L01_CSN_GPIO_Port, &GPIO_InitStruct);
// 配置IRQ引脚
GPIO_InitStruct
.Pin = NRF24L01_IRQ_Pin;
GPIO_InitStruct
.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct
.Pull = GPIO_NOPULL;
HAL_GPIO_Init(NRF24L01_IRQ_GPIO_Port, &GPIO_InitStruct);
// 初始化CE和CSN引脚电平
HAL_GPIO_WritePin(NRF24L01_CE_GPIO_Port, NRF24L01_CE_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_SET);
}
// 向nRF24L01写寄存器
static void NRF24L01_Write_Reg(uint8_t reg, uint8_t value)
{
HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, ®, 1, 100);
HAL_SPI_Transmit(&hspi1, &value, 1, 100);
HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_SET);
}
// 从nRF24L01读寄存器
static uint8_t NRF24L01_Read_Reg(uint8_t reg)
{
uint8_t value;
HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, ®, 1, 100);
HAL_SPI_Receive(&hspi1, &value, 1, 100);
HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_SET);
return value;
}
// 初始化nRF24L01
void NRF24L01_Init(void)
{
// 初始化相关GPIO引脚
NRF24L01_GPIO_Init();
// 延时一段时间等待nRF24L01上电稳定
HAL_Delay(100);
// 配置为发射模式(可根据需要修改为接收模式)
NRF24L01_Write_Reg(NRF24L01_REG_CONFIG, 0x0E); // 使能CRC,2字节CRC校验,上电,发射模式
// 设置通道频率
NRF24L01_Write_Reg(NRF24L01_REG_RF_CH, 0x40); // 通道76
// 设置数据速率和发射功率
NRF24L01_Write_Reg(NRF24L01_REG_RF_SETUP, 0x0F); // 2Mbps速率,最大发射功率
// 设置接收地址宽度
NRF24L01_Write_Reg(NRF24L01_REG_SETUP_AW, 0x03); // 5字节地址宽度
// 设置自动重发时间和次数
NRF24L01_Write_Reg(NRF24L01_REG_SETUP_RETR, 0x1A); // 自动重发延迟500us,重发次数10次
// 设置接收通道0地址
uint8_t rx_addr_p0[5] = {0xE7, 0xE7, 0xE7, 0xE7, 0xE7};
HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, (uint8_t *)&NRF24L01_CMD_WRITE_REG + NRF24L01_REG_RX_ADDR_P0, 1, 100);
HAL_SPI_Transmit(&hspi1, rx_addr_p0, 5, 100);
HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_SET);
// 设置发射地址
uint8_t tx_addr[5] = {0xE7, 0xE7, 0xE7, 0xE7, 0xE7};
HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, (uint8_t *)&NRF24L01_CMD_WRITE_REG + NRF24L01_REG_TX_ADDR, 1, 100);
HAL_SPI_Transmit(&hspi1, tx_addr, 5, 100);
HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_SET);
// 设置接收通道0数据长度
NRF24L01_Write_Reg(NRF24L01_REG_RX_PW_P0, 1); // 1字节数据长度
// 清除中断标志
NRF24L01_Write_Reg(NRF24L01_REG_STATUS, 0x70);
}int main(void)
{
// 初始化ADC、nRF24L01等
ADC_Init();
NRF24L01_Init();
while (1)
{
// 启动ADC转换
HAL_ADC_Start_IT(&hadc);
// 等待ADC转换完成,在中断中获取adc_value
// 对采集到的音频数据进行编码和ASK调制并发送
ASK_Modulate(adc_value);
}
}
DAC 实验数模转换器
typedef struct
{
DAC_TypeDef *Instance; /* DAC 寄存器基地址 */
__IO HAL_DAC_StateTypeDef State; /* DAC 工作状态 */
HAL_LockTypeDef Lock; /* DAC 锁定对象 */
DMA_HandleTypeDef *DMA_Handle1; /* 通道 1 的 DMA 处理句柄指针 */
DMA_HandleTypeDef *DMA_Handle2; /* 通道 2 的 DMA 处理句柄指针 */
__IO uint32_t ErrorCode; /* DAC 错误代码 */
} DAC_HandleTypeDef;
typedef struct
{
uint32_t Trigger; //指定DAC触发源
DAC_TRIGGER_NONE:不使用触发源,通过软件触发。
DAC_TRIGGER_T6_TRGO:使用定时器 6 的触发输出(TRGO)作为触发源。
DAC_TRIGGER_T3_TRGO:使用定时器 3 的触发输出(TRGO)作为触发源。
uint32_t OutputBuffer; //指定DAC输出缓冲状态
DAC_OUTPUTBUFFER_ENABLE:使能输出缓冲,提高输出驱动能力。
DAC_OUTPUTBUFFER_DISABLE:禁用输出缓冲。
} DAC_InitTypeDef;
MSP 初始化函数 HAL_DAC_MspInit,
void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac);
DAC 的通道参数初始化函数:
HAL_StatusTypeDef HAL_DAC_ConfigChannel(DAC_HandleTypeDef *hdac,
DAC_ChannelConfTypeDef *sConfig, uint32_t Channel);
typedef struct
{
uint32_t DAC_Trigger; /* DAC 触发源的选择 */
uint32_t DAC_OutputBuffer; /* 启用或者禁用 DAC 通道输出缓冲区 */
} DAC_ChannelConfTypeDef;
使能启动 DAC 转换通道函数,
HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef *hdac, uint32_t Channel);
DAC 的通道输出值函数,其声明如下:
HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef *hdac, uint32_t Channel,
uint32_t Alignment, uint32_t Data);
Channel选择输出通道, DAC_CHANNEL_1或DAC_CHANNEL_2
DAC 读取通道输出值函数:
uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef *hdac, uint32_t Channel);
启动 DAC 使用 DMA 方式传输函数,
HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel,
uint32_t *pData, uint32_t Length, uint32_t Alignment);
形参 3 是使用 DAC 输出数据缓冲区的指针。
形参 4 是 DAC 输出数据的长度。
形参 5 是指定 DAC 通道的数据对齐方式,有:DAC_ALIGN_8B_R(8 位右对齐)、
DAC_ALIGN_12B_L(12 位左对齐)和 DAC_ALIGN_12B_R(12 位右对齐)三种方式
停止 DAC 的 DMA 方式函数,其声明如下:
HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel);
配置主模式下的定时器触发输出选择函数,其声明如下:
HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(
TIM_HandleTypeDef *htim, TIM_MasterConfigTypeDef *sMasterConfig);
接收端,无线接收
uint8_t received_data;
void NRF24L01_Receive(void)
{
if (NRF24L01_RxPacket(&received_data) == 0)
{
// 接收成功,对received_data进行处理
}
}
解调与解码
uint16_t ASK_Demodulate(uint8_t data)
{
// ASK解调,将接收到的数据转换为数字音频信号形式
return (data == 0)? 0 : 1000; // 这里假设0对应0,1对应1000,实际需根据编码情况调整
}
DAC 配置与音频输出
DAC_HandleTypeDef hdac;
void DAC_Init(void)
{
hdac.Instance = DAC;
hdac.Init.OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
HAL_DAC_Init(&hdac);
// 配置DAC通道
DAC_ChannelConfTypeDef sConfig;
sConfig.DAC_Channel = DAC_CHANNEL_1;
sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
HAL_DAC_ConfigChannel(&hdac, &sConfig);
}
int main(void)
{
// 初始化nRF24L01、DAC等
NRF24L01_Init();
DAC_Init();
while (1)
{
// 接收无线数据
NRF24L01_Receive();
// 对接收数据进行ASK解调
uint16_t demodulated_data = ASK_Demodulate(received_data);
// 通过DAC输出模拟音频信号
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, demodulated_data);
}
}
相关文章:
ADC 的音频实验,无线收发模块( nRF24L01)
nRF24L01 采用 QFN20 封装,有 20 个引脚,以下是各引脚的详细介绍: 1. 电源引脚 ◦ VDD:电源输入端,一般接 3V 电源,为芯片提供工作电压,供电电压范围为 1.9V~3.6V。 ◦ VSS…...
企业SSL 证书管理指南
文章从以下几个部分展开 SSL证书的用途和使用场景SSL证书的申请类型和实现方式SSL证书的管理SSL证书的续签 一、SSL 证书的用途和使用场景 1.1 为什么要使用 SSL 证书? 1. 数据安全 🛡️- 在 HTTP 传输中,TCP 包可以被截获,攻…...

Python Pandas(7):Pandas 数据清洗
数据清洗是对一些没有用的数据进行处理的过程。很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要使数据分析更加准确,就需要对这些没有用的数据进行处理。数据清洗与预处理的常见步骤: 缺失值处理:识别并…...

南京观海微电子----整流滤波电路实用
01 变压电路 通常直流稳压电源使用电源变压器来改变输入到后级电路的电压。电源变压器由初级绕组、次级绕组和铁芯组成。初级绕组用来输入电源交流电压,次级绕组输出所需要的交流电压。通俗的说,电源变压器是一种电→磁→电转换器件。即初级的交流电转化…...

【python】向Jira测试计划下,附件中增加html测试报告
【python】连接Jira获取token以及jira对象 # 往 jira 测试计划下面,上传测试结果html def put_jira_file(plain_id):# 配置连接jiraconn ConnJira()jira conn.jira_login()[2]path jira.issue(O45- plain_id)attachments_dir os.path.abspath(..) \\test_API…...

探索ChatGPT背后的前端黑科技
由于图片和格式解析问题,可前往 阅读原文 在人工智能与互联网技术飞速发展的今天,像ChatGPT这样的智能对话系统已经成为科技领域的焦点。它不仅能够进行自然流畅的对话,还能以多种格式展示内容,为用户带来高效且丰富的交互体验。然…...

Agents Go Deep 智能体深入探索
Agents Go Deep 智能体深入探索 核心事件 OpenAI发布了一款先进的智能体“深度研究”,它能借助网络搜索和推理生成研究报告。 最新进展 功能特性:该智能体依据数百个在线资源生成详细报告,目前仅支持文本输出,不过很快会增加对图…...
DeepSeek全生态接入指南:官方通道+三大云平台
DeepSeek全生态接入指南:官方通道三大云平台 一、官方资源入口 1.1 核心交互平台 🖥️ DeepSeek官网: https://chat.deepseek.com/ (体验最新对话模型能力) 二、客户端工具 OllamaChatboxCherry StudioAnythingLLM …...

c++TinML转html
cTinML转html 前言解析解释转译html类定义开头html 结果这是最终效果(部分):  前言 在python.tkinter设计标记语言(转译2-html)中提到了将Ti…...
STM32硬件SPI函数解析与示例
1. SPI 简介 SPI(Serial Peripheral Interface)即串行外设接口,是一种高速、全双工、同步的通信总线,常用于微控制器与各种外设(如传感器、存储器等)之间的通信。STM32 系列微控制器提供了多个 SPI 接口&a…...

滤波器:卡尔曼滤波
卡尔曼滤波(Kalman Filter)是一种高效的递归算法,主要用于动态系统的状态估计。它通过结合系统模型和噪声干扰的观测数据,实现对系统状态的最优估计(在最小均方误差意义下)。以下从原理、使用场景和特点三个…...

深度学习框架探秘|TensorFlow vs PyTorch:AI 框架的巅峰对决
在深度学习框架中,TensorFlow 和 PyTorch 无疑是两大明星框架。前面两篇文章我们分别介绍了 TensorFlow(点击查看) 和 PyTorch(点击查看)。它们引领着 AI 开发的潮流,吸引着无数开发者投身其中。但这两大框…...

Windows环境管理多个node版本
前言 在实际工作中,如果我们基于Windows系统开发,同时需要维护老项目,又要开发新项目,且不同项目依赖的node版本又不同时,那么就需要根据项目切换不同的版本。本文使用Node Version Manager(nvm࿰…...
opencascade 源码学习BRepBuilderAPI-BRepBuilderAPI
BRepBuilderAPI BRepBuilderAPI 是一个用于构建和操作 BRep(边界表示法,Boundary Representation)拓扑数据结构的工具类。它提供了高级接口,用于创建几何形状(如顶点、边、面、实体等)以及进行扫掠&#x…...
Vue 2 + Webpack 项目中集成 ESLint 和 Prettier
在 Vue 2 Webpack 项目中集成 ESLint 和 Prettier 可以帮助你规范代码风格并自动格式化代码。以下是详细的步骤: 1. 安装 ESLint 和 Prettier 相关依赖 在项目根目录下运行以下命令,安装 ESLint、Prettier 和相关插件: npm install --save…...

Renesas RH850 EEL库的优点
文章目录 1. 磨损均衡(Wear Leveling)2. 数据抽象与易用性3. 后台维护与自动刷新4. 多优先级操作5. ECC 错误处理与数据完整性EEL 与 FDL 的协作机制1. 分层架构2. 存储池划分3. 协作流程4. 同步与互斥5. 性能优化实际应用场景示例场景:车辆里程存储总结1. 磨损均衡(Wear L…...
torch导出ONNX模型报错:OnnxExporterError: Module onnx is not installed
问题: 使用torch 导出模型为onnx文件时报错:torch.onnx.OnnxExporterError: Module onnx is not installed! 环境: 操作系统 Win10 python运行环境 Anacoda3 torch 2.6.0 torchvision …...

LabVIEW 用户界面设计基础原则
在设计LabVIEW VI的用户界面时,前面板的外观和布局至关重要。良好的设计不仅提升用户体验,还能提升界面的易用性和可操作性。以下是设计用户界面时的一些关键要点: 1. 前面板设计原则 交互性:组合相关的输入控件和显示控件&#x…...

使用Python爬虫实时监控行业新闻案例
目录 背景环境准备请求网页数据解析网页数据定时任务综合代码使用代理IP提升稳定性运行截图与完整代码总结 在互联网时代,新闻的实时性和时效性变得尤为重要。很多行业、技术、商业等领域的新闻都可以为公司或者个人发展提供有价值的信息。如果你有一项需求是要实时…...
qt QTextEdit用法总结
1. 基本介绍 QTextEdit 是 Qt 中用于显示和编辑富文本(支持 HTML 子集)和纯文本的控件。 支持文本格式(字体、颜色、对齐)、列表、表格、图片插入等富文本功能。 底层通过 QTextDocument 管理内容,提供强大的文本处理…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
WebGL:在浏览器中解锁3D世界的魔法钥匙 引言:网页的边界正在消失 在数字化浪潮的推动下,网页早已不再是静态信息的展示窗口。如今,我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室,甚至沉浸式的V…...
Qt Quick Controls模块功能及架构
Qt Quick Controls是Qt Quick的一个附加模块,提供了一套用于构建完整用户界面的UI控件。在Qt 6.0中,这个模块经历了重大重构和改进。 一、主要功能和特点 1. 架构重构 完全重写了底层架构,与Qt Quick更紧密集成 移除了对Qt Widgets的依赖&…...