软件SPI读写W25Q64 输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入包装四个SPI通信引脚在初始化函数里,SS默认高电平,SCK默认是低电平接下来开始写SPI的三个时序基本单元开始函数停止函数交换一个字节。
【c语言】自定义类型:结构体详解 结构体类型的声明结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。结构的声明struct tagint member;}variable;struct Stu//名字int age;//年龄//性别//学号//分号不能丢结构体变量的创建和初始化struct Stu//名字int age;//年龄//性别//学号int main()//按照结构体成员的顺序初始化。
SPI外设简介 左上角移位寄存器右边的数据低位,一位一位的,从MOSI移出去然后MISO的数据一位一位的移入到左边的数据高位移位寄存器是一个右移的状态LSBFIRST标志位可以控制是低位先行还是高位先行发送缓冲寄存器TDR和接收缓冲寄存器RDR占用同一个地址,统一叫做DR发送数据先写入TDR,再转到移位寄存器发送,发送的同时接收数据,等到八位数据从移位寄存器发送完,移位寄存器也移入了8位通过MISO来的数据,接收到的数据转到RDR,置标志位RXNE为1,然后读取数据。
【c语言】atoi函数---使用和模拟实现(详解) atoi函数---使用和模拟实现atoi函数在Cplusplus中的定义atoi函数的使用#include <stdio.h>#include <stdlib.h>int main(){ char arr[20] = "4831213"; int ret = 0; ret = atoi(arr); printf("arr:%s", arr); printf("ret:%d", ret); return 0;}at
【c语言】数据在内存中的存储---浮点数在内存中的存储 但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存⼊内存时E的真实值必须再加上⼀个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。那么,第⼀位的符号位S=0,有效数字M等于001后⾯再加20个0,凑满23位,指数E等于3+127=130,即10000010。对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M。对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M。
【stm32】SPI通信简介 所有SPI设备的SCK、MOSI、MISO分别连在一起从主机引出多根SS选择线,分别接到每个从机的SS输入端,主机的SS线都是输出,从机的SS线都是输入,SS线 是低电平有效,同一时间主机只能选择一个从机 只能置一个SS为低电平SPI引脚的配置:输入引脚配置为推挽输出,输入引脚配置为浮空或上拉输入MISO引脚、主机一个是输入,但是从机多个是输出,如果多个从机始终是推完输出,会导致冲突,在SPI协议里有一条规定,当从记得SS引脚为高电平,也就是未被选中时,他的MISO引脚必须切换为高阻态。
【stm32】软件I2C读写MPU6050 首先建立通信层的.c和.h模块在通信层里写好I2C底层的GPIO初始化以及6个时序基本单元写好I2C通信层之后,再建立MPU6050的.c和.h模块基于I2C通信的模块,来实现指定地址读、指定地址写再实现写寄存器对芯片进行配置都寄存器得到传感器数据最终在main.c里调用MPU6050的模块初始化拿到数据显示数据这就是程序的基本架构。
【stm32】I2C通信外设 如果简单应用,选择软件I2C。如果对性能指标要求比较高 选择硬件I2C有硬件电路自动反转引脚电平,软件只需要写入控制寄存器CR和数据寄存器DR 为了实时监控时序的状态,还要读取状态寄存器SR写入控制寄存器CR,就相当于踩油门、打方向盘 控制汽车的运行读取状态寄存器SR,就像是观看仪表盘首先移位寄存器和数据寄存器DR的配合是通信的核心部分因为I2C是高位先行,所以这个移位寄存器是向左移位,在发送的时候最高位先移出去,然后是次高位,移位8次,由高到低位,依次放到SDA线上。
【c语言】自定义类型:枚举类型【详解】 在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐较严格。这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤。我们可以使⽤ #define 定义常量,为什么⾮要使⽤枚举?和#define定义的标识符⽐较枚举有类型检查,更加严谨。{}中的内容是枚举类型的可能取值,也叫 枚举常量。⼀周的星期⼀到星期⽇是有限的7天,可以⼀⼀列举。性别有:男、⼥、保密,也可以⼀⼀列举。⽉份有12个⽉,也可以⼀⼀列举。
【c语言】自定义类型:联合体(公用体)【详解】 上述的结构其实设计的很简单,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。所以我们就可以把公共属性单独写出来,剩余属于各种商品本⾝的属性使⽤联合体起来,这样就可以介绍所需的内存空间,⼀定程度上节省了内存。⽐如,我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。的,这样⼀个联合变量的大小,⾄少是最⼤成员的大小(因为。我们再对⽐⼀下相同成员的结构体和联合体的内存布局情况。给联合体其中⼀个成员赋值,其他成员的值也跟着变化。
【stm32】USART编码部分--串口数据包 如果想要发送Hex数据包,定义一个数组填充数据,然后使用串口模块函数SendArray进行发送如果想要发送文本数据包,写一个字符串然后调用SendString进行发送对于发送数据包很简单,因为发送过程完全是自主可控的,想法啥就发啥。
【stm32】USART编码部分--详细步骤 USART_ClockInit 和 USART_ClockStrustInit 用来配置同步时钟输出的,包括时钟是不是要输出,时钟的极性相位等参数USART_DMACmd 可以开启USART到DMA的触发通道USART_SendData 发送数据USART_ReceiveData 接收数据*发送和接收的时候用*
USART概念部分 发送移位寄存器—TX,RX—接收移位寄存器发送数据寄存器和接收数据寄存器占用同一个地址,在程序上只表现为一个寄存器,就是数据寄存器DR,实际硬件中分成两个,一个用于发送的TDR,一个用于接收的RDR,TDR只写,RDR只读当进行写操作时,数据就写到TDR,当进行读操作时,数据就从RDR读出发送移位寄存器,把数据一位一位的移出去,接收移位寄存器,把数据一位一位的读进来。
【c语言】数据在内存中的存储--大小端字节序和字节序判断 数据在内存中的存储1.整数在内存中的存储整数的2进制表⽰⽅法有三种,即 原码、反码和补码有符号的整数,三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表示“正”,⽤1表示“负”,最⾼位的⼀位是被当做符号位,剩余的都是数值位。正整数的原、反、补码都相同负整数的三种表⽰⽅法各不相同原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码反码:将原码的符号位不变,其他位依次按位取反就可以得到反码补码:反码+1就得到补码对于整形来说:数据存放内存中其实存放的是补码。