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

【蓝桥杯——物联网设计与开发】拓展模块3 - 温度传感器模块

目录

一、温度传感器模块

(1)资源介绍

        🔅原理图

        🔅STS30-DIS-B

        🌙引脚分配

        🌙通信

        🌙时钟拉伸(Clock Stretching)

        🌙单次触发模式

        🌙温度数据转换

(2)STM32CubeMX 软件配置

(3)代码编写

(4)实验现象

二、温度采集接口函数封装

三、踩坑日记

(1)引脚配置问题

(2)底层驱动延时问题

(3)ALERT引脚


一、温度传感器模块

(1)资源介绍

        🔅原理图

        蓝桥杯物联网竞赛实训平台提供了一个拓展接口 CN2,所有拓展模块均可直接安装在 Lora 终端上使用;

图1        拓展接口

        温度传感器模块电路原理图如下所示:

图2        温度传感器模块电路原理图

        通过两张电路图连接可知,引脚资源配置情况为:

表1 引脚资源配置情况
TemperatureMCU
SCLPB6
SDAPB7
ALEPB0

        🔅STS30-DIS-B

        (以下资料来源于STS30-DIS-B数据手册)

        STS3x-DIS是盛思锐最新的高精度数字温度传感器。它依赖于业界成熟的CMOSens®技术,与其前身相比,提供更高的智能,可靠性和更高的精度规格。其功能包括增强的信号处理,两个独特的用户可选择的I2C地址和高达1 MHz的通信速度。DFN封装的占地面积为2.5 x 2.5 mm2,同时保持0.9 mm的高度。这允许将STS3x-DIS集成到各种各样的应用中。此外,2.15 V至5.5 V的宽电源电压范围保证了广泛应用的兼容性。总而言之,STS3x-DIS融合了盛思锐超过15年的数字传感器专业知识。

图3        STS30-DIS 功能框图
        🌙引脚分配
表2 STS30-DIS-B引脚分配
PinNameComments
1SDA串行数据;输入/输出
2ADDR

地址引脚;输入;连接到逻辑高或低,不要浮空

3ALERT指示警告状态;输出;如果不使用,必须保持浮空
4SCL串行时钟;输入/输出
5VDD电源电压;输入
6nRESET复位引脚,低电平有效;输入;如果不使用,建议保持浮空状态;可通过串联电阻R≥2kΩ与VDD连接
7R无电气功能;连接到VSS
8VSS接地
        🌙通信

        向传感器发送命令后,在传感器接收另一条命令之前,需要最小的等待时间为1ms

        所有STS30-DIS-B命令和数据都映射到16位地址空间。此外,数据和命令受到CRC校验和的保护。这提高了通信的可靠性。对传感器的16位命令已经包括3位CRC校验和。传感器发送和接收的数据总是经过一个8位的CRC校验。

  • 在写方向上,必须传输校验和因为STS30-DIS-B只接受后面跟着正确校验和的数据
  • 在读方向上,它留给主机来读取和处理校验和;
        🌙时钟拉伸Clock Stretching
  • 当没有时钟拉伸的命令发出时,如果没有数据存在,传感器响应一个带有不确认(NACK)的读报头;
  • 当发出带有时钟拉伸的命令时,传感器响应一个带有ACK的读报头,然后拉下SCL线。将SCL线拉下,直到测量完成。一旦测量完成,传感器释放SCL线并发送测量结果;
        🌙单次触发模式
图4        单次触发模式下的命令

由图4的流程图可知,单次触发模式的数据获取流程如下:

        1. 第一部分

图5        发送流程第一部分

🟠️伪代码如下:

I2C开始;
发送7位I2C地址+写命令位;
等待传感器发送ACK;
发送高8位命令;
等待传感器发送ACK;
发送低8位命令;
等待传感器发送ACK;
I2C结束;

        2. 第二部分

图6        发送流程第二部分

🟠️伪代码如下:

/* 时钟拉伸不使能 */
释放时钟线;(传感器测量中)
I2C开始;
发送7位I2C地址+读命令位;
等待传感器发送NACK;
I2C结束;
释放时钟线;(传感器测量中->传感器测量完成)
I2C开始;
发送7位I2C地址+读命令位;
等待传感器发送ACK;/* 时钟拉伸使能 */
释放时钟线;(传感器测量中)
I2C开始;
发送7位I2C地址+读命令位;
等待传感器发送ACK;
(传感器将时钟线拉低)

        3. 第三部分

图7        发送流程第三部分

🟠️伪代码如下:

接收高8位温度数据;
发送ACK;
接收低8位温度数据;
发送ACK;
接收CRC校验和;
发送NACK;
I2C结束;
        🌙温度数据转换

T\left [ ^{\circ}C \right ]=-45+175\cdot \frac{S_{T}}{2^{16}-1}

T\left [ ^{\circ}F \right ]=-49+315\cdot \frac{S_{T}}{2^{16}-1}

(2)STM32CubeMX 软件配置


🔅“工程建立、时钟树配置、Debug 串行线配置、代码生成配置” 在下文中有讲解,这里不再赘述❗️

【蓝桥杯——物联网设计与开发】基础模块1- GPIO输出icon-default.png?t=O83Ahttps://blog.csdn.net/m0_63116406/article/details/135604705?spm=1001.2014.3001.5502

1️⃣点击引脚 PB6 → 选择 GPIO_Output 模式(此处默认为推挽输出);

     点击引脚 PB7 → 选择 GPIO_Output 模式(此处配置为开漏输出);

图8        引脚配置



2️⃣初始化 OLED;(配置步骤在下文中有讲解,这里不再赘述);

【蓝桥杯——物联网设计与开发】基础模块6 - OLED_蓝桥杯物联网oled-CSDN博客


3️⃣生成代码即可;

(3)代码编写

🟢️main 函数

/* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV */
uint8_t H_VALUE, L_VALUE, CRC_VALUE;    // 高8位数据、低8位数据、CRC校验数据
float temp;                            // 温度数据
uint16_t ui_dat_temp;                    // 显示数据
uint8_t puc_oled[17];                    // OLED显示存储区
/* USER CODE END PV */
/*** @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_I2C3_Init();/* USER CODE BEGIN 2 */OLED_Init();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* 第一部分 */I2CStart2();I2CSendByte2(0x94);I2CWaitAck2();I2CSendByte2(0x24);I2CWaitAck2();I2CSendByte2(0x0B);I2CWaitAck2();I2CStop2();/* 第二部分 */HAL_Delay(2);I2CStart2();I2CSendByte2(0x95);I2CWaitAck2();I2CStop2();HAL_Delay(2);I2CStart2();I2CSendByte2(0x95);I2CWaitAck2();/* 第三部分 */H_VALUE = I2CReceiveByte2();I2CSendAck2();L_VALUE = I2CReceiveByte2();I2CSendAck2();CRC_VALUE = I2CReceiveByte2();I2CSendNotAck2();I2CStop2();if(CRC_VALUE){;}temp = ((H_VALUE << 8) | L_VALUE) * 175.0 / 65535 - 45;ui_dat_temp = (uint16_t)(Temp_Read() * 10);sprintf((char*)puc_oled, "   Temperature  ");OLED_ShowString(0, puc_oled);sprintf((char*)puc_oled, "      %.1f  ", ui_dat_temp / 10.0);OLED_ShowString(2, puc_oled);HAL_Delay(500);    //延时一会儿/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

(4)实验现象

        能够实时测量环境温度。


二、温度采集接口函数封装

🟡️软件i2c.c

#include "i2c_2.h"#define DELAY_TIME 20//I2C总线内部延时函数
static void delay1(unsigned int n)
{uint32_t i;for ( i = 0; i < n; ++i);
}//配置SDA引脚为输入模式
void SDA_Input_Mode2(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = SDA2;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
//配置SDA引脚为输出模式
void SDA_Output_Mode2(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = SDA2;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
//SDA引脚输出
void SDA_Output2(uint16_t val )
{if(val)GPIOB->BSRR |= SDA2;elseGPIOB->BRR |= SDA2;
}
//SCL引脚输出
void SCL_Output2( uint16_t val )
{if(val)GPIOB->BSRR |= SCL2;elseGPIOB->BRR |= SCL2;
}
//读取SDA引脚状态
uint8_t SDA_Input2(void)
{return HAL_GPIO_ReadPin(GPIOB, SDA2);
}//I2C总线启动信号
void I2CStart2(void)
{SDA_Output2(1);delay1(DELAY_TIME);SCL_Output2(1);delay1(DELAY_TIME);SDA_Output2(0);delay1(DELAY_TIME);SCL_Output2(0);delay1(DELAY_TIME);
}//I2C总线停止信号
void I2CStop2(void)
{SCL_Output2(0);delay1(DELAY_TIME);SDA_Output2(0);delay1(DELAY_TIME);SCL_Output2(1);delay1(DELAY_TIME);SDA_Output2(1);delay1(DELAY_TIME);}//等待应答
unsigned char I2CWaitAck2(void)
{unsigned short cErrTime = 5;SDA_Input_Mode2();delay1(DELAY_TIME);SCL_Output2(1);delay1(DELAY_TIME);while(SDA_Input2()){cErrTime--;delay1(DELAY_TIME);if (0 == cErrTime){SDA_Output_Mode2();I2CStop2();return ERROR;}}SCL_Output2(0);SDA_Output_Mode2();delay1(DELAY_TIME);return SUCCESS;
}//发送应答
void I2CSendAck2(void)
{SDA_Output2(0);delay1(DELAY_TIME);delay1(DELAY_TIME);SCL_Output2(1);delay1(DELAY_TIME);SCL_Output2(0);delay1(DELAY_TIME);}//发送非应答
void I2CSendNotAck2(void)
{SDA_Output2(1);delay1(DELAY_TIME);delay1(DELAY_TIME);SCL_Output2(1);delay1(DELAY_TIME);SCL_Output2(0);delay1(DELAY_TIME);}//发送一个字节数据
void I2CSendByte2(unsigned char cSendByte)
{unsigned char  i = 8;while (i--){SCL_Output2(0);delay1(DELAY_TIME);SDA_Output2(cSendByte & 0x80);delay1(DELAY_TIME);cSendByte += cSendByte;delay1(DELAY_TIME);SCL_Output2(1);delay1(DELAY_TIME);}SCL_Output2(0);delay1(DELAY_TIME);
}//接收一个字节数据
unsigned char I2CReceiveByte2(void)
{unsigned char i = 8;unsigned char cR_Byte = 0;SDA_Input_Mode2();while (i--){cR_Byte += cR_Byte;SCL_Output2(0);delay1(DELAY_TIME);delay1(DELAY_TIME);SCL_Output2(1);delay1(DELAY_TIME);cR_Byte |=  SDA_Input2();}SCL_Output2(0);delay1(DELAY_TIME);SDA_Output_Mode2();return cR_Byte;
}

🟡️软件i2c.h

#ifndef __I2C_2_H
#define __I2C_2_H#include "main.h"
//I2C总线引脚定义
#define SCL2	GPIO_PIN_6
#define SDA2	GPIO_PIN_7//接口函数
void I2CStart2(void);
void I2CStop2(void);
unsigned char I2CWaitAck2(void);
void I2CSendAck2(void);
void I2CSendNotAck2(void);
void I2CSendByte2(unsigned char cSendByte);
unsigned char I2CReceiveByte2(void);#endif

🟡️温度采集函数

/* 温度采集函数,中等可重复性+不使能时钟拉伸 */
float Temp_Read(void)
{uint8_t H_VALUE, L_VALUE, CRC_VALUE;float temp;I2CStart2();I2CSendByte2(0x94);I2CWaitAck2();I2CSendByte2(0x24);I2CWaitAck2();I2CSendByte2(0x0B);I2CWaitAck2();I2CStop2();HAL_Delay(2);I2CStart2();I2CSendByte2(0x95);I2CWaitAck2();I2CStop2();HAL_Delay(2);I2CStart2();I2CSendByte2(0x95);I2CWaitAck2();H_VALUE = I2CReceiveByte2();I2CSendAck2();L_VALUE = I2CReceiveByte2();I2CSendAck2();CRC_VALUE = I2CReceiveByte2();I2CSendNotAck2();I2CStop2();if(CRC_VALUE){;}temp = ((H_VALUE << 8) | L_VALUE) * 175.0 / 65535 - 45;return temp;
}

🔴温度采集接口函数调用实例

/* 采集任务函数 */
void Task_Colt(void)
{/* 200ms进入一次 */if(cnt_colt < 200)	return;cnt_colt = 0;/* 温度采集与转换 */ui_dat_temp = (uint16_t)(Temp_Read() * 10);
}

三、踩坑日记

(1)引脚配置问题

  1. 推荐使用软件模拟I2C(硬件I2C,在4ti测试出来有问题);
  2. PB7(SDA)配置为开漏输出、速度快;PB6(SCL)配置为推挽输出,速度快;

(2)底层驱动延时问题

        🔅注意编写底层驱动时存在两次HAL_Delay(2),释放时钟线作用,根据芯片手册说明,此处需要≥1ms;

(3)ALERT引脚

        🔅报警引脚Alert一般用于连接MCU的中断引脚。引脚的输出取决于可编程限制的温度读数值。当满足报警条件时,引脚拉高;

        🔅根据手册说明,不使用时必须保持浮空。

       

相关文章:

【蓝桥杯——物联网设计与开发】拓展模块3 - 温度传感器模块

目录 一、温度传感器模块 &#xff08;1&#xff09;资源介绍 &#x1f505;原理图 &#x1f505;STS30-DIS-B &#x1f319;引脚分配 &#x1f319;通信 &#x1f319;时钟拉伸&#xff08;Clock Stretching&#xff09; &#x1f319;单次触发模式 &#x1f319;温度数据转…...

网狐旗舰版源码搭建概览

简单的列一下&#xff1a; 服务端源码内核源码移动端源码核心移动端源码AI控制工具源码多款子游戏源码前端、管理后台、代理网站源码数据库自建脚本UI工程源码配置工具及二次开发帮助文档 编译环境要求 VS2015 和 Cocos3.10 环境&#xff0c;支持移动端 Android 一键编译&am…...

vue3中使用vuedraggable实现拖拽

包安装方式 yarn add vuedraggablenext npm i -S vuedraggablenext属性说明 如果下面的属性说明未能完全看明&#xff0c;可以看左边的对应的菜单查看详细说明和例子。 完整例子 <template><div class"itxst"><div><draggable:list"s…...

leetcode 7. 整数反转

class Solution { public: int reverse(int x) { long long n0; if(x0) return 0; while(x%100) { xx/10; } while(x!0) { nn*10x%10; xx/10; } if(n<-2147483648||n>2147483647) return 0; return n; } };...

Nginx单向链表 ngx_list_t

目录 基本概述 数据结构 接口描述 具体实现 ngx_list_create ngx_list_init ngx_list_push 使用案例 整理自 nginx 1.9.2 源码 和 《深入理解 Nginx&#xff1a;模块开发与架构解析》 基本概述 Nginx 中的 ngx_list_t 是一个单向链表容器&#xff0c;链表中的每一个节…...

go语言中的字符串详解

目录 字符串的基本特点 1.字符串的不可变性 2.其他基本特点 字符串基本操作 1. 创建字符串 2. 获取字符串长度 3. 字符串拼接 4. 遍历字符串 5. 字符串比较 字符串常用函数 1. 判断子串 2. 查找与索引 3. 字符串替换 4. 分割与连接 5. 修剪字符串 6. 大小写转换…...

Windows脚本清理C盘缓存

方法一&#xff1a;使用power文件.ps1的文件 脚本功能 清理临时文件夹&#xff1a; 当前用户的临时文件夹&#xff08;%Temp%&#xff09;。系统临时文件夹&#xff08;C:\Windows\Temp&#xff09;。 清理 Windows 更新缓存&#xff1a; 删除 Windows 更新下载缓存&#xff0…...

分布式协同 - 分布式事务_2PC 3PC解决方案

文章目录 导图Pre2PC&#xff08;Two-Phase Commit&#xff09;协议准备阶段提交阶段情况 1&#xff1a;只要有一个事务参与者反馈未就绪&#xff08;no ready&#xff09;&#xff0c;事务协调者就会回滚事务情况 2&#xff1a;当所有事务参与者均反馈就绪&#xff08;ready&a…...

永磁同步电机负载估计算法--自适应扩张状态观测器

一、 原理介绍 在线性扩张观测器中&#xff0c;LESO观测器增益ω0 决定了观测器的跟踪速度&#xff0c;ω0 越大&#xff0c;观测器估计精度越高&#xff0c; 抗干扰能力越强&#xff0c;瞬态响应速度加快&#xff0c;过大则会引入高频噪声使系统不稳定。为使观测器在全速域内…...

【HarmonyOS应用开发——ArkTS语言】购物商城的实现【合集】

目录 &#x1f60b;环境配置&#xff1a;华为HarmonyOS开发者 &#x1f4fa;演示效果&#xff1a; &#x1f4d6;实验步骤及方法&#xff1a; 1. 在src/main/ets文件中创建components文件夹并在其中创建Home.ets和HomeProduct.ets文件。​ 2. 在Home.ets文件中定义 Home 组…...

Python二维码生成器qrcode库

要在Python中生成二维码&#xff0c;你可以使用 qrcode 库。这个库非常方便&#xff0c;允许你生成并保存二维码图像。下面是一个简单的示例&#xff0c;展示了如何使用 qrcode 库生成二维码。 首先&#xff0c;你需要安装 qrcode 库。你可以使用 pip 来安装它&#xff1a; s…...

Python:模拟(包含例题:饮料换购 图像模糊 螺旋矩阵)

模拟题&#xff1a;直接按照题目含义模拟即可&#xff0c;一般不涉及算法 注意&#xff1a; 1.读懂题&#xff1a;理清楚题目流程 2.代码和步骤一一对应&#xff1a;变量名&#xff0c;函数名&#xff0c;函数功能 3.提取重复的部分&#xff0c;写成对应的函数&#xff08;…...

git分支与部署环境的关系以及开发规范

一 某金融机构 1.1 分支分类以及作用 1.master master分支为主分支,用于部署生产环境的分支,无论任何时候都要确保master分支的稳定性;master分支由feature及hotfix分支合并,任何时间都不能直接修改代码。目前用于老仿真和老生产,暂时不动。 2.prod 主分支,是master…...

2024最新鸿蒙开发面试题合集(一)-HarmonyOS NEXT Release(API 12 Release)

1. HarmonyOS应用打包后的文件扩展名是? 打包后的文件扩展名为.hap&#xff08;HarmonyOS Ability Package&#xff09;&#xff0c;这是HarmonyOS应用的标准包格式 2. 页面和自定义组件生命周期有哪些? 页面和自定义组件生命周期说明 有Entry装饰器的component组件的生命…...

【mybatis】详解 # 和 $ 的区别,两者分别适用于哪种场景,使用 $ 不当会造成什么影响

# 和 $ 的区别 在MyBatis中&#xff0c;# 和 $ 是用来处理参数的两种不同方式&#xff0c;它们之间有一些重要的区别&#xff1a; # 符号&#xff1a; # 是用来进行参数占位符的&#xff0c;它会进行 SQL 注入防护。使用 # 时&#xff0c;MyBatis 会将参数值进行预处理&…...

Java面试题,数据结构,图的最短路径算法应用于社交网络分析

图的最短路径算法应用于社交网络分析 在一个大型社交网络中&#xff0c;用户想要找到连接两个特定用户的最短路径。假设你已经有了这个社交网络的数据模型&#xff0c;其中节点代表用户&#xff0c;边代表用户之间的关系。请设计一个解决方案&#xff0c;以找出两个用户之间的…...

Tree数据处理

文章目录 一、Tree数据重置二、Tree拆分成二级数据1、过滤数据2、二级数据 Tree组件的数据处理往往需要使用递归&#xff0c;本文归纳一下常见的数据处理情景&#xff0c;持续更新&#xff1b; 一、Tree数据重置 递归的标志就是寻找子元素的集合字段&#xff0c;一般为children…...

idea配置gitee仓库

idea配置gitee 0、fork开源项目 到自己的仓库&#xff0c;这一步相当于创建了一个自己的git仓库&#xff0c;并复制了别人的开源代码。 注意&#xff1a;如果直接下载别人的开源项目&#xff0c;需要从新配置git仓库信息&#xff0c;因为开源项目一般都设置了git信息。而修改…...

SpringBoot 事务

事务是一组操作的集合, 是一个不可分割的操作.会把所有的操作作为一个整体, 一起向数据库提交或者是撤销操作请求. 所以这组操作要么同时成功, 要么同时失败. 为什么需要事务? 我们在进行程序开发时, 也会有事务的需求. 比如转账操作: 第一步&#xff1a;A 账户 -100 元. …...

我的JAVA-Web基础(1)

1.HTML 2.css CSS&#xff08;层叠样式表&#xff09;提供了多种选择器来定位HTML文档中的元素&#xff0c;以便可以应用样式。以下是三种常用的选择器简述&#xff1a; ID 选择器&#xff1a; ID选择器使用HTML元素的id属性来定位单个元素。每个页面中id应该是唯一的&#xf…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...