- 博客(35)
- 收藏
- 关注
原创 软件SPI读写W25Q64
输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入包装四个SPI通信引脚在初始化函数里,SS默认高电平,SCK默认是低电平接下来开始写SPI的三个时序基本单元开始函数停止函数交换一个字节。
2024-04-11 22:49:18 757
原创 【c语言】自定义类型:结构体详解
结构体类型的声明结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。结构的声明struct tagint member;}variable;struct Stu//名字int age;//年龄//性别//学号//分号不能丢结构体变量的创建和初始化struct Stu//名字int age;//年龄//性别//学号int main()//按照结构体成员的顺序初始化。
2024-04-11 11:43:53 861
原创 SPI外设简介
左上角移位寄存器右边的数据低位,一位一位的,从MOSI移出去然后MISO的数据一位一位的移入到左边的数据高位移位寄存器是一个右移的状态LSBFIRST标志位可以控制是低位先行还是高位先行发送缓冲寄存器TDR和接收缓冲寄存器RDR占用同一个地址,统一叫做DR发送数据先写入TDR,再转到移位寄存器发送,发送的同时接收数据,等到八位数据从移位寄存器发送完,移位寄存器也移入了8位通过MISO来的数据,接收到的数据转到RDR,置标志位RXNE为1,然后读取数据。
2024-04-10 22:50:50 810
原创 【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\n", arr); printf("ret:%d\n", ret); return 0;}at
2024-04-08 16:17:54 369
原创 【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。
2024-04-08 15:40:25 986
原创 【stm32】SPI通信简介
所有SPI设备的SCK、MOSI、MISO分别连在一起从主机引出多根SS选择线,分别接到每个从机的SS输入端,主机的SS线都是输出,从机的SS线都是输入,SS线 是低电平有效,同一时间主机只能选择一个从机 只能置一个SS为低电平SPI引脚的配置:输入引脚配置为推挽输出,输入引脚配置为浮空或上拉输入MISO引脚、主机一个是输入,但是从机多个是输出,如果多个从机始终是推完输出,会导致冲突,在SPI协议里有一条规定,当从记得SS引脚为高电平,也就是未被选中时,他的MISO引脚必须切换为高阻态。
2024-04-07 21:25:08 656
原创 资料获取-开源项目
我的大部分资料都已经上传gitee上,上面有两个基于stm32f103最小系统板做的两个小项目,还有嵌入式面试相关的资料,全部免费获取。
2024-04-06 22:38:21 207
原创 【stm32】软件I2C读写MPU6050
首先建立通信层的.c和.h模块在通信层里写好I2C底层的GPIO初始化以及6个时序基本单元写好I2C通信层之后,再建立MPU6050的.c和.h模块基于I2C通信的模块,来实现指定地址读、指定地址写再实现写寄存器对芯片进行配置都寄存器得到传感器数据最终在main.c里调用MPU6050的模块初始化拿到数据显示数据这就是程序的基本架构。
2024-04-06 22:30:19 1447 2
原创 【stm32】I2C通信外设
如果简单应用,选择软件I2C。如果对性能指标要求比较高 选择硬件I2C有硬件电路自动反转引脚电平,软件只需要写入控制寄存器CR和数据寄存器DR 为了实时监控时序的状态,还要读取状态寄存器SR写入控制寄存器CR,就相当于踩油门、打方向盘 控制汽车的运行读取状态寄存器SR,就像是观看仪表盘首先移位寄存器和数据寄存器DR的配合是通信的核心部分因为I2C是高位先行,所以这个移位寄存器是向左移位,在发送的时候最高位先移出去,然后是次高位,移位8次,由高到低位,依次放到SDA线上。
2024-04-05 23:32:39 1306
原创 【stm32】I2C通信协议
如果我们想要读写寄存器来控制硬件电路,就至少需要定义两个字节数据一个字节是我们要读写哪个寄存器,也就是指定寄存器的地址另一个字节就是这个地址下存储寄存器的内容。
2024-04-05 23:25:07 851
原创 【c语言】自定义类型:枚举类型【详解】
在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐较严格。这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤。我们可以使⽤ #define 定义常量,为什么⾮要使⽤枚举?和#define定义的标识符⽐较枚举有类型检查,更加严谨。{}中的内容是枚举类型的可能取值,也叫 枚举常量。⼀周的星期⼀到星期⽇是有限的7天,可以⼀⼀列举。性别有:男、⼥、保密,也可以⼀⼀列举。⽉份有12个⽉,也可以⼀⼀列举。
2024-04-04 22:43:49 312
原创 【c语言】自定义类型:联合体(公用体)【详解】
上述的结构其实设计的很简单,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。所以我们就可以把公共属性单独写出来,剩余属于各种商品本⾝的属性使⽤联合体起来,这样就可以介绍所需的内存空间,⼀定程度上节省了内存。⽐如,我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。的,这样⼀个联合变量的大小,⾄少是最⼤成员的大小(因为。我们再对⽐⼀下相同成员的结构体和联合体的内存布局情况。给联合体其中⼀个成员赋值,其他成员的值也跟着变化。
2024-04-03 16:38:22 951
原创 【stm32】USART编码部分--串口数据包
如果想要发送Hex数据包,定义一个数组填充数据,然后使用串口模块函数SendArray进行发送如果想要发送文本数据包,写一个字符串然后调用SendString进行发送对于发送数据包很简单,因为发送过程完全是自主可控的,想法啥就发啥。
2024-04-02 21:28:05 1279
原创 【stm32】USART编码部分--详细步骤
USART_ClockInit 和 USART_ClockStrustInit 用来配置同步时钟输出的,包括时钟是不是要输出,时钟的极性相位等参数USART_DMACmd 可以开启USART到DMA的触发通道USART_SendData 发送数据USART_ReceiveData 接收数据*发送和接收的时候用*
2024-04-01 21:49:57 1491
原创 USART概念部分
发送移位寄存器—TX,RX—接收移位寄存器发送数据寄存器和接收数据寄存器占用同一个地址,在程序上只表现为一个寄存器,就是数据寄存器DR,实际硬件中分成两个,一个用于发送的TDR,一个用于接收的RDR,TDR只写,RDR只读当进行写操作时,数据就写到TDR,当进行读操作时,数据就从RDR读出发送移位寄存器,把数据一位一位的移出去,接收移位寄存器,把数据一位一位的读进来。
2024-03-31 23:09:08 1428 1
原创 【c语言】数据在内存中的存储--大小端字节序和字节序判断
数据在内存中的存储1.整数在内存中的存储整数的2进制表⽰⽅法有三种,即 原码、反码和补码有符号的整数,三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表示“正”,⽤1表示“负”,最⾼位的⼀位是被当做符号位,剩余的都是数值位。正整数的原、反、补码都相同负整数的三种表⽰⽅法各不相同原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码反码:将原码的符号位不变,其他位依次按位取反就可以得到反码补码:反码+1就得到补码对于整形来说:数据存放内存中其实存放的是补码。
2024-03-30 22:23:41 1159
原创 【C语言】memmove函数的使用和模拟实现
和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。
2024-03-29 17:39:55 270 1
原创 【C语言】memcpy 使用和模拟实现
函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。如果source和destination有任何的重叠,复制的结果都是未定义的。
2024-03-28 22:29:16 522 1
原创 【C语言】strerror 函数的使用
strerror 函数可以把参数部分错误码对应的错误信息的字符串地址返回来在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在errno.h这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全局的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会将对应的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。
2024-03-27 22:47:03 395 1
原创 【C语言】strtok 函数的使用
strtok函数找到str中的下⼀个标记,并将其用\0 结尾,返回⼀个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容并且可修改。strtok函数的第⼀个参数不为NULL,函数将找到str中第⼀个标记,strtok函数将保存它在字符串中的位置。第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标记。NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标记。
2024-03-27 22:19:19 467 1
原创 【C语言】strstr函数的使用和模拟实现
Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1.(函数返回字符串str2在字符串str1中第⼀次出现的位置)。(字符串的⽐较匹配不包含\0字符,以\0作为结束标志)。
2024-03-27 15:08:20 510 1
原创 【C语言】strncpy、strncat、strncmp函数的使用
⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个。如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。如果source 指向的字符串的⻓度⼩于num的时候,只会将字符串中到 \0。的内容追加到destination指向的字符串末尾。如果num个字符都相等,就是相等返回0。
2024-03-27 14:02:26 870 1
原创 【c语言】qsort函数【详解】
qsort函数是用来排序的库函数,可以直接用来排序数据底层使用的是快速排序的方式排序算法:选择排序、冒泡排序、插入排序、快速排序、希尔排序int i = 0;int j = 0;for (i = 0;i < sz - 1;flag = 0;break;i < sz;从冒泡排序函数(bubble_sort)中可以看出,函数的形参只能是是整数。
2024-03-23 17:05:09 856 1
原创 STM32-TIM定时器
时基单元初始化,用来配置时基单元使能计数器使能中断输出,就是中断输出控制//单独配置ETR引脚的预分频器、极性、滤波器这些参数写入预分频值用来改变计数器的计数模式自动重装器预装功能配置是否有预装是可以自己选择的给计数器写入一个值给自动重装器写一个值获取当前计数器的值获取当前预分频器的值。
2024-03-23 12:32:49 1019 1
原创 STM32-EXTI外部中断
EXTI模块只有16个gpio通道,这里的每个gpio都有16个引脚,所以要通过AFIO中断引脚选择,从前面16个gpio通道选择一个连接到后面的EXTI通道所以相同的pin不能同时触发中断,也就是gpioA,gpioB,gpioC这些通过中断引脚选择只有一个能连接到到EXTI的通道0上通过AFIO选择之后的16个通道就链接到了EXTI边缘检测和控制的电路上16个GPIO通道加上PVD\RTC\USB\RTH,总共有20个输入信号。
2024-03-23 12:15:07 385 1
原创 STM32-GPIO引脚重映射
这个PA15在引脚定义表中是没有加粗,因为上电之后就已经默认复用为了调试端口JTDI所以如果想让他作为普通的GPIO或者复用定时器的通道,还需要先关闭调试端口的复用也就是这个GPIO_PinRemapConfig函数这里有三个参数,就是用来解除调试端口的复用的在这里如果我们需要用PA15、PB3、PB4这三个引脚那通常就是解除JTAG的复用,保留SWD的复用所以这里,参数我们就选SWJ_JTAGDisable这样就可以正常使用PA15这个引脚了。
2024-03-22 22:14:34 2103 1
原创 STM32串口输出汉字的方法
Utf8兼容性可能不好,可以选择GB2312,这是汉字的编码方式,然后把汉字删掉,再把文件关掉,再打开。然后在串口助手,选择utf8,就没问题了。
2024-03-22 21:48:57 1949 1
原创 C语言的分支和循环语句详解
C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实 现这三种结构的,其实我们如果仔细分析,我们⽇常所⻅的事情都可以拆分为这三种结构或者这三种 结构的组合。我们可以使⽤ ifswitch实现分⽀结构,使⽤forwhiledo while实现循环结构。1.if语句if ( 表达式 )语句在C语⾔中,0为假,⾮0表⽰真int main()printf("%d 是奇数\n", num);return 0;else语句。
2024-01-25 21:03:44 885
原创 立志从事嵌入式软件的小难生
对于嵌入式软件这个行业来说,刚从学校出来的实习生真的挺难的,已经学了很多,接下来需要学的更多,该如何一步一步的前进,其实我是没有一个明确的规划的,如果要走一步需要别人教一步,显然不现实,我只能学一步看一步,尽可能多的学到有用的知识,这半年多来我也能深知自己相比以前有了很多成长。
2024-01-16 20:06:08 328 1
嵌入式操作系统选择linux/rtos
2024-04-08
TA创建的收藏夹 TA关注的收藏夹
TA关注的人