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

STM32-SPI1控制AD7705(Sigma-Delta-ADC芯片)

STM32-SPI1控制AD7705(Sigma-Delta-ADC芯片)

  • 原理图
  • 手册说明
    • 功能方框图
    • 引脚功能
  • 片内寄存器
    • 通信寄存器(RS2、RS1、RS0=0、0、0)
    • 设置寄存器
    • 时钟寄存器
    • 数据寄存器(RS2、RS1、RS0=0、1、1)
    • 测试寄存器(RS2、RS1、RS0=1、0、0);上电/复位状态:00Hex
    • 零标度校准寄存器(RS2、RS1、RS0=1、1、0);上电/复位状态:1F4000Hex
    • 满标度校准寄存器(RS2、RS1、RS0=1、1、1);上电/复位状态:5761ABHex
    • 校准过程
  • 代码部分

原理图

在这里插入图片描述
该芯片需要晶振(Y2)和参考电源电压(U3)

手册说明

AD7705与国产TM7705型号差不多,也就是可以参考国产的手册。

AD7705利用 Σ-Δ 转换技术实现了 16 位无丢失代码性能。选定的输入信号被送到一个基于模拟调制器的增益可编程专用前端。片内数字滤波器处理调制器的输出信号。通过片内控制寄存器可调节滤波器的截止点和输出更新速率,从而对数字滤波器的第一个陷波进行编程。

TM7705 是双通道全差分模拟输入,带有一个差分基准输入。当电源电压为 5V、基准电压为 2.5V 时,该器件都可将输入信号范围从 0~+20mV 到 0~+2.5V 的信号进行处理。还可处理±20mV~±2.5V 的双极性输入信号,对于 TM7705 是以 AIN(-)输入端为参考点。

功能方框图

在这里插入图片描述

引脚功能

在这里插入图片描述

在这里插入图片描述

片内寄存器

在这里插入图片描述

通信寄存器(RS2、RS1、RS0=0、0、0)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

设置寄存器

在这里插入图片描述
在这里插入图片描述

时钟寄存器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

数据寄存器(RS2、RS1、RS0=0、1、1)

在这里插入图片描述

测试寄存器(RS2、RS1、RS0=1、0、0);上电/复位状态:00Hex

在这里插入图片描述

零标度校准寄存器(RS2、RS1、RS0=1、1、0);上电/复位状态:1F4000Hex

在这里插入图片描述

满标度校准寄存器(RS2、RS1、RS0=1、1、1);上电/复位状态:5761ABHex

在这里插入图片描述

校准过程

在这里插入图片描述
在这里插入图片描述

代码部分

以STM32F103和标准库作为底板
main.c

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"#include "bsp_spi.h"#define CS_ADC_LOW()    GPIO_ResetBits(GPIOA,GPIO_Pin_4)   
#define CS_ADC_HIGH()   GPIO_SetBits(GPIOA,GPIO_Pin_4)
/************************************************ALIENTEK精英STM32开发板实验4串口 实验   技术支持:www.openedv.com淘宝店铺:http://eboard.taobao.com 关注微信公众平台微信号:"正点原子",免费获取STM32资料。广州市星翼电子科技有限公司  作者:正点原子 @ALIENTEK
************************************************/u8 num1[6];float l_ncm1;u8 num2[6];float l_ncm2;//写数据
void AD7705_WriteByte(u8 Dst_Addr)   
{   CS_ADC_LOW();//使能器件  delay_us(20);Spi1_readwritebyte(Dst_Addr);delay_us(100);CS_ADC_HIGH();//使能器件  
}
/********AD7705初始化函数***********/void Init_AD7705(u8 chnanel)
{u8 i;for(i=0;i<150;i++)/* 多于连续32个 DIN=1 使串口复位 */{AD7705_WriteByte(0xff);//持续DIN高电平写操作,恢复AD7705接口}  delay_ms(1);switch(chnanel){case 1:AD7705_WriteByte(0x20); /* 写时钟寄存器选中ch1*/AD7705_WriteByte(0x0C); /* 4.9152MHz时钟,250Hz数据更新速率 */AD7705_WriteByte(0x10); /*选择设置寄存器,使用chnanel 1*/AD7705_WriteByte(0x47); //写设置寄存器 ,设置成双极性、无缓冲、增益为2、滤波器工作、自校准break;/*有更改,时钟寄存器设为0x0a,4.9152MHz时钟,500Hz数据更新速率,*/case 2:AD7705_WriteByte(0x21); /* 写时钟寄存器选中ch2 */AD7705_WriteByte(0x0f); /* 4.9152MHz时钟,500Hz数据更新速率 */AD7705_WriteByte(0x11); /*选择设置寄存器,使用chnane 2*/AD7705_WriteByte(0x46); //写设置寄存器,设置成双极性、无缓冲、增益为2、滤波器工作、自校准break;default:       break;}
}/* 读AD7705转换数据 输入通道channel */
u16 GetData7705_CH1(void)
{u16 temp1 = 0;u16 DataL = 0;u16 DataH = 0;Init_AD7705(1);                        //初始化通道1delay_ms(1);AD7705_WriteByte(0x39);   //选中CH1数据寄存器读  while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2==0)){}//待数据准备好AdDrdy=0  CS_ADC_LOW(); //使能器件  delay_us(20);DataH = Spi1_readwritebyte(0xff);DataL = Spi1_readwritebyte(0xff);delay_us(100);CS_ADC_HIGH();   //取消片选        DataH = DataH << 8;temp1  =  DataH | DataL;return temp1;
}/* 读AD7705转换数据 输入通道channel */
u16 GetData7705_CH2(void)
{u16 temp2 = 0;u16 DataL = 0;u16 DataH = 0;Init_AD7705(2);                //初始化通道2delay_ms(1);AD7705_WriteByte(0x38);   //选中CH2数据寄存器读  while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2==0));  //待数据准备好AdDrdy=0  CS_ADC_LOW(); //使能器件  delay_us(20);DataH = Spi1_readwritebyte(0xff);DataL = Spi1_readwritebyte(0xff);delay_us(100);CS_ADC_HIGH();   //取消片选        DataH = DataH << 8;temp2  =  DataH | DataL;return temp2;
}
//数据处理void ADC_7705(void)
{        u16 RCH1_16bit,RCH2_16bit;              RCH1_16bit = GetData7705_CH1();								l_ncm1  = (float)(RCH1_16bit*(2.5/65535)); //算出通道1电压RCH2_16bit = GetData7705_CH2();l_ncm2  = (float)(RCH2_16bit*(2.5/65535)); //算出通道2电压//			 num1[0]    = l_ncm1/10000+'0';
//			 num1[2]    = (l_ncm1%10000)/1000+'0';
//			 num1[3]    = (l_ncm1%1000)/100+'0';
//			 num1[4]    = (l_ncm1%100)/10+'0';
//			 num1[5]    = l_ncm1%10+'0';//			num2[0]    = l_ncm2/10000+'0';
//			num2[2]    = (l_ncm2%10000)/1000+'0';
//			num2[3]    = (l_ncm2%1000)/100+'0';
//			num2[4]    = (l_ncm2%100)/10+'0';
//			num2[5]    = l_ncm2%10+'0';printf("buff1:%f\n",l_ncm1);printf("buff2:%f\n",l_ncm2);if(l_ncm2>8500|l_ncm2<8200){delay_ms(10);l_ncm2=0;}else{}}int main(void){		delay_init();	    	 //延时函数初始化	  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(115200);	 //串口初始化为115200LED_Init();			     //LED端口初始化KEY_Init();          //初始化与按键连接的硬件接口Spi1_init();				 //SPI 初始化GPIO_SetBits(GPIOA,GPIO_Pin_0);Init_AD7705(1);delay_ms(250);Init_AD7705(2);while(1){
//		Spi1_readwritebyte(0xAA);
//		printf("buff1:%X\n",GetData7705_CH1());
//		delay_ms(100);
//		printf("buff2:%X\n",GetData7705_CH2());ADC_7705();		delay_ms(250);}	 }

bsp_spi.c

#include "bsp_spi.h"/*** 函数功能: SPI 读写一个字节* 输入参数: 要写入的字节* 返 回 值: 读取到的字节* 说    明:无*/
void Spi1_init(void)
{GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef  SPI_InitStructure;/* 使能GPIO和SPI时钟 */RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOA, ENABLE );//PORTB时钟使能 RCC_APB2PeriphClockCmd(	RCC_APB2Periph_SPI1,  ENABLE );//SPI2时钟使能 	/* 配置SPI功能引脚:SCK 时钟引脚 */	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  			 //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);         				 //初始化GPIO/* 配置SPI功能引脚:MISO 主机输出从机输入引脚 */	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_Init(GPIOA, &GPIO_InitStructure);/* 配置SPI功能引脚:MOSI 主机输入从机输出引脚 */	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_Init(GPIOA, &GPIO_InitStructure);/* SPI外设配置 --NSS 引脚由软件控制以及 MSB 先行模式*/SPI_Cmd(SPI1, DISABLE); //失能能SPI外设SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //设置SPI工作模式:设置为主SPISPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //设置SPI的数据大小:SPI发送接收8位帧结构SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //选择了串行时钟的稳态:时钟悬空高SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //数据捕获于第二个时钟SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //定义波特率预分频的值:波特率预分频值为256SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器/* 配置SPI功能引脚:CS 串行Flash片选引脚 */	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  			 //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/* 配置SPI所用的引脚:默认高电平 */	GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);SPI_Cmd(SPI1, ENABLE); //使能SPI外设/* RES */	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  			 //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);         				 //初始化GPIO
/* CS */	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  			 //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);         				 //初始化GPIO
/* DRDY */	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  			 //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);         				 //初始化GPIOGPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_4|GPIO_Pin_2);
}/*** 函数功能: SPI 速度设置函数* 输入参数: SPI_BaudRatePrescaler_2   2分频 SPI_BaudRatePrescaler_8   8分频 SPI_BaudRatePrescaler_16  16分频  SPI_BaudRatePrescaler_256 256分频 * 返 回 值: 无* 说    明:*/ 
void Spi1_SetSpeed(u8 Spi_baudrateprescaler)
{assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));SPI1->CR1&=0XFFC7;SPI1->CR1|=Spi_baudrateprescaler;	//设置SPI1速度 SPI_Cmd(SPI1,ENABLE); 
} /*** 函数功能: SPI 读写一个字节* 输入参数: 要写入的字节* 返 回 值: 读取到的字节* 说    明:无*/
u8 Spi1_readwritebyte(u8 Txdata)
{		u8 retry=0;				 	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位{retry++;if(retry>200)return 0;}			  SPI_I2S_SendData(SPI1, Txdata); //通过外设SPIx发送一个数据retry=0;while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位{retry++;if(retry>200)return 0;}return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据					    
}

相关文章:

STM32-SPI1控制AD7705(Sigma-Delta-ADC芯片)

STM32-SPI1控制AD7705&#xff08;Sigma-Delta-ADC芯片&#xff09; 原理图手册说明功能方框图引脚功能 片内寄存器通信寄存器&#xff08;RS2、RS1、RS00、0、0&#xff09;设置寄存器时钟寄存器数据寄存器&#xff08;RS2、RS1、RS00、1、1&#xff09;测试寄存器&#xff08…...

13年老鸟总结,性能测试方法汇总+性能响应很慢排查方法(详全)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、性能测试包含哪…...

[网络] 3. HTTP 3 与 HTTP 2 有什么区别

协议不同 HTTP2 是基于 TCP 协议实现的 HTTP3 是基于 UDP 协议实现的QUIC HTTP3 新增了 QUIC 协议来实现可靠性的传输握手次数 HTTP2 是基于 HTTPS 实现的&#xff0c;建立连接需要先进行 TCP 3次握手&#xff0c;然后再进行 TLS 3次握手&#xff0c;总共6次握手。 HTTP3 只需要…...

IDEA中的Postman?完全免费!

Postman是大家最常用的API调试工具&#xff0c;那么有没有一种方法可以不用手动写入接口到Postman&#xff0c;即可进行接口调试操作&#xff1f;今天给大家推荐一款IDEA插件&#xff1a;Apipost Helper&#xff0c;写完代码就可以调试接口并一键生成接口文档&#xff01;而且还…...

用JAVA编程解决数位和相等问题

如果一个正整数转化成二进制与转换成八进制后所有数位的数字之和相等&#xff0c;则称为数位和相等的数。   前几个数位和相等的正整数为 1, 8, 9, 64, ……   请问第 23 个数位和相等的正整数是多少&#xff1f;用JAVA编程解决 可以通过编程计算第 23 个数位和相等的正整…...

Kotlin学习——kt中的类,数据类 枚举类 密封类,以及对象

Kotlin 是一门现代但已成熟的编程语言&#xff0c;旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作&#xff0c;并提供了多种方式在多个平台间复用代码&#xff0c;以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…...

XUbuntu22.04之解决gpg keyserver receive failed no data(一百九十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…...

Hibernate 脏检查和刷新缓存机制

刷新缓存: Session是Hibernate向应用程序提供的操作数据库的主要接口,它提供了基本的保存,更新,删除和加载java对象的方法,Session具有一个缓存,可以管理和追踪所有持久化对象,对象和数据库中的相关记录对应,在某些时间点,Session会根据缓存中对象的变化来执行相关SQL语句,将对…...

蓝桥杯每日一题2023.11.25

题目描述 “蓝桥杯”练习系统 (lanqiao.cn) 题目分析 对于此题目最开始是递归想法&#xff0c;但发现题意中的匹配次数实际上是指在这8个字母中这8个字母每个字母对应的个数是否相同&#xff0c;如果相同则匹配。 此处我们可以使用subsrtr函数&#xff0c;每次循环截取8个字…...

深度学习第3天:CNN卷积神经网络

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 ​ 文章目录 介绍 CNN的主要结构 卷积层 激励层 池化层 Kears搭建CNN 搭建代码 直观感受卷积的作用 结语 介绍 卷积神经网络&#xff08;Convol…...

# Panda3d 碰撞检测系统介绍

Panda3d 碰撞检测系统介绍 文章目录 Panda3d 碰撞检测系统介绍碰撞几何体的介绍碰撞球体碰撞胶囊反碰撞球体碰撞平面碰撞多边形碰撞射线碰撞直线碰撞段碰撞抛物线碰撞长方体碰撞系统图碰撞处理器碰撞处理器队列碰撞处理器事件碰撞处理器回退模型(CollisionHandlerPusher)物理…...

leetcode面试经典150题——31 无重复字符的最长子串(方法二极简代码!!!)

题目&#xff1a; 无重复字符的最长子串 描述&#xff1a; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为 3。 leetcode链接 方法…...

Kafka(一):在WSL单机搭建Kafka伪集群

目录 1 运行Kafka单实例1.1 Windws1.1.1 安装包下载1.1.2 修改环境变量1.1.3 修改配置文件1.1.4 启动Kafka单机版 1.2 Linux1.2.1 安装包下载1.2.2 创建目录1.2.3 添加环境变量1.2.4 修改配置文件1.2.5 运行Kafka1.2.6 停止Kafka 2 搭建Kafka集群2.1 搭建Zookeeper集群2.2 搭建…...

mysql1124实验七索引管理

实验任务七 索引管理实验任务书 1. 实验目的 掌握在MySQL中使用MySQL Workbench或者SQL语句创建和使用索引的方法&#xff08;以SQL命令为重点&#xff09;。 掌握在MySQL中使用MySQL Workbench或者SQL语句查看和删除索引的方法&#xff08;以SQL命令为重点&#xff09;。 …...

[带余除法寻找公共节点]二叉树

二叉树 题目描述 如上图所示&#xff0c;由正整数1, 2, 3, ...组成了一棵无限大的二叉树。从某一个结点到根结点&#xff08;编号是1的结点&#xff09;都有一条唯一的路径&#xff0c;比如从10到根结点的路径是(10, 5, 2, 1)&#xff0c;从4到根结点的路径是(4, 2, 1)&#x…...

详解Rust编程中的生命周期

1.摘要 生命周期在Rust编程中是一个重要概念, 它能确保引用像预期的那样一直有效。在Rust语言中, 每一个引用都有其生命周期, 通俗讲就是每个引用在程序执行的过程中都有其自身的作用域, 一旦离开其作用域, 其生命周期也宣告结束, 值不再有效。幸运的是, 在绝大多数时间里, 生…...

【实践】Deployer 发布到search head : local OR default

1: 背景: search head deployer 上的 /opt/splunk/etc/schcluster/apps 下面的local, 还有default 派发到 search head 到app 下面是怎么工作的,这个过程,实践了一下: 参考Use the deployer to distribute apps and configuration updates - Splunk Documentation 2: 实…...

U盘报错无法访问文件或目录损坏且无法读取的解决办法

使用电脑打开U盘的部分文件时提示无法访问&#xff0c;文件或目录损坏且无法读取 报错内容如下图&#xff1a; 因为我这个U盘是那种双接口的 Type-C和USB&#xff0c;前段时间被我摔了一下 看网上说这种双接口的U盘USB接口容易坏掉 尝试在手机上使用OTG打开&#xff0c;先测试…...

【MySQL】数据库基础操作

&#x1f451;专栏内容&#xff1a;MySQL⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、数据库操作1、创建数据库2、查看所有数据库3、选定指定数据库4、删除数据库 二、数据表操作1、创建数据表2、查看所有表3、…...

2023年微软开源八个人工智能项目

自2001年软件巨头微软前首席执行官史蒂夫鲍尔默对开源&#xff08;尤其是Linux&#xff09;发表尖刻言论以来&#xff0c;微软正在开源方面取得了长足的进步。继ChatGPT于去年年底发布了后&#xff0c;微软的整个2023年&#xff0c;大多数技术都是面向开发人员和研究人员公开发…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中&#xff0c;合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式&#xff1a;工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...

CppCon 2015 学习:Time Programming Fundamentals

Civil Time 公历时间 特点&#xff1a; 共 6 个字段&#xff1a; Year&#xff08;年&#xff09;Month&#xff08;月&#xff09;Day&#xff08;日&#xff09;Hour&#xff08;小时&#xff09;Minute&#xff08;分钟&#xff09;Second&#xff08;秒&#xff09; 表示…...