【STM32】RTT-Studio中HAL库开发教程三:IIC通信--AHT20

文章目录

    • 一、I2C总线通信协议
    • 二、AHT20传感器介绍
    • 三、STM32CubeMX配置硬件IIC
    • 四、RTT中初始化配置
    • 五、具体实现代码
    • 六、实验现象

一、I2C总线通信协议

使用奥松的AHT20温湿度传感器,对环境温湿度进行采集。AHT20采用的是IIC进行通信,可以使用硬件IIC或者使用模拟IIC进行通信,本例程介绍采用STM32F407芯片自带的硬件IIC进行通讯,具体操作过程如下。

1.I2C介绍
IIC(Inter-Integrated Circuit)总线是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。
在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps 以上。

  • 注意IIC是为了与低速设备通信而发明的,所以IIC的传输速率比不上SPI。
    在这里插入图片描述

2.I2C物理层

  • 它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。
  • 一个 I2C 总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线(SCL)。数据线即用来表示数据,时钟线用于数据收发同步。
  • 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址 进行不同设备之间的访问。
  • 总线通过上拉电阻接到电源。当 I2C 设备空闲时,会输出高阻态,而 当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
  • 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定 由哪个设备占用总线。
  • 具有三种传输模式:标准模式传输速率为 100kbit/s,快速模式为 400kbit/s,高速模式下可达 3.4Mbit/s,但目前大多 I2C 设备尚不支持高速模 式。
  • 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制。
    在这里插入图片描述
    术语:

主机:启动数据传送并产生时钟信号的设备;
从机:被主机寻址的器件;
多主机:同时有多于一个主机尝试控制总线但不破坏传输;
主模式:用 I2CNDAT 支持自动字节计数的模式; 位 I2CRM,I2CSTT,I2CSTP 控制数据的接收和发送;
从模式:发送和接收操作都是由 I2C 模块自动控制的;
仲裁:是一个在有多个主机同时尝试控制总线但只允许其中一个控制总线并 使传输不被破坏的过程;
同步:两个或多个器件同步时钟信号的过程;
发送器:发送数据到总线的器件;
接收器:从总线接收数据的器件

3.I2C协议层
1.起始信号和停止信号
SCL 线为高电平期间,SDA 线由高电平向低电平的变化表示起始信号;SCL 线为高电平期间,SDA 线由低电平向高电平的变化表示终止信号。如下图:
在这里插入图片描述

起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用 的状态;在终止信号产生后,总线就处于空闲状态。

在这里插入图片描述
2.数据有效性规定
I2C 总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保 持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态 才允许变化。每次数据传输都以字节为单位,每次传输的字节数不受限制。如下图
在这里插入图片描述
3.应答和非应答
每当发送器件传输完一个字节的数据后,后面必须紧跟一个校验位,这个校 验位是接收端通过控制 SDA(数据线)来实现的,以提醒发送端数据我这边已经 接收完成,数据传送可以继续进行。这个校验位其实就是数据或地址传输过程中 的响应。响应包括“应答(ACK)”和“非应答(NACK)”两种信号。
在这里插入图片描述
应答信号(ACK)通常是从机向主机发送的信号。
在这里插入图片描述
非应答信号(NACK)是由主机发送的。
在这里插入图片描述
等待应答信号: 一旦主机发送完地址和读写位,它会释放SDA数据线,即将SDA置为高阻态,并等待从机的应答信号。
在这里插入图片描述
4.总线时序图
在这里插入图片描述

  • 初始(空闲)状态:SCL和SDA都保持高电平
  • 起始信号:SCL为高电平,SDA由高电平变为低电平,数据开始发送
  • 结束信号:SCL为高电平,SDA由低电平变为高电平,数据传送结束
  • 有效的数据位传输:在IIC总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,数据在SDA上从高位向低位依次串行传送每一位数据。
  • 应答信号:发送器每发送一个字节(8个bit),就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。
  • 应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节。
  • 应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。

二、AHT20传感器介绍

英文数据手册:AHT20英文手册
中文数据手册:AHT20中文手册
传感器介绍:
1.发送命令
在启动传输后,随后传输的I2C首字节包括7位的IIC设备地址0x38和一个SDA方向位x(读R:‘1’,写W:‘0’)。在第8个SCL时钟下降沿之后,通过拉低 SDA引脚 (ACK位),指示传感器数据接收正常。 在发出初始化命令之后 (‘1011’1110’)代表初始化,‘1010’1100’代表温湿度测量), MCU必须等到测量完成。

  • 地址:
    在这里插入图片描述
    该地址在使用的时候,如果是读设备,地址为0x71,如果是写设备,则地址为0x70。所以在设备进行设备通讯的时候设备地址采用0x70

  • 状态位说明:
    在这里插入图片描述
    在使用的时候需要查询设备状态,常查询的状态为:校准使能位、忙闲指示位

2.读取流程
AHT20传感器的通信过程主要包含以下四个步骤:

  • 上电后要等待40ms,读取温湿度值之前, 首先要看状态字的校准使能位Bit[3]是否为 1(通过发送0x71可以获取一个字节的状态字),如果不为1,要发送0xBE命令(初始化),此命令参数有两个字节, 第一个字节为0x08,第二个字节为0x00。
  • 直接发送 0xAC命令(触发测量),此命令参数有两个字节,第一个字节为 0x33,第二个字节为0x00。
  • 等待75ms待测量完成,忙状态Bit[7]为0,然后可以读取六个字节(发0X71即可以读取)。
  • 计算温湿度值。
    在这里插入图片描述在这里插入图片描述
    在采用HAL库配置的硬件IIC,则直接使用如下两个相关函数即可,无需关注此应答信号。硬件IIC的通信速率比软件IIC更加稳定,速度更快,使用更加方便。
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);

3.数据转换
计算相对湿度公式:
在这里插入图片描述
计算温度公式:
在这里插入图片描述

三、STM32CubeMX配置硬件IIC

1.配置硬件IIC:通过按照下图的配置方式,对IIC进行初始化配置
在这里插入图片描述
2.生成代码:按照下图生成IIC的初始化代码。
在这里插入图片描述

四、RTT中初始化配置

1.生成初始化代码
通过使用STM32CubeMX生成的初始化代码:

/*** @brief i2c初始化*/
static void MX_I2C3_Init(void)
{hi2c3.Instance = I2C3;hi2c3.Init.ClockSpeed = 100000;hi2c3.Init.DutyCycle = I2C_DUTYCYCLE_2;hi2c3.Init.OwnAddress1 = 0;hi2c3.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;hi2c3.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;hi2c3.Init.OwnAddress2 = 0;hi2c3.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;hi2c3.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;if (HAL_I2C_Init(&hi2c3) != HAL_OK){Error_Handler();}
}

2.在board.c中添加初始化代码
在board.c中需要添加HAL_开头的函数,便于系统调用该函数,对IIC进行初始化。

/*** @brief i2c初始化* @param i2cHandle*/
void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if (i2cHandle->Instance == I2C3){__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/**I2C3 GPIO ConfigurationPC9     ------> I2C3_SDAPA8     ------> I2C3_SCL*/GPIO_InitStruct.Pin = GPIO_PIN_9;GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF4_I2C3;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_8;GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF4_I2C3;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* I2C3 clock enable */__HAL_RCC_I2C3_CLK_ENABLE();}
}

3.在board.h中添加宏定义
打开RTT软件中的IIC的宏定义,便于使用IIC的底层驱动。

#define BSP_USING_I2C3
#ifdef BSP_USING_I2C3
#define BSP_I2C3_SCL_PIN    GET_PIN(A, 8)
#define BSP_I2C3_SDA_PIN    GET_PIN(C, 9)
#endif

五、具体实现代码

1.AHT20.h代码如下:

#ifndef APPLICATIONS_HARDWARE_INC_AHT20_H_
#define APPLICATIONS_HARDWARE_INC_AHT20_H_#include <rtthread.h>
#include <rtdevice.h>
#include <drv_common.h>
#include "sys_string.h"/**====================================================###### 宏定义 ######==================================================*/
#define RT_AHT20_THREAD_STACK_SIZE     (1024)
#define RT_AHT20_THREAD_PRIORITY       (22)
#define RT_AHT20_THREAD_TICK           (20)#define AHT20_SLAVE_ADDRESS            0x70         // I2C从机地址// 定义 AHT20 命令
#define AHT20_INIT_COMD                0xBE         // 初始化寄存器地址
#define AHT20_SOFTRESET                0xBA         // 软复位单指令
#define AHT20_TRIGMERSURE_COMD         0xAC         // 触发测量 寄存器地址
/**====================================================#######  END  #######=================================================*//**====================================================### 全局变量定义 ####=================================================*/
// aht20温湿度结构体
typedef struct m_AHT20
{uint8_t alive;      // 0-器件不存在; 1-器件存在uint8_t flag;       // 读取/计算错误标志位。0-读取/计算数据正常; 1-读取/计算设备失败uint32_t HT[2];     // 湿度、温度 原始传感器的值(20Bit).float RH;           // 湿度,转换单位后的实际值,标准单位%float Temp;         // 温度,转换单位后的实际值,标准单位°C} AHT20_StructureTypedef;AHT20_StructureTypedef  g_aht20;// aht20结构体信息
/**====================================================#######  END  #######=================================================*/#endif /* APPLICATIONS_HARDWARE_INC_AHT20_H_ */

2.AHT20.c代码如下:

#include "aht20.h"
#include "i2c.h"
#include "control.h"
#include "power.h"/*=====================================================### 静态函数调用 ###==================================================*/
#ifdef AHT20_HARDWARE_IIC/*** @brief i2c初始化*/
static void MX_I2C3_Init(void)
{hi2c3.Instance = I2C3;hi2c3.Init.ClockSpeed = 100000;hi2c3.Init.DutyCycle = I2C_DUTYCYCLE_2;hi2c3.Init.OwnAddress1 = 0;hi2c3.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;hi2c3.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;hi2c3.Init.OwnAddress2 = 0;hi2c3.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;hi2c3.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;if (HAL_I2C_Init(&hi2c3) != HAL_OK){Error_Handler();}
}/*** @brief 读AHT20 设备状态字* @return uint8_t 设备状态字*/
static uint8_t AHT20_ReadStatusCmd(void)
{uint8_t tmp = 0;HAL_I2C_Master_Receive(&hi2c3, AHT20_SLAVE_ADDRESS, &tmp, 1, 0xFFFF);return tmp;
}/*** @brief 读AHT20设备状态字中的Bit3: 校准使能位* @return 1 - 已校准; 0 - 未校准*/
static uint8_t AHT20_ReadCalEnableCmd(void)
{uint8_t tmp = 0;tmp = AHT20_ReadStatusCmd();return (tmp >> 3) & 0x01;
}/*** @brief AHT20 芯片初始化命令*/
static void AHT20_IcInitCmd(void)
{uint8_t tmp = AHT20_INIT_COMD;HAL_I2C_Master_Transmit(&hi2c3, AHT20_SLAVE_ADDRESS, &tmp, 1, 0xFFFF);
}/*** @brief AHT20 软复位命令*/
static void AHT20_SoftResetCmd(void)
{uint8_t tmp = AHT20_SOFTRESET;HAL_I2C_Master_Transmit(&hi2c3, AHT20_SLAVE_ADDRESS, &tmp, 1, 0xFFFF);
}/*** @brief AHT20 设备初始化* @return 0 - 初始化AHT20设备成功; 1 - 初始化AHT20失败,可能设备不存在或器件已损坏*/
static uint8_t AHT20_Init(void)
{uint8_t rcnt = 2;   // 软复位命令 重试次数,2次uint8_t icnt = 2;   // 初始化命令 重试次数,2次while (rcnt--){// 上电后要等待40msHAL_Delay(40);// 读取温湿度之前,首先检查[校准使能位]是否为1,2次重试机会while ((!AHT20_ReadCalEnableCmd()) && (icnt--)){HAL_Delay(1);AHT20_IcInitCmd();      // 如果不为1,要发送初始化命令HAL_Delay(40);          // 按上电时间算40ms}// [校准使能位]为1,校准正常if (icnt){break;}else{AHT20_SoftResetCmd();   // 软复位AHT20器件,重试HAL_Delay(20);          // 手册标明不超过20ms.}}if (rcnt){return 0;        // AHT20设备初始化正常}else{return 1;        // AHT20设备初始化失败}
}/*** @brief AHT20 触发测量命令*/
static void AHT20_TrigMeasureCmd(void)
{uint8_t tmp[3] = {AHT20_TRIGMERSURE_COMD, 0x33, 0x00};HAL_I2C_Master_Transmit(&hi2c3, AHT20_SLAVE_ADDRESS, tmp, 3, 0xFFFF);
}/*** @brief 读AHT20 设备状态字 中的Bit7: 忙标志* @return 忙标志:1 - 设备忙; 0 - 设备空闲*/
static uint8_t AHT20_ReadBusyCmd(void)
{uint8_t tmp = 0;tmp = AHT20_ReadStatusCmd();return (tmp>>7)&0x01;
}/*** @brief AHT20 设备读取 相对湿度和温度(原始数据20Bit)* @param HT:存储20Bit原始数据的uint32数组* @return 0-读取数据正常; 1-读取设备失败,设备一直处于忙状态,不能获取数据*/
uint8_t AHT20_ReadHT(uint32_t *HT)
{uint8_t cnt = 4;        // 忙标志 重试次数,3次uint8_t tmp[6];uint32_t RetuData = 0;// 发送触发测量命令AHT20_TrigMeasureCmd();do{HAL_Delay(75);                      // 等待75ms待测量完成,忙标志Bit7为0}while (AHT20_ReadBusyCmd() && (--cnt)); // 重试3次// 设备闲,可以读温湿度数据if (cnt){HAL_Delay(5);// 读温湿度数据HAL_I2C_Master_Receive(&hi2c3, AHT20_SLAVE_ADDRESS, tmp, 6, 0XFFFF);// 计算相对湿度RH。原始值,未计算为标准单位%。RetuData = 0;RetuData = (RetuData | tmp[1]) << 8;RetuData = (RetuData | tmp[2]) << 8;RetuData = (RetuData | tmp[3]);RetuData = RetuData >> 4;HT[0] = RetuData;// 计算温度T。原始值,未计算为标准单位°C。RetuData = 0;RetuData = (RetuData | tmp[3]) << 8;RetuData = (RetuData | tmp[4]) << 8;RetuData = (RetuData | tmp[5]);RetuData = RetuData & 0xfffff;HT[1] = RetuData;return 0;}else        //设备忙,返回读取失败{return 1;}
}/*** @brief AHT20 温湿度信号转换(由20Bit原始数据,转换为标准单位RH=%,T=°C)* @param aht:存储AHT20传感器信息的结构体* @return 0-计算数据正常; 1-计算数据失败,计算值超出元件手册规格范围*/
uint8_t StandardUnitCon(AHT20_StructureTypedef *aht)
{// 计算温湿度aht->RH = (double) aht->HT[0] * 100 / (1 << 20);aht->Temp = (double) aht->HT[1] * 200 / (1 << 20) - 50;// 限幅,RH=0~100%; Temp=-40~85°Cif ((aht->RH >= 0) && (aht->RH <= 10000) && (aht->Temp >= -4000) && (aht->Temp <= 8500)){aht->flag = 0;return 0;        // 测量数据正常}else{aht->flag = 1;return 1;        // 测量数据超出范围,错误}
}/*** @brief AHT20 温湿度信号转换(由20Bit原始数据,转换为标准单位RH=%,T=°C)* @param p:存储AHT20传感器信息的结构体* @return 0-计算数据正常; 1-计算数据失败,计算值超出元件手册规格范围*/
uint8_t AHT20_Get_Value(AHT20_StructureTypedef *p)
{uint8_t temp = 0;temp = AHT20_ReadHT(p->HT);if (temp == 0){temp = StandardUnitCon(p);}return temp;
}
#endif
/*=====================================================#######  END  #######=================================================*/

3.线程代码如下:

/*** @brief 温湿度检测入口函数* @param param*/
void aht20_temp_humidity_entry(void *param)
{
#ifdef AHT20_HARDWARE_IICAHT20_StructureTypedef *pAht20 = (AHT20_StructureTypedef *)param;POWER_ENABLE_HIGH();    // 温湿度电源使能MX_I2C3_Init();         // i2c初始化if(AHT20_Init() != 0)   // AHT20设备初始化{pAht20->alive = 0;}else{pAht20->alive = 1;}#endifwhile (1){
#ifdef AHT20_HARDWARE_IICAHT20_Get_Value(pAht20);                                    // 温湿度查询rt_kprintf("T: %d.%d C  H: %d.%d %%\n", (int)pAht20->Temp, (int)(pAht20->Temp * 100) % 100,(int)pAht20->RH, (int)(pAht20->RH * 100) % 100);#endifHAL_Delay(300);}
}/*** @brief  温湿度线程初始化* @return*/
static int aht20_temp_humidity(void)
{rt_thread_t ret;ret = rt_thread_create("aht20", aht20_temp_humidity_entry, (void *)&g_aht20,RT_AHT20_THREAD_STACK_SIZE,RT_AHT20_THREAD_PRIORITY,RT_AHT20_THREAD_TICK);RT_ASSERT(ret != RT_NULL);rt_thread_startup(ret);return 0;
}
INIT_ENV_EXPORT(aht20_temp_humidity);/*** @brief AHT20工作状态* @param argc* @param argv*/
void AHT20_Work_State(int argc, char **argv)
{if (argc != 1){rt_kprintf("[%s:%d] param error!\n", __FUNCTION__, __LINE__);return;}else{if (strcmp_nocase(argv[0], "aht20") == 0){// 温湿度rt_kprintf("aht20_temp: %d.%d C\n", (int)g_aht20.Temp, (int)(g_aht20.Temp * 100) % 100);rt_kprintf("aht20_humidity: %d.%d %%\n", (int)g_aht20.RH, (int)(g_aht20.RH * 100) % 100);}}
}
MSH_CMD_EXPORT_ALIAS(AHT20_Work_State, aht20, AHT20 Work State);

六、实验现象

通过使用aht20指令进行查询温湿度数据,指令主要是通过控制台进行数据指令的读写,这个是RTT中自带的控制台,很方便进行数据的读取。具体实验数据如下:
在这里插入图片描述

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

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

相关文章

linux网络驱动(以太网)

前言 由于最近要做一个MCU的以太网通信&#xff0c;学习一下以太网。由于过来实习没带MCU&#xff0c;只能继续做一下SOC&#xff0c;所以这期还是imx6ull的以太网&#xff08;以下简称网络&#xff09;驱动。 理论&#xff08;imx6ull内置MAC外设&#xff09; 其实整个SOC网络…

【后端开发实习】用MongoDB和Redis实现消息队列搭建分布式邮件消息系统

用Redis实现消息队列并搭建分布式邮件消息系统 系统介绍Redis实现消息队列思路分析代码实现 MongoDB监听数据变化思路分析代码实现Mongoose测试连接监听mongodb数据变化 注意点 系统介绍 本次要实现的是一个能够实现实时监控Mongodb中数据变化的系统&#xff0c;要能够在数据发…

iterator(迭代器模式)

引入 在想显示数组当中所有元素时&#xff0c;我们往往会使用下面的for循环语句来遍历数组 #include <iostream> #include <vector>int main() {std::vector<int> v({ 1, 2, 3 });for (int i 0; i < v.size(); i){std::cout << v[i] << &q…

在 Windows 上运行 Linux:WSL2 完整指南(一)

系列文章目录 在 Windows 上运行 Linux&#xff1a;WSL2 完整指南&#xff08;一&#xff09;&#x1f6aa; 在 Windows 上运行 Linux&#xff1a;WSL2 完整指南&#xff08;二&#xff09; 文章目录 系列文章目录前言一、什么是 WSL&#xff1f;1.1 WSL 的主要特性1.2 WSL 的…

GitHub 令牌泄漏, Python 核心资源库面临潜在攻击

TheHackerNews网站消息&#xff0c;软件供应链安全公司 JFrog 的网络安全研究人员称&#xff0c;他们发现了一个意外泄露的 GitHub 令牌&#xff0c;可授予 Python 语言 GitHub 存储库、Python 软件包索引&#xff08;PyPI&#xff09;和 Python 软件基金会&#xff08;PSF&…

半自动辅助制作数据集【实例分割】

利用yoloV8的实例分割模型&#xff0c;半自动辅助制作数据集 引言&#xff1a;【主要步骤】 步骤1&#xff1a;无人机航拍&#xff0c;收集基础图片 步骤2&#xff1a;将收集到的图片&#xff0c;全部用yoloV8-seg.pt模型进行实例分割【预测之前&#xff0c;将配置文件default.…

使用llama.cpp量化模型

文章目录 概要整体实验流程技术细节小结 概要 大模型量化是指在保持模型性能尽可能不变的情况下&#xff0c;通过减少模型参数的位数来降低模型的计算和存储成本。本次实验环境为魔搭社区提供的免费GPU环境&#xff08;24G&#xff09;&#xff0c;使用Llama.cpp进行4bit量化可…

Python面试宝典第14题:背包问题

题目 现有编号从 0 到 n - 1 的 n 个背包&#xff0c;给你两个下标从 0 开始的整数数组 capacity 和 rocks 。第 i 个背包最大可以装 capacity[i] 块石头&#xff0c;当前已经装了 rocks[i] 块石头&#xff08;0 < rocks[i] < capacity[i]&#xff09;。另给你一个整数 a…

深度学习入门——神经网络的学习

前言 这里所说的“学习”是指从训练数据中自动获取最优权重参数的过程。 为了使神经网络能进行学习&#xff0c;将导入损失函数这一指标 为了找出尽可能小的损失函数的值&#xff0c;本章我们将介绍利用了函数斜率的梯度法 从数据中学习 本章将介绍神经网络的学习&#xff0c;…

ubuntu上模拟串口通信

前言 有时候写了一些串口相关的程序&#xff0c;需要调试的时候&#xff0c;又没有硬件&#xff0c;或者需要等其他模块完成才能一起联调。这样搭建环境费时费力&#xff0c;很多问题等到最后联调才发现就已经很晚了。 本文提供一种在ubuntu环境下模拟串口&#xff0c;直接就可…

【Web服务与Web应用开发】【C#】VS2019 创建ASP.NET Web应用程序,以使用WCF服务

目录 0.简介 1.环境 2.知识点 3.详细过程 1&#xff09;创建空项目 2&#xff09;添加Web表单 3&#xff09;使用Web表单的GUI设计 4&#xff09;添加服务引用 5&#xff09;在Web的button函数中调用服务&#xff0c;获取PI值 6&#xff09;测试 0.简介 本文属于一个…

Mysql的JSON格式字段实用操作函数JSON_CONTAINS、JSON_SEARCH、JSON_EXTRACT

文章目录 前言一、示例数据二、使用1.JSON_CONTAINS2.JSON_SEARCH3.JSON_EXTRACT 总结 前言 在开发中难免会遇见在Mysql字段存储JSON格式数据的业务情况&#xff0c;记录几种常用函数的 用法。 一、示例数据 建一张表&#xff0c;字段memo存储JSON格式数据 CREATE TABLE use…

摄像头 RN6752v1 视频采集卡

摄像头 AHD倒车摄像头比较好&#xff0c;AHD英文全名Analog High Definition&#xff0c;即模拟高清&#xff0c;拥有比较好的分辨率与画面质感。 RN6752v1 GQW AKKY2 usb 采集卡 FHD&#xff08;1080p&#xff09;、HD&#xff08;720p&#xff09;和D1&#xff08;480i&am…

MySQL第七次作业

Product表内容 字段名 字段描述 数据类型 主键 外键 非空 唯一 自增 Id 产品编号 Int(10) 是 否 是 是 否 Name 产品功能 Varchar(20) 否 否 是 否 否 Function 主要功能 Varchar(50) 否 否 否 否 否 Company 生产厂家 Varchar(20) 否 否 是 否 否 Address 家庭住址 Varchar(20…

支持大量边缘盒子集中管理调度的智慧物流开源了。

智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用户只需在界面上…

AR0132AT 1/3 英寸 CMOS 数字图像传感器(AR0132AT6R、AR0132AT6C)适用于监控和高清视频等多种应用

AR0132AT 1/3 英寸 CMOS 数字图像传感器&#xff0c;带 1280H x 960V 有效像素阵列。它能在线性或高动态模式下捕捉图像&#xff0c;且带有卷帘快门读取。它包含了多种复杂的摄像功能&#xff0c;如自动曝光控制、开窗&#xff0c;以及视频和单帧模式。它适用于低光度和高动态范…

大模型学习笔记十一:视觉大模型

一、判别式模型和生成式模型 1&#xff09;判别式模型Discriminative ①给某一个样本&#xff0c;判断属于某个类别的概率&#xff0c;擅长分类任务&#xff0c;计算量少。&#xff08;学习策略函数Y f(X)或者条件概率P(YIX)&#xff09; ②不能反映训练数据本身的特性 ③学习…

SpringMVC 控制层框架-上

一、SpringMVC简介 1. 介绍 Spring Web MVC 是基于Servlet API构建的原始Web框架&#xff0c;从一开始就包含在Spring Framework 中。在控制层框架经历Srust、WebWork、Strust2等诸多产品的历代更迭之后&#xff0c;目前业界普遍选择了SpringMVC 作为Java EE项目表述层开发的首…

解读|http和https的区别,谁更好用

在日常我们浏览网页时&#xff0c;有些网站会看到www前面是http&#xff0c;有些是https&#xff0c;这两种有什么区别呢&#xff1f;为什么单单多了“s”&#xff0c;会有人说这个网页会更安全些&#xff1f; HTTP&#xff08;超文本传输协议&#xff09;和HTTPS&#xff08;…

[Labview] 表格单元格外边框 二维图片叠加绘图

最终效果如下所示 转行做Labview都没到三个月&#xff0c;主程居然让我做这么复杂的功能&#xff0c;真是看得起我/(ㄒoㄒ)/~~ 思路大致分为两步 1、确定每个框体的左上/右下单元格位置&#xff0c;转换为表格表格坐标并在二维图片上绘制生成&#xff1b; 2、为二维图片添加…