STM32 HAL库硬I2C的TOF050C模块

news2024/11/25 12:25:34

前言

最近在倒腾毕业设计,需要用到TOF050C,但是现有的案例都是软IIC,并且还是基于STM32F103的,笔者用的STM32F767,没有GPIO->CRH寄存器。问题来了,如果我每次都要去看寄存器手册属实费时间,这不干脆直接用硬IIC?

于是乎,打开了TOF050C手册,硬啃!

这手册好在它有工作流程图,能提高开发人员的理解速度。


硬IIC开发代码

由于是使用IIC,用定时器实现微秒级延时,这就不多说了。

直接上库代码

vl6180x.c:

#include    "vl6180x.h"

#define addr_write                                                         0x52
#define addr_read                                                          0x53

#define IDENTIFICATION__MODEL_ID                0x000
#define IDENTIFICATION__MODEL_REV_MAJOR       0x001
#define IDENTIFICATION__MODEL_REV_MINOR       0x002
#define IDENTIFICATION__MODULE_REV_MAJOR      0x003
#define IDENTIFICATION__MODULE_REV_MINOR      0x004
#define IDENTIFICATION__DATE_HI               0x006
#define IDENTIFICATION__DATE_LO               0x007
#define IDENTIFICATION__TIME                  0x008
#define SYSTEM__MODE_GPIO0                    0x010
#define SYSTEM__MODE_GPIO1                    0x011
#define SYSTEM__HISTORY_CTRL                  0x012
#define SYSTEM__INTERRUPT_CONFIG_GPIO         0x014
#define SYSTEM__INTERRUPT_CLEAR               0x015
#define SYSTEM__FRESH_OUT_OF_RESET            0x016
#define SYSTEM__GROUPED_PARAMETER_HOLD        0x017
#define SYSRANGE__START                       0x018
#define SYSRANGE__THRESH_HIGH                 0x019
#define SYSRANGE__THRESH_LOW                  0x01A
#define SYSRANGE__INTERMEASUREMENT_PERIOD     0x01B
#define SYSRANGE__MAX_CONVERGENCE_TIME        0x01C
#define SYSRANGE__CROSSTALK_COMPENSATION_RATE 0x01E
#define SYSRANGE__CROSSTALK_VALID_HEIGHT      0x021
#define SYSRANGE__EARLY_CONVERGENCE_ESTIMATE  0x022
#define SYSRANGE__PART_TO_PART_RANGE_OFFSET   0x024
#define SYSRANGE__RANGE_IGNORE_VALID_HEIGHT   0x025
#define SYSRANGE__RANGE_IGNORE_THRESHOLD      0x026
#define SYSRANGE__MAX_AMBIENT_LEVEL_MULT      0x02C
#define SYSRANGE__RANGE_CHECK_ENABLES         0x02D
#define SYSRANGE__VHV_RECALIBRATE             0x02E
#define SYSRANGE__VHV_REPEAT_RATE             0x031
#define SYSALS__START                         0x038
#define SYSALS__THRESH_HIGH                   0x03A
#define SYSALS__THRESH_LOW                    0x03C
#define SYSALS__INTERMEASUREMENT_PERIOD       0x03E
#define SYSALS__ANALOGUE_GAIN                 0x03F
#define SYSALS__INTEGRATION_PERIOD            0x040
#define RESULT__RANGE_STATUS                  0x04D
#define RESULT__ALS_STATUS                    0x04E
#define RESULT__INTERRUPT_STATUS_GPIO         0x04F
#define RESULT__ALS_VAL                       0x050
#define RESULT__HISTORY_BUFFER_0              0x052
#define RESULT__HISTORY_BUFFER_1              0x054
#define RESULT__HISTORY_BUFFER_2              0x056
#define RESULT__HISTORY_BUFFER_3              0x058
#define RESULT__HISTORY_BUFFER_4              0x05A
#define RESULT__HISTORY_BUFFER_5              0x05C
#define RESULT__HISTORY_BUFFER_6              0x05E
#define RESULT__HISTORY_BUFFER_7              0x060
#define RESULT__RANGE_VAL                     0x062
#define RESULT__RANGE_RAW                     0x064
#define RESULT__RANGE_RETURN_RATE             0x066
#define RESULT__RANGE_REFERENCE_RATE          0x068
#define RESULT__RANGE_RETURN_SIGNAL_COUNT     0x06C
#define RESULT__RANGE_REFERENCE_SIGNAL_COUNT  0x070
#define RESULT__RANGE_RETURN_AMB_COUNT        0x074
#define RESULT__RANGE_REFERENCE_AMB_COUNT     0x078
#define RESULT__RANGE_RETURN_CONV_TIME        0x07C
#define RESULT__RANGE_REFERENCE_CONV_TIME     0x080
#define RANGE_SCALER                          0x096
#define READOUT__AVERAGING_SAMPLE_PERIOD      0x10A
#define FIRMWARE__BOOTUP                      0x119
#define FIRMWARE__RESULT_SCALER               0x120
#define I2C_SLAVE__DEVICE_ADDRESS             0x212
#define INTERLEAVED_MODE__ENABLE              0x2A3

const uint16_t ScalerValues[] = {0, 253, 127, 84};
uint8_t ptp_offset;
uint8_t scaling;
uint16_t io_timeout;


void VL6180X_WR_CMD(uint16_t cmd, uint8_t data)
{
    uint8_t data_write[3];
    data_write[0]=(cmd>>8)&0xff;
    data_write[1]=cmd&0xff;
    data_write[2]=data&0xff;
    HAL_I2C_Master_Transmit(&hi2c1, addr_write, data_write, 3, 0x100);
}

void VL6180X_WR_CMD2(uint16_t cmd, uint16_t data)
{
    uint8_t data_write[4];
    data_write[0]=(cmd>>8)&0xff;
    data_write[1]=cmd&0xff;
     data_write[2]=(data>>8)&0xff;
    data_write[3]=data&0xff;
    HAL_I2C_Master_Transmit(&hi2c1, addr_write, data_write, 4, 0x100);
}

uint8_t VL6180X_ReadByte(uint16_t reg)
{
    uint8_t data_write[2];
    uint8_t receive_data=0;
    data_write[0]=(reg>>8)&0xff;
    data_write[1]=reg&0xff;
    HAL_I2C_Master_Transmit(&hi2c1, addr_write, data_write, 2, 0x100);
    HAL_I2C_Master_Receive(&hi2c1, addr_read, &receive_data, 1, 0x100);
    return receive_data;
}

uint8_t VL6180X_Init()
{
    ptp_offset = 0;
    scaling = 0;
    io_timeout = 2;
    
    ptp_offset = VL6180X_ReadByte(SYSRANGE__PART_TO_PART_RANGE_OFFSET);
    uint8_t reset=VL6180X_ReadByte(0x016);//check wether reset over
    if(reset==1)
    {
        VL6180X_WR_CMD(0X0207,0X01);
        VL6180X_WR_CMD(0X0208,0X01);
        VL6180X_WR_CMD(0X0096,0X00);
        VL6180X_WR_CMD(0X0097,0XFD);
        VL6180X_WR_CMD(0X00E3,0X00);
        VL6180X_WR_CMD(0X00E4,0X04);
        VL6180X_WR_CMD(0X00E5,0X02);
        VL6180X_WR_CMD(0X00E6,0X01);
        VL6180X_WR_CMD(0X00E7,0X03);
        VL6180X_WR_CMD(0X00F5,0X02);
        VL6180X_WR_CMD(0X00D9,0X05);
        VL6180X_WR_CMD(0X00DB,0XCE);
        VL6180X_WR_CMD(0X02DC,0X03);
        VL6180X_WR_CMD(0X00DD,0XF8);
        VL6180X_WR_CMD(0X009F,0X00);
        VL6180X_WR_CMD(0X00A3,0X3C);
        VL6180X_WR_CMD(0X00B7,0X00);
        VL6180X_WR_CMD(0X00BB,0X3C);
        VL6180X_WR_CMD(0X00B2,0X09);
        VL6180X_WR_CMD(0X00CA,0X09);
        VL6180X_WR_CMD(0X0198,0X01);
        VL6180X_WR_CMD(0X01B0,0X17);
        VL6180X_WR_CMD(0X01AD,0X00);
        VL6180X_WR_CMD(0X00FF,0X05);
        VL6180X_WR_CMD(0X0100,0X05);
        VL6180X_WR_CMD(0X0199,0X05);
        VL6180X_WR_CMD(0X01A6,0X1B);
        VL6180X_WR_CMD(0X01AC,0X3E);
        VL6180X_WR_CMD(0X01A7,0X1F);
        VL6180X_WR_CMD(0X0030,0X00);
         
        VL6180X_WR_CMD(0X0011,0X10);
        VL6180X_WR_CMD(0X010A,0X30);
        VL6180X_WR_CMD(0X003F,0X46);
        VL6180X_WR_CMD(0X0031,0XFF);
        VL6180X_WR_CMD(0X0040,0X63);
        VL6180X_WR_CMD(0X002E,0X01);
        VL6180X_WR_CMD(0X001B,0X09);
        VL6180X_WR_CMD(0X003E,0X31);
        VL6180X_WR_CMD(0X0014,0X24);
         
        VL6180X_WR_CMD(0x016,0x00);
        return 1;
    }
    return 0;
}


void VL6180X_SetScaling(uint8_t new_scaling)
{
  uint8_t const DefaultCrosstalkValidHeight = 20; // default value of SYSRANGE__CROSSTALK_VALID_HEIGHT

  // do nothing if scaling value is invalid
  if (new_scaling < 1 || new_scaling > 3) { return; }
    
    scaling = new_scaling;
  VL6180X_WR_CMD2(RANGE_SCALER, ScalerValues[scaling]);

  // apply scaling on part-to-part offset
  VL6180X_WR_CMD(SYSRANGE__PART_TO_PART_RANGE_OFFSET, ptp_offset / scaling);

  // apply scaling on CrossTalkValidHeight
  VL6180X_WR_CMD(SYSRANGE__CROSSTALK_VALID_HEIGHT, DefaultCrosstalkValidHeight / scaling);

  // This function does not apply scaling to RANGE_IGNORE_VALID_HEIGHT.

  // enable early convergence estimate only at 1x scaling
  uint8_t rce = VL6180X_ReadByte(SYSRANGE__RANGE_CHECK_ENABLES);
  VL6180X_WR_CMD(SYSRANGE__RANGE_CHECK_ENABLES, (rce & 0xFE) | (scaling == 1));
}


void VL6180X_ConfigureDefault()
{
  VL6180X_WR_CMD(READOUT__AVERAGING_SAMPLE_PERIOD,0x30);
  VL6180X_WR_CMD(SYSALS__ANALOGUE_GAIN, 0x46);
  VL6180X_WR_CMD(SYSRANGE__VHV_REPEAT_RATE, 0xFF);
  VL6180X_WR_CMD2(SYSALS__INTEGRATION_PERIOD, 0x0063);
  VL6180X_WR_CMD(SYSRANGE__VHV_RECALIBRATE, 0x01);
  VL6180X_WR_CMD(SYSRANGE__INTERMEASUREMENT_PERIOD, 0x09);
  VL6180X_WR_CMD(SYSALS__INTERMEASUREMENT_PERIOD, 0x31);
  VL6180X_WR_CMD(SYSTEM__INTERRUPT_CONFIG_GPIO, 0x24);
  VL6180X_WR_CMD(SYSRANGE__MAX_CONVERGENCE_TIME, 0x31);
  VL6180X_WR_CMD(INTERLEAVED_MODE__ENABLE, 0);
  VL6180X_SetScaling(1);
}

void VL6180X_SetTimeout(uint16_t timeout)
{ 
  io_timeout = timeout; 
}

uint8_t VL6180X_Start_Range()
{
  VL6180X_WR_CMD(0x018,0x01);
  return 0;
}
  
uint16_t timeoutcnt=0;

/*poll for new sample ready */
uint8_t VL6180X_Poll_Range()
{
    uint8_t status;
    uint8_t range_status;
    status=VL6180X_ReadByte(0x04f);
    range_status=status&0x07;
    while(range_status!=0x04)
    {
        timeoutcnt++;
        if(timeoutcnt > io_timeout)
        {
            break;
        }
        status=VL6180X_ReadByte(0x04f);
        range_status=status&0x07;
        delay_ms(1);
    }          
    return 0;
}
   
  
/*read range result (mm)*/
uint8_t VL6180_Read_Range()
{
    int range;
    range=VL6180X_ReadByte(0x062);
    return range;
}
  
/*clear interrupt*/
void VL6180X_Clear_Interrupt()
{
  VL6180X_WR_CMD(0x015,0x07); 
}

uint16_t VL6180X_ReadRangeSingleMillimeters() 
{
    /*Start Single measure mode*/
    VL6180X_Start_Range();
    /* Wait for measurement ready. */
    VL6180X_Poll_Range();
    delay_ms(100);
    return (uint16_t)scaling * VL6180_Read_Range();
}

vl6180x.h:

#ifndef __VL6180X_H
#define __VL6180X_H

#include "main.h"
#include "i2c.h"
#include "tim.h"


uint8_t VL6180X_Start_Range(void);
uint8_t VL6180X_Poll_Range(void);
uint8_t VL6180_Read_Range(void);
uint16_t VL6180X_ReadRangeSingleMillimeters(void);
void VL6180X_Clear_Interrupt(void);

uint8_t VL6180X_Init(void);
void VL6180X_ConfigureDefault(void);
void VL6180X_SetScaling(uint8_t new_scaling);
void VL6180X_SetTimeout(uint16_t timeout);



#endif

这里笔者用的是I2C1,读者要是用其他I2C,只需要对

void VL6180X_WR_CMD(uint16_t cmd, uint8_t data)
void VL6180X_WR_CMD2(uint16_t cmd, uint8_t data)
uint8_t VL6180X_ReadByte(uint16_t reg)

中的HAL_I2C_Master_XXXXX进行修改就好了。


测试

笔者用的STM32F767进行开发的,然后用串口进行输出

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MPU Configuration--------------------------------------------------------*/
  MPU_Config();

  /* 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_TIM3_Init();
  MX_USART1_UART_Init();
  MX_I2C1_Init();
  /* USER CODE BEGIN 2 */
    
  while(!VL6180X_Init());
  VL6180X_ConfigureDefault();
  VL6180X_SetTimeout(2);
  VL6180X_SetScaling(1);
    
  printf("test!\r\n");
    
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
    uint16_t distance = VL6180X_ReadRangeSingleMillimeters();
    printf("%04d\r\n", distance);
    delay_ms(900);
        
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

整个项目模板是有STM32CUBEMX生成的,所以这里我直接上main()函数了,注意需要串口重定向哦~

usart.c:

#pragma import(__use_no_semihosting)                          
struct __FILE 
{ 
    int handle; 
}; 

FILE __stdout;

void _sys_exit(int x) 
{ 
    x = x; 
} 

int fputc(int ch, FILE *f)
{     
    while((USART1->ISR&0X40)==0);//Ñ­»··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï   
    USART1->TDR=(uint8_t)ch;      
    return ch;
}

串口输出情况:


缩放因子

上述实验是使用缩放因子为1的 VL6180X_SetScaling(1);

其测量距离 2-18cm

根据手册,其实在不同缩放因子下,测量距离范围是不一样的,并且误差大小也不一样。

这里第二个"Scaling factor = 1"应该是写错了,改成"Scaling factor = 2"

也就是最大测量范围的值,实际上到不了这个距离,大概80~90%。

事实上,不仅有上限范围,下线范围也有变化,这个是我多次测量后发现数据不对劲所总结出来的。大概:

  • Scaling factor = 2测量范围是20~40cm,需要做数据拟合矫正数据

  • Scaling factor = 3测量范围是40~60cm,需要做数据拟合矫正数据

似乎不是线性关系,应该要二次函数拟合


简评

可能TOF050F版本会少这些破事,能通过上位机直接矫正,TOF050C只有通过自己多次测量,去调整寄存器的矫正参数,确实不是那么的好用哈。还是建议大家使用TOF050F版本。

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

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

相关文章

案例08-让软件的使用者成为软件的设计者

一&#xff1a;背景介绍 对于需求的开发每天可能都会有上线的情况&#xff0c;为了防止每次上线拉取代码或者修改配置而引发的冲突以及发生了冲突应该找谁一起确定一下代码留下那一部分的情况。所以在开发的群中会有一个表格来记录每个需求上线修改的环境、是否修改数据库、是否…

【论文阅读】Research on video adversarial attack with long living cycle

论文链接&#xff1a;添加链接描述 Method OPTIMIZATION PROBLEM DESCRIPTION XXX是浮点数域中的对抗视频示例&#xff0c;XcX_cXc​表示encoded的视频对抗示例。设EXˆ−XE Xˆ−XEXˆ−X表示在对抗中增加的扰动&#xff0c;EcXc−XE_c Xc − XEc​Xc−X表示视频压缩编码损…

【线性筛+DP】最大和

看错题了&#xff0c;呃呃&#xff0c;其实就是个简单DP最大和 - 蓝桥云课 (lanqiao.cn)题意&#xff1a;思路&#xff1a;设dp[i]为以1为终点的最大和&#xff0c;然后枚举状态和决策就行了主要是线性筛的应用&#xff0c;它可以预处理出一个数的最小质因子是多少Code&#xf…

如何用BurpSuite抓取手机数据包

文章目录前言准备工具Burp Suite物理机或虚拟机(移动设备)手机抓包网络环境开启burp并设置代理手机配置代理安装Burp证书开始抓包踩坑后记前言 最近挖了一波src&#xff0c;挖来挖去发现有很多公众号或者app没有测试&#xff0c;这就需要Burp能够抓取手机的数据包了&#xff0…

九州云出席全球人工智能开发者先锋大会,圆桌论道开源未来

2月25日-26日&#xff0c;2023年全球人工智能开发者先锋大会&#xff08;GAIDC&#xff09;在临港成功召开。本届盛会以“向光而行的开发者”为主题&#xff0c;汇集政府职能部门领导、国内外知名专家学者、具有国际影响力的开源创业者&#xff0c;聚焦前瞻探索、开源开放、人才…

Linux gcc/g++编译链接头文件和库(动态库.so 和 静态库.a)

最近在学习log4cpp库时&#xff0c;使用g去编译&#xff0c;却发现自己不会链接...&#xff0c;这哪能行&#xff0c;于是网上钻研&#xff0c;终于解决&#xff0c;现在记录下来分享给遇到同样问题的人。 gcc和g类似&#xff0c;这里就以g为例&#xff01; 刚好用到的log4cpp…

测开:vue入门(1)

目录 一、背景 二、介绍 三、创建项目 3.1 创建vue项目 方式二&#xff1a;直接在html页面中&#xff0c;引入vue 3.2 直接在html页面中&#xff0c;引入vue 3.2.1 引入在线的vue&#xff08;方式一&#xff09; 3.2.2 将vue 下载到本地&#xff08;方式二&#xff09; …

代码随想录算法训练营第二天| 977. 有序数组的平方、209. 长度最小子数组、59.螺旋矩阵II

977 有序数组的平方题目链接&#xff1a;977 有序数组的平方介绍给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。思路看到题目的第一反应&#xff0c;首先负数的平方跟正数的平方是相同的&…

Git系列:常见指令辨析

Git系列&#xff1a;常见指令辨析指令辨析工作区、暂存区、版本库傻傻分不清楚&#xff1f;主干和分支的关系是什么&#xff1f;git fetch/merge/pull辨析日志查看时&#xff0c;git log与git reflog的区别是&#xff1f;git diff和status的区别是&#xff1f;相关资料本文小结…

麒麟系统安全管理工具kysec机制详解

DAC访问控制 Linux下有多种权限控制的机制,常见的有:DAC(Discretionary Access Control)自主式权限控制和MAC(Mandatory Access Control)强制访问控制。 Linux上传统的访问控制标准是自主访问控制Discretionary Access Control(DAC)。在这种形式下,一个软件或守护进程以…

【MyBatis】源码学习 05 - 关于 xml 文件解析的分析

文章目录前言参考目录学习笔记1、章节目录概览2、14.3&#xff1a;SqlSourceBuilder 类与 StaticSqlSource 类3、14.4.2&#xff1a;ResultMapResolver 类3.1、测试代码说明3.2、结果集 userMap 解析流程3.3、结果集 getGirl 解析流程3.4、鉴别器 discriminator 解析流程4、14.…

汽车电子CAN协议上位机软件的设计实现

先不说汽车电子,通常上位机软件如何实现呢?作为控制嵌入式设备的PC端软件,主要功能就是配置和读取嵌入式设备基于特定接口的交互信息,所以首先需要控制一个通讯设备作为中间的通讯媒介。比如sscom5.13.1就可以作为上位机软件工具,它需要一个具有usb转UART通讯的接口设备或…

C#中,Elasticsearch.Net判断空字符串

之前有个业务需求&#xff0c;由于最开始存储到es里的&#xff0c;是默认空字符串&#xff0c;后面程序取数据时&#xff0c;发现需要取空字符串的数据时&#xff0c;不好取出来。 字符串的字段如图&#xff1a; 实际数据如图&#xff1a; 用的是C#语言&#xff0c;使用的是E…

【算法笔记】递归与回溯

递归与回溯 To Iterate is Human, to Recurse, Divine. —L. Peter Deutsch 人理解迭代&#xff0c;神理解递归。 —L. Peter Deutsch 1.什么是递归呢 递归形象描述&#xff1a; 你打开面前这扇门&#xff0c;看到屋里面还有一扇门。 你走过去&#xff0c;发现手中的钥匙还可以…

【Spark分布式内存计算框架——Spark Streaming】11. 应用案例:百度搜索风云榜(下)实时窗口统计

5.5 实时窗口统计 SparkStreaming中提供一些列窗口函数&#xff0c;方便对窗口数据进行分析&#xff0c;文档&#xff1a; http://spark.apache.org/docs/2.4.5/streaming-programming-guide.html#window-operations 在实际项目中&#xff0c;很多时候需求&#xff1a;每隔一…

数智未来,AI赋能——第四届OpenI/O 启智开发者大会昇腾人工智能应用专场圆满举行!

为提升启智社区与鹏城实验室在人工智能开源领域的影响力&#xff0c;促进社区成员与开源生态圈伙伴的合作。2月25日上午&#xff0c;第四届OpenI/O 启智开发者大会昇腾人工智能应用专场分论坛在深圳人才研修院举办&#xff0c;进一步促进与发挥企业间资源共通的优势&#xff0c…

【ROS2知识】关于colcon编译和ament指定

一、说明 这里说说编译和包生成的操作要点&#xff0c;以python包为例。对于初学者来说&#xff0c;colcon和ament需要概念上搞清楚&#xff0c;与此同时&#xff0c;工作空间、包、节点在一个工程中需要熟练掌握。本文以humble版的ROS2&#xff0c;进行python编程的实现。 二、…

【408之计算机组成原理】计算机系统概述

目录前言一、计算机的发展历程1. 计算机发展的四代变化2. 计算机元件的更新换代3. 计算机软件的发展二、计算机系统层次结构1. 计算机系统的组成2. 冯诺依曼体系结构3. 计算机的功能部件1. 输入设备2. 输出设备3. 存储器4. 运算器5. 控制器三、 分析计算机各个部件在执行代码中…

【算法】阿里面试题-编码实现20亿个整数,找出某个数X是否存在其中

1.海量数据去重-BitMap位图解决方案 需求&#xff08;面试题&#xff09; 一个32位4G内存的操作系统&#xff0c;在20亿个整数&#xff0c;找出某个数X是否存在其中 假如是java语言&#xff0c;int占4字节&#xff0c;1字节8位&#xff08;1 byte 8 bit&#xff09; 方式一&…

Mockito 入门

目录1.什么是 Mock 测试&#xff1f;2.Mockito简介3.在 SpringBoot 单元测试中使用 Mockito3.1 Maven依赖&#xff1a;3.2 UserService.java3.3 User.java3.4 thenReturn系列方法&#xff08;测试桩&#xff09;3.5 thenThrow系列方法3.6 verify 系列方法4.Spring中mock任何容器…