TM7707 评估前做的功课

news2024/11/25 10:39:30

目录

硬件

模拟输入范围

转换速度与有效位数

数字电平匹配

建立时间

基准电压

软件

寄存器


硬件

        MCU 3.3V 平台;

        ADC mclk 2.4576mhz

模拟输入范围

在非缓冲模式下,共模输入范围是从 GND V DD 。模拟输入电压的绝对值处在
GND-30mV V DD +30mV 之间。
在缓冲模式下,模拟输入端能处理更大的电
源阻抗,但绝对输入电压范围被限制在 GND+50 mV V DD +30mV 之间。

转换速度与有效位数

        3.3V

        约13位有效位数@500Hz

        5.0V 

        13位有效位数@500Hz

       

数字电平匹配

        这里主要看MCU3.3V,ADC5V情况的适配情况

        MCLK如果是外部提供一定要注意电平

         3.3V端接受5V端电平,可以接个分压电阻。

         5V端接受3.3V电平,可以直连。

 

建立时间

这里主要讲2个通道切换时,需要建立的时间。

在TM7707的数据手册上我并没有直接找到直接描述建立时间。下面是在ADI的一篇文档中的描写

01 (analog.com)

 简单理解成切换通道需要的建立时间是3个转换周期吧。

基准电压

 

软件

寄存器

这里重点讲下面这个寄存器,在看到这个手册时,我以为TM7707没有时钟分频,外部时钟最大2.

5mhz.FS111~8 也没有介绍真奇怪。

但是在一些帖子上看到别人使用TM7707 这部分的配置按照TM7705可以正常工作,我又找到了AD7707,结合网友的实测,应该可以得出一些结论了。

TM7707

 

AD7707

 

 安富莱的驱动代码(这里需要注意FS_500HZ = 0x04, 是错误的按照数据手册 正确的是FS_500HZ = 0x03

tm7705.h

#ifndef __TM7705_H
#define __TM7705_H

#include "main.h"



#define TM_CS_H HAL_GPIO_WritePin(GPIOG,GPIO_PIN_7,1);
#define TM_CS_L HAL_GPIO_WritePin(GPIOG,GPIO_PIN_7,0);
#define TM_RST_H HAL_GPIO_WritePin(GPIOG,GPIO_PIN_6,1);
#define TM_RST_L HAL_GPIO_WritePin(GPIOG,GPIO_PIN_6,0);


void InitTM7705(void);
void TM7705_CalibSelf(uint8_t _ch);
void TM7705_SytemCalibZero(uint8_t _ch);
void TM7705_SytemCalibFull(uint8_t _ch);
uint16_t TM7705_ReadAdc(uint8_t _ch);


#endif



tm7705.c 

#include "tm7705.h"
#include "main.h"

/***********************以下为TM7705的标准库*****************************/
/************************************************************************/



/* 通道1和通道2的增益,输入缓冲,极性 */
#define __CH1_GAIN_BIPOLAR_BUF	(GAIN_1 | UNIPOLAR | BUF_NO)
#define __CH2_GAIN_BIPOLAR_BUF	(GAIN_1 | UNIPOLAR | BUF_NO)

/*
	TM7705模块可以直接插到STM32-V5开发板nRF24L01模块的排母接口上。

    TM7705模块   STM32F407开发板
      SCK   ------  PB3/SPI3_SCK
      DOUT  ------  PB4/SPI3_MISO
      DIN   ------  PB5/SPI3_MOSI
      CS    ------  PF7/NRF24L01_CSN
      DRDY  ------  PH7/NRF24L01_IRQ
      RST   ------  PA4/NRF905_TX_EN/NRF24L01_CE/DAC1_OUT	(复位 RESET)
*/




/* 通信寄存器bit定义 */
enum
{
	/* 寄存器选择  RS2 RS1 RS0  */
	REG_COMM	= 0x00,	/* 通信寄存器 */
	REG_SETUP	= 0x10,	/* 设置寄存器 */
	REG_CLOCK	= 0x20,	/* 时钟寄存器 */
	REG_DATA	= 0x30,	/* 数据寄存器 */
	REG_ZERO_CH1	= 0x60,	/* CH1 偏移寄存器 */
	REG_FULL_CH1	= 0x70,	/* CH1 满量程寄存器 */
	REG_ZERO_CH2	= 0x61,	/* CH2 偏移寄存器 */
	REG_FULL_CH2	= 0x71,	/* CH2 满量程寄存器 */

	/* 读写操作 */
	WRITE 		= 0x00,	/* 写操作 */
	READ 		= 0x08,	/* 读操作 */

	/* 通道 */
	CH_1		= 0,	/* AIN1+  AIN1- */
	CH_2		= 1,	/* AIN2+  AIN2- */
	CH_3		= 2,	/* AIN1-  AIN1- */
	CH_4		= 3		/* AIN1-  AIN2- */
};

/* 设置寄存器bit定义 */
enum
{
	MD_NORMAL		= (0 << 6),	/* 正常模式 */
	MD_CAL_SELF		= (1 << 6),	/* 自校准模式 */
	MD_CAL_ZERO		= (2 << 6),	/* 校准0刻度模式 */
	MD_CAL_FULL		= (3 << 6),	/* 校准满刻度模式 */

	GAIN_1			= (0 << 3),	/* 增益 */
	GAIN_2			= (1 << 3),	/* 增益 */
	GAIN_4			= (2 << 3),	/* 增益 */
	GAIN_8			= (3 << 3),	/* 增益 */
	GAIN_16			= (4 << 3),	/* 增益 */
	GAIN_32			= (5 << 3),	/* 增益 */
	GAIN_64			= (6 << 3),	/* 增益 */
	GAIN_128		= (7 << 3),	/* 增益 */

	/* 无论双极性还是单极性都不改变任何输入信号的状态,它只改变输出数据的代码和转换函数上的校准点 */
	BIPOLAR			= (0 << 2),	/* 双极性输入 */
	UNIPOLAR		= (1 << 2),	/* 单极性输入 */

	BUF_NO			= (0 << 1),	/* 输入无缓冲(内部缓冲器不启用) */
	BUF_EN			= (1 << 1),	/* 输入有缓冲 (启用内部缓冲器) */

	FSYNC_0			= 0,
	FSYNC_1			= 1		/* 不启用 */
};

/* 时钟寄存器bit定义 */
enum
{
	CLKDIS_0	= 0x00,		/* 时钟输出使能 (当外接晶振时,必须使能才能振荡) */
	CLKDIS_1	= 0x10,		/* 时钟禁止 (当外部提供时钟时,设置该位可以禁止MCK_OUT引脚输出时钟以省电 */

	/*
		2.4576MHz(CLKDIV=0 )或为 4.9152MHz (CLKDIV=1 ),CLK 应置 “0”。
		1MHz (CLKDIV=0 )或 2MHz   (CLKDIV=1 ),CLK 该位应置  “1”
	*/
	CLK_4_9152M = 0x08,
	CLK_2_4576M = 0x00,
	CLK_1M 		= 0x04,
	CLK_2M 		= 0x0C,

	FS_50HZ		= 0x00,
	FS_60HZ		= 0x01,
	FS_250HZ	= 0x02,
	FS_500HZ	= 0x03,

	/*
		四十九、电子秤应用中提高TM7705 精度的方法
			当使用主时钟为 2.4576MHz 时,强烈建议将时钟寄存器设为 84H,此时数据输出更新率为10Hz,即每0.1S 输出一个新数据。
			当使用主时钟为 1MHz 时,强烈建议将时钟寄存器设为80H, 此时数据输出更新率为4Hz, 即每0.25S 输出一个新数据
	*/
	ZERO_0		= 0x00,
	ZERO_1		= 0x80
};

static void TM7705_SyncSPI(void);



static void TM7705_WriteByte(uint8_t _data);

static void TM7705_Write3Byte(uint32_t _data);
static uint8_t TM7705_ReadByte(void);
static uint16_t TM7705_Read2Byte(void);
static uint32_t TM7705_Read3Byte(void);
static void TM7705_WaitDRDY(void);
static void TM7705_ResetHard(void);
static void TM7705_Delay(void);

//SPIx 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
uint8_t SPI1_ReadWriteByte(uint8_t TxData)
{		
		    uint8_t Rxdata;
    while(HAL_SPI_TransmitReceive(&hspi2,&TxData,&Rxdata,1, 1000)!=HAL_OK)
		{
			HAL_Delay(1);
		}    
    return Rxdata;   
	
	

				    
}

//写入1个字节。带CS控制
static void TM7705_WriteByte(uint8_t _data)
{

TM_CS_L;	
	SPI1_ReadWriteByte(_data);
TM_CS_H;
}

/***********************以下为TM7705的移植函数***************************/
/************************************************************************/
void InitTM7705(void)
{
 int k=0;

TM7705_ResetHard();//rest
	
	TM7705_WriteByte(REG_CLOCK | WRITE | CH_1);			/* 先写通信寄存器,下一步是写时钟寄存器 */

	TM7705_WriteByte(CLKDIS_0 | CLK_4_9152M | FS_50HZ);	/* 刷新速率50Hz */


}

//硬件复位TM7705
static void TM7705_ResetHard(void)
{
TM_RST_H;
	HAL_Delay(1);
TM_RST_L;
	HAL_Delay(2);
TM_RST_H;
	HAL_Delay(1);
}

//同步TM7705芯片SPI接口时序
static void TM7705_SyncSPI(void)
{
	/* AD7705串行接口失步后将其复位。复位后要延时500us再访问 */
TM_CS_L;
	SPI1_ReadWriteByte(0xFF);
	SPI1_ReadWriteByte(0xFF);
	SPI1_ReadWriteByte(0xFF);
	SPI1_ReadWriteByte(0xFF);	

TM_CS_H;
}


//写入3个字节。带CS控制
static void TM7705_Write3Byte(uint32_t _data)
{
TM_CS_L;
	SPI1_ReadWriteByte((_data >> 16) & 0xFF);
	SPI1_ReadWriteByte((_data >> 8) & 0xFF);
	SPI1_ReadWriteByte(_data);
TM_CS_H;
}

//从AD芯片读取一个字(16位)
static uint8_t TM7705_ReadByte(void)
{
	uint8_t read;
TM_CS_L;
read = SPI1_ReadWriteByte(0xff);

	TM_CS_H;
	return read;
}

//读2字节数据
static uint16_t TM7705_Read2Byte(void)
{
	uint16_t read=0;

TM_CS_L;
	read = SPI1_ReadWriteByte(0xff);
	read <<= 8;
	read += SPI1_ReadWriteByte(0xff);
	TM_CS_H;

	return read;
}


//读3字节数据
static uint32_t TM7705_Read3Byte(void)
{
	uint32_t read;

//	CS_0();
//	read = TM7705_Recive8Bit();
//	read <<= 8;
//	read += TM7705_Recive8Bit();
//	read <<= 8;
//	read += TM7705_Recive8Bit();
//	CS_1();
	return read;
}

//等待内部操作完成。 自校准时间较长,需要等待。
static void TM7705_WaitDRDY(void)
{
	uint32_t i;

	for (i = 0; i < 1000; i++)
	{
		HAL_Delay(1);
		if (0==HAL_GPIO_ReadPin(GPIOG,GPIO_PIN_8))
		{
			break;
		}
	}
	if (i >= 1000)
	{
		printf("TM7705_WaitDRDY() Time Out ...\r\n");		/* 调试语句. 用语排错 */
	}
}

//写指定的寄存器,_RegID : 寄存器ID,寄存器值。 对于8位的寄存器,取32位形参的低8bit
void TM7705_WriteReg(uint8_t _RegID, uint32_t _RegValue)
{
	uint8_t bits;

	switch (_RegID)
	{
		case REG_COMM:		/* 通信寄存器 */		
		case REG_SETUP:		/* 设置寄存器 8bit */
		case REG_CLOCK:		/* 时钟寄存器 8bit */
			bits = 8;
			break;

		case REG_ZERO_CH1:	/* CH1 偏移寄存器 24bit */
		case REG_FULL_CH1:	/* CH1 满量程寄存器 24bit */
		case REG_ZERO_CH2:	/* CH2 偏移寄存器 24bit */
		case REG_FULL_CH2:	/* CH2 满量程寄存器 24bit*/
			bits = 24;
			break;

		case REG_DATA:		/* 数据寄存器 16bit */
		default:
			return;
	}

	TM7705_WriteByte(_RegID | WRITE);	/* 写通信寄存器, 指定下一步是写操作,并指定写哪个寄存器 */

	if (bits == 8)
	{
		TM7705_WriteByte((uint8_t)_RegValue);
	}
	else	/* 24bit */
	{
		TM7705_Write3Byte(_RegValue);
	}
}

//读指定的寄存器,_RegID : 寄存器ID,寄存器值。 对于8位的寄存器,取32位形参的低8bit
uint32_t TM7705_ReadReg(uint8_t _RegID)
{
	uint8_t bits;
	uint32_t read;

	switch (_RegID)
	{
		case REG_COMM:		/* 通信寄存器 */
		case REG_SETUP:		/* 设置寄存器 8bit */
		case REG_CLOCK:		/* 时钟寄存器 8bit */
			bits = 8;
			break;

		case REG_ZERO_CH1:	/* CH1 偏移寄存器 24bit */
		case REG_FULL_CH1:	/* CH1 满量程寄存器 24bit */
		case REG_ZERO_CH2:	/* CH2 偏移寄存器 24bit */
		case REG_FULL_CH2:	/* CH2 满量程寄存器 24bit*/
			bits = 24;
			break;

		case REG_DATA:		/* 数据寄存器 16bit */
		default:
			return 0xFFFFFFFF;
	}

	TM7705_WriteByte(_RegID | READ);	/* 读通信寄存器, 指定下一步是读操作,并指定写哪个寄存器 */

	if (bits == 16)
	{
		read = TM7705_Read2Byte();
	}
	else if (bits == 8)
	{
		read = TM7705_ReadByte();
	}
	else	/* 24bit */
	{
		read = TM7705_Read3Byte();
	}
	return read;
}

//启动自校准. 内部自动短接AIN+ AIN-校准0位,内部短接到Vref 校准满位。此函数执行过程较长,实测约 180ms
void TM7705_CalibSelf(uint8_t _ch)
{
	if (_ch == 1)
	{
		
		/* 自校准CH1 */
		TM7705_WriteByte(REG_SETUP | WRITE | CH_1);	/* 写通信寄存器,下一步是写设置寄存器,通道1 */		
		TM7705_WriteByte(MD_CAL_SELF | __CH1_GAIN_BIPOLAR_BUF | FSYNC_0);/* 启动自校准 */
		TM7705_WaitDRDY();	/* 等待内部操作完成 --- 时间较长,约180ms */
	}
	else if (_ch == 2)
	{
		
		/* 自校准CH2 */
		TM7705_WriteByte(REG_SETUP | WRITE | CH_2);	/* 写通信寄存器,下一步是写设置寄存器,通道2 */
		TM7705_WriteByte(MD_CAL_SELF | __CH2_GAIN_BIPOLAR_BUF | FSYNC_0);	/* 启动自校准 */
		TM7705_WaitDRDY();	/* 等待内部操作完成  --- 时间较长,约180ms */
	}
	
}

//启动系统校准零位. 请将AIN+ AIN-短接后,执行该函数。校准应该由主程序控制并保存校准参数。
void TM7705_SytemCalibZero(uint8_t _ch)
{
	if (_ch == 1)
	{
		TM7705_WaitDRDY();	/* 等待内部操作完成 */
		/* 校准CH1 */
		TM7705_WriteByte(REG_SETUP | WRITE | CH_1);	/* 写通信寄存器,下一步是写设置寄存器,通道1 */
		TM7705_WriteByte(MD_CAL_ZERO | __CH1_GAIN_BIPOLAR_BUF | FSYNC_0);/* 启动自校准 */
		
	}
	else if (_ch == 2)
	{
		
		TM7705_WaitDRDY();	/* 等待内部操作完成 */
		/* 校准CH2 */
		TM7705_WriteByte(REG_SETUP | WRITE | CH_2);	/* 写通信寄存器,下一步是写设置寄存器,通道1 */
		TM7705_WriteByte(MD_CAL_ZERO | __CH2_GAIN_BIPOLAR_BUF | FSYNC_0);	/* 启动自校准 */
		
	}
}

//启动系统校准满位. 请将AIN+ AIN-接最大输入电压源,执行该函数。校准应该由主程序控制并保存校准参数
//执行完毕后。可以通过 TM7705_ReadReg(REG_FULL_CH1) 和  TM7705_ReadReg(REG_FULL_CH2) 读取校准参数。
void TM7705_SytemCalibFull(uint8_t _ch)
{
	if (_ch == 1)
	{
		TM7705_WaitDRDY();	/* 等待内部操作完成 */
		/* 校准CH1 */
		TM7705_WriteByte(REG_SETUP | WRITE | CH_1);	/* 写通信寄存器,下一步是写设置寄存器,通道1 */
		TM7705_WriteByte(MD_CAL_FULL | __CH1_GAIN_BIPOLAR_BUF | FSYNC_0);/* 启动自校准 */
		
	}
	else if (_ch == 2)
	{
		
		TM7705_WaitDRDY();	/* 等待内部操作完成 */
		/* 校准CH2 */
		TM7705_WriteByte(REG_SETUP | WRITE | CH_2);	/* 写通信寄存器,下一步是写设置寄存器,通道1 */
		TM7705_WriteByte(MD_CAL_FULL | __CH2_GAIN_BIPOLAR_BUF | FSYNC_0);	/* 启动自校准 */
		
	}
}

//读通道1或2的ADC数据
uint16_t TM7705_ReadAdc(uint8_t _ch)
{
	uint16_t read = 0,i=0;

	/* 为了避免通道切换造成读数失效,读2次 */

		for(i=0;i<2;i++)
			{

		if (_ch == 1)
		{
			TM7705_WaitDRDY();		/* 等待DRDY口线为0 */		
			TM7705_WriteByte(0x38);
			read = TM7705_Read2Byte();
		}
		else if (_ch == 2)
		{
			TM7705_WaitDRDY();	
			TM7705_WriteByte(0x39);
			read = TM7705_Read2Byte();
		}
	
	}
	return read;	
}

//CLK之间的延迟,时序延迟. 用于STM32F407  168M主频  改为STM32F103ZET6主频变为72M延时数相应减少
static void TM7705_Delay(void)
{
	uint16_t i;
	for (i = 0; i < 3; i++);
}

main.c

	InitTM7705();                //FS_50HZ
	TM7705_CalibSelf(1);		/* 自校准。执行时间较长,约180ms */	
	adc1 = TM7705_ReadAdc(1);		

	TM7705_CalibSelf(2);		/* 自校准。执行时间较长,约180ms */
	adc2 = TM7705_ReadAdc(2);	
	printf("初始化TM7705 OK! adc1=%d adc2=%d\r\n",adc1,adc2);

 while (1)
  {


        /* 双通道切换采样,执行一轮实际那约 160ms */	
    	adc1 = TM7705_ReadAdc(1);	/* 执行时间 80ms */			
		adc2 = TM7705_ReadAdc(2);	/* 执行时间 80ms */
		
  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/587834.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP不停机做client copy ,把800数据覆盖到600,导致在600很多单据创建不出来

不停机做client copy &#xff0c;把800数据覆盖到600&#xff0c;但是因为没有停机&#xff0c;导致在800还在产生单据&#xff0c;以至于600的 number range 不对&#xff0c;很多单据都能保存成功但是查寻不到 涉及到的单据&#xff08;包括但不限于&#xff09; 采购订单 生…

GPT-4 太贵?试试这 6 个免费且优秀的替代方案

大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 目录 AutoGPT - 直接从您的浏览器使用 Bard - Google AI 的免费工具。 Bing - New Bing 已经支持GPT-4&#xff0c; Claude - Anthropic对标ChatGPT Hugging…

适合每个人的热门CSS工具

本文首发于微信公众号&#xff1a;大迁世界, 我的微信&#xff1a;qq449245884&#xff0c;我会第一时间和你分享前端行业趋势&#xff0c;学习途径等等。 更多开源作品请看 GitHub https://github.com/qq449245884/xiaozhi &#xff0c;包含一线大厂面试完整考点、资料以及我的…

Jenkins+Gogs自动远程Docker环境部署django项目

1.Jenkins安装或确认必要插件 jenkins安装或确认必要插件gitlab、Publish Over SSH。 Dashboard--Manage Jenkins--Plugin Manager 2.Publish Over SSH配置 jenkins配置SSH连接django服务部署的对象服务器 Dashboard--Manage Jenkins--Configure System&#xff0c;找到 Publ…

LIS和LIMS有什么区别?

术语“实验室信息系统”&#xff08;LIS&#xff09;和“实验室信息管理系统”&#xff08;LIMS&#xff09;经常会引起混淆&#xff0c;并且倾向于互换使用这些术语。通常&#xff0c;术语“ LIS”是指用于管理医院或医疗环境中的临床诊断测试的系统。另一方面&#xff0c;LIM…

基于C#的串口扫描枪通信实战

今天搞大事&#xff0c;观众们动起来&#xff0c;搞事的目的是 掌握串口通信及winform开发技术 硬件设备&#xff1a;1、串口激光扫描枪&#xff0c;注意是串口&#xff0c;不是USB口 2、USB转串口的连接线一根&#xff0c;如图连接所示 3、USB扩展器一个&#xff0c;如果你电…

图片优化: CssSprites与Base64编码

文章目录 1 css sprites1.1 CSS Sprites是什么1.2 为什么需要css sprites1.3 优势1.4 使用原理 2 图片Base64编码 1 css sprites 1.1 CSS Sprites是什么 CSS Sprites是一种网页图片应用处理方式。 又被解释为&#xff1a; CSS精灵CSS图像拼合CSS贴图定位CSS图片精灵CSS雪碧图…

快六一啦,学习CSS3实现一个冰淇淋动画特效

快六一啦&#xff0c;小时候顶多吃个小冰棍&#xff0c;或者是那种小冰袋&#xff0c;现在的小朋友真是好&#xff0c;动不动就能吃到冰淇淋&#xff0c;今天用CSS3实现一个冰淇淋的动画特效吧 目录 实现思路 桶身的实现 冰淇淋身体的实现 五彩颗粒的实现 HTML源码 CSS3源…

17 张程序员专属壁纸推荐

1、三思后再写代码&#xff01;&#xff01;&#xff01; 2、从世界上搜索喜欢你的人&#xff01;&#xff01;&#xff01; 3、代码没写完&#xff0c;哪里有脸睡觉&#xff01;&#xff01;&#xff01; 4、程序员的 Home 键&#xff01;&#xff01;&#xff01; 5、编程是…

【完整项目开发】Springboot+vue教学材料管理系统定制开发

Springbootvue 的专业建建设材料管理系统。 **大家好&#xff0c;今天分享最近做的一套系统。**起因源于小伙伴的需求 文末有的获取方式&#xff0c;如需定制系统&#xff0c;需求发来&#xff0c;我为你分忧&#xff0c;搞起 一、 项目介绍 基于各个专业&#xff0c;对教…

代码随想录算法训练营day56 | 583. 两个字符串的删除操作,72. 编辑距离,编辑距离总结篇

代码随想录算法训练营day56 | 583. 两个字符串的删除操作&#xff0c;72. 编辑距离&#xff0c;编辑距离总结篇 583. 两个字符串的删除操作解法一&#xff1a;动态规划解法二&#xff1a;计算最长公共子序列&#xff0c;然后用数组长度减掉子序列长度 72. 编辑距离解法一&#…

界面组件DevExpress ASP.NET Core v22.2 - UI组件升级

DevExpress ASP.NET Core Controls使用强大的混合方法&#xff0c;结合现代企业Web开发工具所期望的所有功能。该套件通过ASP.NET Razor标记和服务器端ASP.NET Core Web API的生产力和简便性&#xff0c;提供客户端JavaScript的性能和灵活性。ThemeBuilder工具和集成的Material…

【操作系统】01.操作系统概论

操作系统的发展历史 未配置操作系统 手工操作阶段 用户独占全机&#xff0c;人机速度矛盾导致系统资源利用率低 脱机输入输出方式 为了缓解主机cpu和IO设备之间速度不匹配的矛盾&#xff0c;出现了脱机IO技术 在外围机的控制下&#xff0c;通过输入设备&#xff0c;将数据输…

Spring事务和事务的传播机制

一、为什么需要事务 1.1事务定义 将一组操作封装成一个执行单元&#xff0c;要么全部成功要么全部失败。 1.2为什么要用事物 例如转账分为两个操作&#xff1a; 第⼀步操作&#xff1a;A 账户 -100 元。第⼆步操作&#xff1a;B 账户 100 元。 如果没有事务&#xff0c;第…

脱岗监测预警系统 yolov5

脱岗监测预警系统可以通过pythonyolov5网络模型深度学习算法&#xff0c;脱岗监测预警算法对现场人员岗位进行实时监测&#xff0c;自动识别是否存在脱岗行为&#xff0c;并及时发出警报。Yolo意思是You Only Look Once&#xff0c;它并没有真正的去掉候选区域&#xff0c;而是…

2023安卓逆向 -- 抓包环境设置(Charles+Postern)

一、下载Charles并设置代理 1、下载地址&#xff0c;一路下一步即可安装 https://www.charlesproxy.com/ 2、代理设置&#xff0c;抓取所有ip及所有端口的数据包&#xff0c;点击Proxy&#xff0c;选择SSL Proxying Settings 3、点击Add&#xff0c;Host和Port都填写*&#x…

chatgpt赋能python:Python中的升序降序sort解析

Python中的升序降序sort解析 在 Python 开发中&#xff0c;sort 方法是非常常用的方法&#xff0c;它可以对包含数字或字符串的列表进行排序&#xff0c;其中有两种排序方式&#xff0c;分别是升序和降序。本篇文章将会深入探讨 Python 中的 sort 方法&#xff0c;着重介绍升序…

【回顾经典AI神作】卷积神经网络CNN架构系列:LeNet,AlexNet,VGG,GoogLeNet,ResNet

卷积神经网络(CNN或ConvNet)是一种特殊的多层神经网络,旨在以最少的预处理直接从像素图像中识别视觉模式。ImageNet项目是一个大型视觉数据库,设计用于视觉对象识别软件研究。ImageNet 项目举办年度软件竞赛,即 ImageNet 大规模视觉识别挑战赛 (ILSVRC),软件程序竞相正…

企业客户管理难题都有哪些?CRM系统如何解决?

CRM系统在客户管理中的重要性不言而喻&#xff0c;它可以帮助企业提高销售效率&#xff0c;优化客户体验和忠诚度&#xff0c;增加市场份额和利润。那么&#xff0c;CRM客户管理系统如何解决大客户管理难题? 企业大客户管理难题都有哪些&#xff1a; 1、需求十分多变 大客户…

第二节 Python分支结构

文章目录 一&#xff0c;分支结构1.1 概述1.2 语法格式1.2.1 单分支语法结构1.2.2 多分支语法结构1.2.3 多重语法结构1.2.4 分支语句的嵌套结构 1.3 Debug调试1.4 三元运算符1.4.1 求两个数的差值 二 专项练习题2.1 计算快递包裹重量2.2 判断奇偶数2.3 判断闰年2.4 最大的数2.5…