STM32--微项目14-手撸I2C通讯、实现MPU6050六轴传感器控制

2023-05-16

一、微项目实现目标:

STM32通过两个GPIO端口,通过代码配置成I2C通讯状态,通过I2C通讯与MPU6050进行信息交互,包括配置MPU6050寄存器配置、获取MPU6050寄存器状态;

二、微项目硬件配置需求:

stm32F103C8T6核心板一块

0.96寸OLED显示,

MPU6050六轴传感器

 

三、前置知识:

1,I2C在STM32中,有两种方式:①软件用任意的GPIO口实现数据I2C功能;②使用STM32自带的I2C模块,配置库函数实现I2C通讯;本文采用方式①

2,I2C通讯简介

①硬件配置

两根通信线:SCL(时钟控制)、SDA(数据传送、接受);

同步,半双工,带数据应答(ACK\NACK);

②接线状态

所有SCL线的控制,始终由主机控制,产生对应的时序

SDA线的控制,可以由主机或者从机。

主机控制时刻,数据由主机进行数据发送,对应地址的从机进行数据接受,当需要从机进行回复ACK或者从机传递数据到SDA时刻,则主机将SDA数据置为高,表示释放总线;

从机发送数据,当需要主机回复ACK或者交由主机传递数据时刻,从机将SDA置为高,表示释放总线

③端口配置,SDA和SCL配置为端口开漏输出;开漏输出呈现为低电平导通,拉高时呈现高阻态

3,I2C通讯模式

①启动位:

在SCL高电平状态下,SDA位从高置为低电平

ps:在正常数据传递模式下,在SCL高电平状态,SDA位不需要变化电平,保证了数据启动位有别于正常的数据传送位;

②停止位

 在SCL高电平状态下,SDA位从高置为低电平

③主机接受数据

1   - I2C中,数据的传递和接受是高位先行的原则; 

2,在SCL低电平时刻,主机负责对SDA调整电平状态(按照实际放的数据位状态,进行配置)

在SCL高电平时刻,SDA不允许进行电平变化;

3-在I2C位高电平时刻,主机接受来自SDA上的数据;

4-在从机发送数据时刻,主机拉高SDA释放SDA控制权

④主机发送数据

1- 数据高位先行原则

2- 在SCL低电平时刻,主机负责SDA调整电平状态(按照实际放的数据位状态,进行配置)

在SCL高电平时刻,SDA不允许进行电平变化;

3-在I2C位高电平时刻,主机接受来自SDA上的数据;

⑤主机发送ACK、NACK

与主机发送给数据类似,发送0表示ACK,发送1表示NACK;

⑥从机发送ACK\NACK

与从机发送给数据类似,发送0表示ACK,发送1表示NACK;(从机发送数据时刻,需要主机拉高SDA,释放SDA总线)

4,I2C整体实现MPU6050指定地址写

主要需要注意的是,在外设寄存器中,通过指针操作,通过I2C访问一次寄存器后,寄存器的指针会主动递增,如果需要反复操纵一个寄存器位,则需要重新启动位,重新指定寄存器地址;

启动位+写入MPU地址+等待从机ACK+写入寄存器地址+等待从机ACK+发送数据data+等待从机ACK+停止位

5,I2C整体实现MPU6050指定地址读

启动位+写入MPU6050地址(写)+等待ACK+写入要读取的寄存器地址+等待ACK+重新启动+写入MPU6050地址(读)+等待ACK+主机释放SDA+接受从机数据+主机发送NACK不再接受数据+停止位

 6,MPU6050模块介绍

①MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合

②一般用在飞控和平衡车中使用

 ③MPU6050地址数据

1101000(AD0=0)或者(AD0=1),bit0的数字主要根据MPU6050的接地引脚决定;

④MPU6050数据处理流:

传感器采集数据 产生模拟信号----ADC转化通道转为数字量---转移到寄存器中

ps:此处类似ADC的连续循环转化模式,实际在应用中,只需要不停的读取对应数据寄存器的数据即可;

 ⑤MPU6050的寄存器描述

#define    MPU6050_SMPLRT_DIV        0x19   //分频系数
#define    MPU6050_CONFIG            0x1A      //配置低通滤波
#define    MPU6050_GYRO_CONFIG        0x1B  //配置GYRO的量程
#define    MPU6050_ACCEL_CONFIG    0x1C   // 配置ACCE的量程

#define    MPU6050_ACCEL_XOUT_H    0x3B
#define    MPU6050_ACCEL_XOUT_L    0x3C
#define    MPU6050_ACCEL_YOUT_H    0x3D
#define    MPU6050_ACCEL_YOUT_L    0x3E
#define    MPU6050_ACCEL_ZOUT_H    0x3F
#define    MPU6050_ACCEL_ZOUT_L    0x40
#define    MPU6050_TEMP_OUT_H        0x41
#define    MPU6050_TEMP_OUT_L        0x42
#define    MPU6050_GYRO_XOUT_H        0x43
#define    MPU6050_GYRO_XOUT_L        0x44
#define    MPU6050_GYRO_YOUT_H        0x45
#define    MPU6050_GYRO_YOUT_L        0x46
#define    MPU6050_GYRO_ZOUT_H        0x47
#define    MPU6050_GYRO_ZOUT_L        0x48  //对应数据的高低位

#define    MPU6050_PWR_MGMT_1        0x6B
#define    MPU6050_PWR_MGMT_2        0x6C
#define    MPU6050_WHO_AM_I        0x75

四、代码逻辑分析:

在myI2C模块中:

①开启GPIO时钟、配置PA10\PA11为开漏输出模式,并且初始化为高电平;

②配置SCL写入模块、配置SDA写入模块、配置SDA读取模块

③配置I2C启动模块

④配置I2C停止模块

⑤配置I2C发送一个字节

⑥配置I2C读取一个字节

⑦配置I2C发送ACK/NACK

⑧配置I2C接受ACK/NACK

在MPU6050模块中:

①读一个寄存器地址的数据

②向寄存器地址内写入数据

③初始化模块

包括,MYI2C模块初始化、配置初始化MPU6050寄存器

④解析数据,将数据高低自字节合并,并通过指针传递将数据传递出来

五、代码示例:

在myI2C模块中:

①开启GPIO时钟、配置PA10\PA11为开漏输出模式,并且初始化为高电平;

void myi2c_init(void)
{
	//开启PB10\PB11时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	//配置GPIO端口,开漏输出模式
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_OD;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10 |GPIO_Pin_11;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init( GPIOB,&GPIO_InitStruct);
	
	GPIO_SetBits(GPIOB,GPIO_Pin_10 |GPIO_Pin_11);//初始化高电平

}

②配置SCL写入模块、配置SDA写入模块、配置SDA读取模块

//SCL写入
void myi2c_W_SCL(uint8_t mybit)
{
	GPIO_WriteBit( GPIOB, GPIO_Pin_10, (BitAction)mybit);//强转类型BitAction
	Delay_us(10);//做10us延时
}

//SDA写入
void myi2c_W_SDA(uint8_t mybit)
{
	GPIO_WriteBit( GPIOB, GPIO_Pin_11, (BitAction)mybit);//强转类型BitAction
	Delay_us(10);
}
//SDA读取
uint8_t myi2c_R_SDA(void)
{
	uint8_t mybit=0;
	mybit= GPIO_ReadInputDataBit( GPIOB, GPIO_Pin_11);
	Delay_us(10);
	return mybit;
}

③配置I2C启动模块

//起始条件:SCL高电平期间,SDA从高电平切换到低电平

void myi2c_start(void)
{
	myi2c_W_SDA(1);
	myi2c_W_SCL(1);
	myi2c_W_SDA(0);
	myi2c_W_SCL(0);
}

④配置I2C停止模块

//终止条件:SCL高电平期间,SDA从低电平切换到高电平
void myi2c_stop(void)
{
	myi2c_W_SDA(0);
	myi2c_W_SCL(1);
	myi2c_W_SDA(1);
}

⑤配置I2C发送一个字节

//发送一个字节
void myi2c_sendbyte(uint8_t mybyte)
{
	uint8_t i;
	for(i=0;i<8;i++)
	{
		myi2c_W_SDA(mybyte&(0x80>>i));//高位先行
		myi2c_W_SCL(1);
		myi2c_W_SCL(0);//写完一个后,置为低电平,等待SDA转化为对应数据
	}
}

⑥配置I2C读取一个字节,高位先入

//接受一个字节数据
uint8_t myi2c_receivebyte(void)
{
	uint8_t mybyte=0;
	uint8_t i;
	myi2c_W_SDA(1);//释放SDA
	
	for(i=0;i<8;i++)
	{
		myi2c_W_SCL(1);
		if(myi2c_R_SDA())
		{
			mybyte=mybyte|(0x80>>i);
		}
		myi2c_W_SCL(0);
	}
	
	return mybyte;
}

⑦配置I2C发送ACK/NACK

//发送应答
void myi2c_sendACK(uint8_t ackbit)
{
	myi2c_W_SDA(ackbit);
	myi2c_W_SCL(1);
	myi2c_W_SCL(0);
}

⑧配置I2C接受ACK/NACK

//接受应答

uint8_t myi2c_receiveACK(void)
{
	uint8_t re_ack;
	myi2c_W_SDA(1);//释放总线
	myi2c_W_SCL(1);
	re_ack=myi2c_R_SDA();
	myi2c_W_SCL(0);
	return re_ack;
	
}

在MPU6050模块中:

①读一个寄存器地址的数据

启动位+写入MPU6050地址(写)+等待ACK+写入要读取的寄存器地址+等待ACK+重新启动+写入MPU6050地址(读)+等待ACK+主机释放SDA+接受从机数据+主机发送NACK不再接受数据+停止位

//读寄存器地址
uint8_t MPU6050_read(uint8_t address)
{
	uint8_t read_data;
	myi2c_start();
	myi2c_sendbyte(MPU6050);//发送设备地址
	myi2c_receiveACK();//获取ACK
	myi2c_sendbyte(address);//发送读寄存器地址
	myi2c_receiveACK();//获取ACK
	//此处要重新start,因为读写一个寄存器后,再继续操作,寄存器会跳到下一位,所以要重新指定
	myi2c_start();
	myi2c_sendbyte(MPU6050|0x01);//发送设备地址,读操作
	myi2c_receiveACK();//获取ACK
	read_data=myi2c_receivebyte();//接受
	myi2c_sendACK(1);//发送NACK,不再继续接受
	myi2c_stop();
	
	return read_data;
	
}

②向寄存器地址内写入数据

启动位+写入MPU地址+等待从机ACK+写入寄存器地址+等待从机ACK+发送数据data+等待从机ACK+停止位

//写寄存器地址
void MPU6050_Write(uint8_t address,uint8_t write_data)
{
	myi2c_start();
	myi2c_sendbyte(MPU6050);//发送设备地址
	myi2c_receiveACK();//获取ACK
	myi2c_sendbyte(address);//发送写寄存器地址
	myi2c_receiveACK();//获取ACK
	myi2c_sendbyte(write_data);//发送数据
	myi2c_receiveACK();//获取ACK
	myi2c_stop();
}

③初始化MPU6050模块

void MPU6050_init(void)
{
	myi2c_init();
	//配置MPU6050
	MPU6050_Write(MPU6050_PWR_MGMT_1,0x01);
	MPU6050_Write(MPU6050_PWR_MGMT_2,0x00);
	MPU6050_Write(MPU6050_SMPLRT_DIV, 0x09);
	MPU6050_Write(MPU6050_CONFIG, 0x06);
	MPU6050_Write(MPU6050_GYRO_CONFIG, 0x18);
	MPU6050_Write(MPU6050_ACCEL_CONFIG, 0x18);
	
}

④解析数据,将数据高低自字节合并,并通过指针传递将数据传递出来

void MPU6050_getdata(int16_t *Ax,int16_t *Ay,int16_t *Az,
	                  int16_t *Gx , int16_t *Gy,int16_t *Gz )
{
	uint16_t dataH=0,dataL=0;
	dataH =MPU6050_read(MPU6050_ACCEL_XOUT_H);
	dataL =MPU6050_read(MPU6050_ACCEL_XOUT_L);
	*Ax=(dataH<<8)|dataL;
	
	dataH =MPU6050_read(MPU6050_ACCEL_YOUT_H);
	dataL =MPU6050_read(MPU6050_ACCEL_YOUT_L);
	*Ay=(dataH<<8)|dataL;
	
	dataH =MPU6050_read(MPU6050_ACCEL_ZOUT_H);
	dataL =MPU6050_read(MPU6050_ACCEL_ZOUT_L);
	*Az=(dataH<<8)|dataL;	
	
	dataH =MPU6050_read(MPU6050_GYRO_XOUT_H);
	dataL =MPU6050_read(MPU6050_GYRO_XOUT_L);
	*Gx=(dataH<<8)|dataL;	
	
	dataH =MPU6050_read(MPU6050_GYRO_YOUT_H);
	dataL =MPU6050_read(MPU6050_GYRO_YOUT_L);
	*Gy=(dataH<<8)|dataL;	
	
	dataH =MPU6050_read(MPU6050_GYRO_ZOUT_H);
	dataL =MPU6050_read(MPU6050_GYRO_ZOUT_L);
	*Gz=(dataH<<8)|dataL;

}

在主函数中进行配置

#include "stm32f10x.h"                  // Device header
#include "delay.h"
#include "OLED.H"
#include "MPU6050.H"

int16_t ACCX,ACCY,ACCZ,GYROX,GYROY,GYROZ;


int main()
{
	OLED_Init();
	MPU6050_init();
	
	
	
	
	
	OLED_ShowString(1,3,"HELLOWORLD");

	
	while(1)
	{
	 MPU6050_getdata(&ACCX,&ACCY,&ACCZ,&GYROX,&GYROY,&GYROZ);
	 OLED_ShowSignedNum(2,1,ACCX,5);
	 OLED_ShowSignedNum(3,1,ACCY,5);
	 OLED_ShowSignedNum(4,1,ACCZ,5);
     OLED_ShowSignedNum(2, 8, GYROX, 5);
	 OLED_ShowSignedNum(3, 8, GYROY, 5);
	 OLED_ShowSignedNum(4, 8, GYROZ, 5);
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32--微项目14-手撸I2C通讯、实现MPU6050六轴传感器控制 的相关文章

  • 路径规划学习入门

    运动规划简介 当虚拟人开始一次漫游时 xff0c 首先全局规划器根据已有的长期信息进行全局静态规划 xff0c 确定虚拟人应该经过的最优化路线 然后全局规划器控制执行系统按照该路径运动 在运动过程中 xff0c 感知系统会持续对周围环境进行
  • 测试开发工程师面试题目

    测试开发工程师面试题目 1 什么是兼容性测试 兼容性测试侧重哪些方面 主要检验的是软件的可移植性 xff0c 检查软件在不同的硬件平台软件平台上是否可以正常的运行 细分会有 xff1a 平台的兼容 xff0c 网络兼容 xff0c 数据库兼
  • 【ROS2】四、使用tf坐标变换实现小海龟跟随

    1 创建功能包 创建工作空间并在工作空间下创建功能包 xff1a span class token function mkdir span p turtle tf ws src span class token builtin class
  • 滑模控制简单理解(hm-1)

    变结构控制 xff08 VSC xff09 是一种特殊的非线性控制器 xff0c 表现为控制的不连续性 xff0c 又称滑模控制 xff08 SMC xff09 一般步骤为滑模面的设计 趋近率的设计 控制器的求解 滑模控制的理解 如图所示
  • BP神经网络的数学本质

    原创文章 xff0c 转载请说明来自 老饼讲解 BP神经网络 xff1a bp bbbdata com 目录 一 隐神经元与tansig函数 二 BP本质 三 BP神经网络的曲线拟合要素 一 误差函数 二 拟合基函数 三 待解参数与求解算法
  • GAZEBO_PLUGIN_PATH 设置方法

    http answers gazebosim org question 13391 how to set gazebo plugin path correctly and add the plugin into gazebo ros Hi
  • Linux 0.11 系统调用的实现机制

    Linux 0 11 系统调用的实现机制 一 系统调用概述 系统调用本质上是一种中断 xff0c 中断号为0x80 xff0c 即128号中断 通常我们使用的是库函数 xff0c 而不是直接使用系统调用 xff0c 这主要是因为库函数一般都
  • 滤波算法及优缺点

    传感器比如关节力矩传感器采用滑动平均滤波算法 xff0c 滤波点数选1则为原始数据 xff0c 选点数100则采样100个求平均 点数越大滤波延迟越大 xff0c 越平滑 所以需要根据实际项目测试 在matlab中采用了三种滤波方法 xff
  • putty支持多标签,支持log每行加时间

    在现在的免费telnet 串口连接工具中 Tera Term 支持脚本ttl 且有每行时间记录 有一个不好的是个终端连接不友好 xff0c 也能用 xff0c 就是看起来不方便 xff0c 是一个外挂的补丁 putty 不支持多标签 不支持
  • Jetson xavier nx 入门系列—— jeston系列性能对比

    官方对比网址 xff1a https developer nvidia com embedded develop hardware family 算力对比 参考 xff1a https blog csdn net u013673476 ar
  • 在C语言中,字符串总是以‘\0‘作为结尾

    字符串结束标志 xff08 划重点 xff09 字符串是一系列连续的字符的组合 xff0c 要想在内存中定位一个字符串 xff0c 除了要知道它的开头 xff0c 还要知道它的结尾 找到字符串的开头很容易 xff0c 知道它的名字 xff0
  • cmake 学习笔记(一)

    最大的Qt4程序群 KDE4 采用cmake作为构建系统Qt4的python绑定 pyside 采用了cmake作为构建系统开源的图像处理库 opencv 采用cmake 作为构建系统 看来不学习一下cmake是不行了 xff0c 一点一点
  • 如何用github创建博客

    1 创建一个仓库 xff0c 设置名称为用户名 github io xff0c 不然会报404 2 在设置中找到github pages选项 xff0c 选择theme 3 将仓库使用github客户端克隆到本地 4 将克隆到本地仓库内容清
  • VS创建的aspx文件下没有设计-拆分-源 并且工具箱中的控件为灰色

    首先在视图中打开工具箱 这时是没有控件的 右键点击全部显示 但是仍然是灰色 没法使用 我的 Master文件夹里有设计 拆分 源 但是aspx文件里没有 解决方法
  • 【支线】输电杆塔识别-YOLO v5在Aidlux的部署

    目录 0 前言1 模型训练1 1 任务描述1 2 输电杆塔数据集采集1 3 输电杆塔数据集标注1 4 数据增强1 5 折腾1 6 训练1 7 测试 2 NX部署2 1 软硬件2 2 Tensor RT 优化推理2 3 ROS Topic发送
  • 程序员与厨师

    不管你信不信 反正我是信了 每一个程序员上辈子都是呆在厨房的厨子 好吧 你不信 我来证明给你看 1 下厨前 你得知道做的是早餐还是中晚餐 中晚餐的话 怎么也得走趟超市 如遇到好友聚会 怎么着也得做出一桌对得起朋友的饭菜 还有你得分析 朋友中
  • 用研扬科技的UP Square做软路由是不是杀鸡用牛刀啊?

    折腾了好几遍终于整踏实了 xff01
  • 炎炎夏日,看小Y重燃烈焰战火——Y450外接显卡

    xfeff xfeff 目录 前言 实际效果 预算VS结算 配件开箱 硬件连接 软件环境配置 xff08 重点 xff09 前言 我家小Y已经陪伴我4年多了 xff0c 四年里 xff0c 她带给我的欢乐是超值的 xff08 联保了4年多
  • 深度学习情感分类常用方法(综述)

    论文原文 xff1a Deep Learning for Sentiment Analysis A Survey 原文地址 xff1a https arxiv org ftp arxiv papers 1801 1801 07883 pdf
  • 嵌入式单片机之stm32串口你懂了多少!!

    stm32作为现在嵌入式物联网单片机行业中经常要用多的技术 xff0c 相信大家都有所接触 xff0c 今天这篇就给大家详细的分析下有关于stm32的出口 xff0c 还不是很清楚的朋友要注意看看了哦 xff0c 在最后还会为大家分享有些关

随机推荐

  • uC/OS-II 学习笔记之:消息邮箱

    更多原创 uC OS II学习笔记之 xff1a 系列 基础及嵌入式相关知识详解 xff0c 请访问可乐虎博客 xff1a http blog csdn net dcx1205 相信不会让您失望 xff01 xff01 一 消息邮箱的概念
  • uC/OS-II 学习笔记之:信号量、消息邮箱、消息队列之间的使用区别

    更多原创 uC OS II学习笔记之 xff1a 系列 基础及嵌入式相关知识详解 xff0c 请访问可乐虎博客 xff1a http blog csdn net dcx1205 相信不会让您失望 xff01 xff01 1 用信号量进行行为
  • Python3抓取糗百、不得姐、kanqu.com

    测试电脑配置有点低 xff0c 正常配置速度会比较快 有问题可以加群 xff1a 544471255 交流 使用必看 1 该代码使用Python3 6 43 版本 2 需要安装依赖库如下 可使用类似 pip install requests
  • 基于STM32F4实现FOC(磁场定向控制)一:电流采样和波形产生

    一 xff0e ADC的配置问题 1 GPIO初始化配置 开始ADC对应的GPIO口 xff0c 本驱动程序使用到五个GPIO xff0c 分别对应U V W三相电流及母线电压和温度采样 xff0c 统一配置为模拟输入 GPIO的配置代码如
  • 基于ADRC的FOC位置环控制

    ADRC位置环控制 ADRC介绍1 非线性跟踪微分器2 非线性ESO观测器3 非线性状态误差反馈控制律原理 NLSEF 4 调参流程 xff1a 1 调TD2 调ESO3 调NLSEF 5 基于ADRC的位置环设计ADRC框图基于ADRC的
  • 结构体和联合体在通信协议解析的应用

    在串口通信中 xff0c 我们往往会解析很多协议 xff0c 而且在协议中会出现不同数据类型的协议 xff1b 当然我们也可以把协议都定义成某一种数据格式 xff0c 但是那样会出现协议的复杂度 xff0c 但是不那样处理的话 xff0c
  • ubuntu14.04 怎么查看哪个串口才是有效的搜索?

    使用以上命令 xff0c 可以看见相对应的芯片型号 比如图中的 xff0c cp210x 对应的 ttyUSB0 FT232RL 对应 ttyUSB1 minicom 命令 xff1a CTRL 43 A 然后 O xff1b
  • 13_STM32Cubeide开发_RS485总线驱动

    一 485总线和硬件电路 典型的串行通讯标准是RS232和RS485 xff0c 它们定义了电压 阻抗等 xff0c 但不对软件协议给予定义 RS 485总线标准规定了总线接口的电气特性标准即对于2个逻辑状态的定义 xff1a 正电平在 4
  • 无人机系列之飞控算法

    一 无人机的分类 按飞行平台构型分类 无人机可分为固定翼无人机 旋翼无人机 无人飞艇 伞翼无人机 扑翼无人机等 图1 无人机平台构型 多轴飞行器multirotor 是一种具有三个以上旋翼轴的特殊的直升机 旋翼的总距固定而不像一般直升机那样
  • Java中==和equals的区别

    Java中 61 61 和equal的区别为 1 61 61 表示 判断2个变量或对象实例是否指向同一个内存空间 xff0c equals 表示 判断2个变量或对象实例所指向的内存空间的值是否相同 2 61 61 表示 对内存地址进行比较
  • Android注解(annotation)介绍及其应用

    我的新书 Android App开发入门与实战 已于2020年8月由人民邮电出版社出版 xff0c 欢迎购买 点击进入详情 文章目录 介绍自定义注解注解的应用 xff1a 反射注解的应用 xff1a APT其它 介绍 Annotation
  • 源代码管理的另类比较:TortoiseGit vs SourceTree

    文章目录 源代码得管理那就Git吧图形化Git管理软件对比暗色主题图形分支与提交历史仓库与工程代码改动对比分支切换提交到多个远端仓库编码UTF8与Ansi总结 Git提供网站免费部分对比GitHubGitee华为云总结 源代码得管理 以往用
  • kali Linux使用putty远程连接输入密码一直提示错误

    使用命令打开配置文件 xff1a leafpad etc ssh sshd config 修改AddressFamily any 前面的 删除修改PermitRootLogin yes 前面的 删除 修改PasswordAuthentica
  • ros安装并测试是否安装成功

    目录 一 xff0c 安装步骤二 xff0c 测试是否安装成功 一 xff0c 安装步骤 1 xff0c 首先前4项勾选 xff0c 然后源换成国内清华的源 2 xff0c 打开终端开始输入命令 xff1a span class token
  • C++ 双冒号::符号详解

    一 作用域符号 xff1a 作用域符号 的前面一般是类名称 xff0c 后面一般是该类的成员名称 xff0c C 43 43 为例避免不同的类有名称相同的成员而采用作用域的方式进行区分 例如 xff1a A B 表示两个类 xff0c 在
  • 嵌入式软件工程师前期职业生涯规划

    ARM 43 LINUX路线 xff0c 主攻嵌入式Linux操作系统及其上应用软件开发目标 xff1a xff08 1 xff09 掌握主流嵌入式微处理器的结构与原理 xff08 初步定为arm9 xff09 xff08 2 xff09
  • 【尚医通】微信扫码登录和手机号登录冲突问题解决思路

    尚医通 微信扫码登录和手机号登录冲突问题解决思路 问题描述 最近做尚医通遇到一个问题 xff0c 微信扫码登录和手机号登录在 特殊情况 下会发生冲突 xff0c 导致无法登录的问题 下面就描述一下几种情况 正常情况 xff1a 用户第一次一
  • GitHub awesome Resource

    各种Awesome技术资源的资源聚合 xff1a https github com sindresorhus awesome Contents PlatformsProgramming LanguagesFront End Developm
  • FreeRTOS ------ 栈、堆、任务栈

    1 任务的栈资源 xff08 创建任务分配的资源 xff0c 单位是4字节 xff09 来自 configTOTAL HEAP SIZE 定义的堆 xff0c 如果任务栈总量超过 configTOTAL HEAP SIZE xff0c 任务
  • STM32--微项目14-手撸I2C通讯、实现MPU6050六轴传感器控制

    一 微项目实现目标 xff1a STM32通过两个GPIO端口 xff0c 通过代码配置成I2C通讯状态 xff0c 通过I2C通讯与MPU6050进行信息交互 xff0c 包括配置MPU6050寄存器配置 获取MPU6050寄存器状态 x