- 博客(54)
- 收藏
- 关注
原创 STM32_IIC_AT24C02_3_读写操作
从图中可以看到,如果进行一个写的操作,也是要先发送一个启动操作,然后发送设备地址,接着发送字节地址,最后发送数据,然后停止。Tips:先发送高位,再发送低位设备地址(Device Address):IIC总线上的地址。A2,A1,A0看设备接线的电平,若A1接低电平,则为0;第八位(R/W)为0时,为写操作;第八位为1时,为读操作。接下来的代码中,Device Address设为0xA0;
2024-04-09 01:53:12
403
原创 传感器与检测技术——第四章电感式传感器
即由上行公式可知,灵敏度的大小取决于气隙的初始厚度,为一个定值。但是因为这是近似得出,实际上,其灵敏度取决于传感器工作时气隙的当前厚度。
2024-04-09 01:52:49
1306
原创 STM32_LCD1602_2_液晶屏初始化
读取忙碌信号BF的内容,当BF=1时,代表显示屏忙,暂时无法接收单片机送来的数据或指令;DB5,DB4,DB3为字符号,也就是要显示该字符时要用到的字符地址。功能:设定每次写入1为数据后光标的移动方向,并且设定每次写入的一个字符是否移动。0x38:0011 1000 (功能6:功能设定指令) //2行显示,5*7点阵,8位数据线。输入:RS=L,RW=L,E=下降沿脉冲,DB0~DB7=指令码。输入:RS=H,RW=L,E=下降沿脉冲,DB0~DB7=数据。输入:RS=L,RW=H,E=H。
2024-02-25 00:09:29
1955
原创 STM32_DS18B20_1_芯片简介及初始化配置
DS18B20数字温度计提供9位到12位摄氏度的温度测量,并具有非易失性,用户可编程的上下触发点的报警功能。DS18B20通过1线总线进行通信,根据定义,该总线只需要一条数据线,即可与中央微处理器进行通信。它的工作温度范围为-55°C到+125°C,在-10°C到+85°C的范围内精确到±0.5°C。此外,DS18B20可以直接从数据线获得电力,消除了对外部电源的需要。每个DS18B20都有一个唯一的64位串行码,它允许多个DS18B20在同一个1线总线上工作。
2024-02-24 22:44:31
2159
原创 STM32_IIC_AT24C02_1_芯片简介即管脚配置
而PB7为输入时,stm32读取AT24C02,PB7为输出时,stm32传输数据到AT24C02,所以可以把PB7的模式,来回改动,什么时候输入,就设置为输入,什么时候输出,就设置为输出。我们可以使用两个I/O口和软件的方式来模拟stm32的iic总线的控制,所以就不需要使用stm32的硬件控制器了,同理数据手册中的I2C库函数也没有用了。总之,ROM是只读存储器,内容不能修改,访问速度快,存储容量大,适用于存储固化的数据和程序;4. 存储容量:ROM的存储容量较大,可以存储大量的数据和程序。
2024-02-24 20:46:58
463
原创 Ubuntu找不到ifconfig命令 Command ‘ifconfig‘ not found, but can be installed with:sudo apt install net-too
当你输入ifconfig的时候,ubuntu找不到命令,其实它就已经跟你说了方法了。输入后此代码后,再输入密码。开始安装,安装结束后就可以了。
2024-02-23 00:13:58
846
原创 STM32 LCD1602 _1_液晶屏简介和管脚配置
GND3.3V通过电位器接地LCD1602_RSPA5PA12LCD1602_EPA13PA14PA15PA9PA10PA11PA12PB5PC13LCD1602_A3.3VLCD1602_KGND。
2024-02-23 00:12:25
815
原创 STM32 4位数码管和74HC595
当输入的数据超出并行输出的范围时,会依次顶替之前的数据,当输入16位数据时,原先输入到74HC595(1)的数据D0-D7,就会顶替掉成D8-D15,而被顶替的数据则通过QH'到SER的连接传输到74HC595(2)中,使其位D0-D7。从原理图上我们可以看见74HC595(1)(左侧的)的QH’连接到了74HC595(2)的SER,也就是一个74HC595的串行输出连接到了下一个74HC595的串行输入。当选择数码管1显示的时候,这可以选择1(位选)然后再根据1位数码管的原理(段选)显示这个数码管。
2024-02-22 15:52:47
2073
原创 STM32基于寄存器编程
在51中让一个引脚输出高低电平只需要一个步骤,而在32中至少需要三个步骤。本文将一步步进阶的讲解,三种寄存器编程的方法。
2024-02-22 15:51:58
2191
原创 STM32 1位共阳极数码管
把数码管上的每个二极管一次标号对应a,b,c,d,e,f,g,dp。我们知道发光二极管一端正一端负,才能发光,共阳极,当我们把另一端设置成0,发光二极管就会点亮,反之共阴极设置成1,发光二极管点亮。GPIOA->ODR是32位的输出数据寄存器(高16位保留,低16为依次对应某个GPIO口的16个引脚)。所以这里依次对应GPIO_Pin_0==a,GPIO_Pin_1==b...GPIO_Pin_7==Dp。数码管分为共阳极和共阴极,即多个二极管的同一端接到GND/Vss(若一起接到GND,则称为共阴极。
2024-01-14 13:39:56
588
原创 STM32 定时器输入捕获3——捕获超长高电平
从第一章的定时器捕获我们可以知道,即使把定时器捕获时长设置到最大也只有65.536ms,而第二章就说明了,高电平小于65.536ms的时候,如何捕获高电平时间。这时候如果执行代码,输出高电平时间,会输出34.464ms,很明显65.536+34.464=100ms,65.536是一次周期的时间,所以我们可以得出一个结论:高电平时间=n次周期+最后捕获的时间。所以我们在TIM3配置中,使能TIM_IT_Update(中断标志位),在TIM3中断函数中,清除TIM_IT_Update。
2024-01-14 12:46:08
788
原创 STM32_定时器输入捕获2_捕获高电平时长
/4.如果在main中,去使用了high_value,此时高电平还在不断输出,定时器也在运行,high_value仍会该改变,对于high_value的使用就不方便。//2.从波形图可以看出,刚开始检测的是上升沿,所以检测TIM_FLAG_CC1的时候是SET,到了第二步,波形开始下降,变为下降沿,此时我们就要更改一下检测的方式了,我们可以用到下面这个函数。这样之后时,high_value就不会变了。但是,还有更简单一点点的,当到达t1的时候,我们把定时器清零,然后直接读出t2,就是这个高电平的时间。
2024-01-14 12:45:46
984
原创 STM32_定时器输入捕获1_初始化配置
但是也可以这样用,每溢出一次进入溢出中断,溢出中断计数,如果溢出中断计数为10,则时间为10*20ms=200ms。由上图我们可以知道,周期 是每次连续的上升沿的时间差(例如:T=第二个方波的上升沿时间-第一个方波的上升沿时间),高电平时间 是每次连续的上升沿和下降沿的时间差(例如:T高电平=第一个方波的下降沿-第一个方波的上升沿)。让PA6当做输入捕获。当想检测高电平或低电平的持续时间的时候,就可以使用定时器输入捕获。(基本定时器是不具备输入捕获的,通用/高级定时器具备输入捕获)
2024-01-13 00:41:19
1373
原创 STM32 SPI通信协议3——读取MAX6675温度传感器
无论是发送还是接收都要判断一下标志位,因为串行通信的缓冲区只有一个,即是发送缓冲区,也是接收缓冲区。接收的时候也是如此。==0的时候,MAX6675启动,此时你需要发送一个激励给他,让他启动,启动后MAX6675开始发送数据,这时候就要用到SPI_I2S_ReceiveData开始接收数据。从MAX6675的数据手册能看到D15是虚假的位,D14-D3是我们的温度数据位,D2在正常工作时为0(低电平)。==0的时候SCK启动,数据线开始发送信息,此时可以读取数据,当数据读完后,再拉高电平停止发送。
2024-01-13 00:40:56
731
原创 STM32 SPI通信协议2——SPI功能选项设置
分频系数是指UART模块将时钟频率进行分频后得到的用于传输数据的实际时钟频率,其计算公式为:分频系数 = UART时钟频率 / (波特率 x 16)。凡是串行通信就肯定有波特率,因为波特率决定了串行通信的速度,而串行通信的速度越快stm32接收的速度也就越快。如果你想让32工作的快一点,采集的频率快一点,那么可以让分频系数小一些,波特率就会变大。然后,我们需要将这个16位值的最高位(即第15位)设置为0,然后将这个16位值左移一位。看一下连接什么样的外设,在对应的手册里可以找到是多少帧的。
2024-01-12 18:39:59
2172
原创 STM32 SPI通信协议1——协议基本原理及管脚定义
SPI全称为,译为。SPI主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号编码器之间。SPI是一种高速,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便。STM32也有SPI接口,SPI时钟最大可达18MHz支撑DMA,可以配置为SPI协议或者I2S(音频通信)协议。
2024-01-12 18:39:36
2193
原创 STM32 自定义UART数据格式(串口通信点亮LED实验)
如果直接定义arr,这样每次进中断arr都会被初始化为0,所以我们必须在arr的定义类型前加static,把它变为全局变量。这样arr只会在第一次的时候初始化,随后每次进中断时arr都不会被重新赋值了。本实验接线:TTL:RX》A10,TX》A9,5V》5V,GND》GND,4个LED灯接在A1,A2,A3,A4,同理这里定义flag,用来判断,是否开始传输,是则为1,否则为0。校验位:等于前几项数据位的相加。
2023-12-01 20:11:41
276
原创 yolov5 利用Labelimg对图片进行标注
文件中新建一个文件夹来存放你需要跑的数据,例如我这次跑的是羽毛球,文件把文件取名为。因为我们要框选羽毛球,然后会有一个标注,所以我们在。选中刚刚你存放数据的文件夹,我这就是选择。显示的是当时框选的坐标信息。也可以,就是跑多了以后不好整理,然后点击。下面的图标可以选择保存的文件,这里选择。是分类,因为我们刚刚只识别和标注了。就可以保存了,保存在刚刚的。下,再创建一个文件夹命名为。
2023-11-10 21:16:38
372
原创 yolov5 通过视频进行目标检测
可以看到前面(1395/7581),其实就是它自己把视频逐帧的当做图片去识别。我们把需要检测的视频放在voides中,然后Run一下就可以检测视频了。,如果你只想要识别videos中的一个视频(设这个视频为xxx.mp4)可以这样写,在大概253行可以看到这行代码,这个显示预览的功能默认是关闭的。如果跑的时间太长,我们想要让它一边跑,一边看呢?为了实现这个步骤,我们要先开启显示预览的功能,跑完后,我们可以看到,跑完后的视频的地址。然后复制它,在它原本的下面添加这样一行代码。输入--view-img。
2023-11-10 00:47:11
2569
1
原创 STM32 蜂鸣器介绍 配置 播放音节
必须给他一个频率或者说是一个方波,它才会发声。而我们平时听到的音乐都是有音阶的,音节又是受频率控制,所以我们只要控制其频率就能发出所需要的音节和音乐。,所以现在定时器为1MHz,所以而我们想要把1MHz时间设置为1us,即为1/1000,设x=ARR。因为它一直输出一定的频率,我们无法改变频率,我们只能通过电源,控制它发不发声,且声音只有一种。可以计算出x=1000,所以我们可以知道当ARR=1000的时候,定时器周期为1ms。我们现在反过来,可以知道频率=单次时间/ARR,而需要的频率是523,即。
2023-11-07 22:54:02
1659
原创 STM32 TIM定时器,配置,详解(1)
有点类似C的数组,a[3]是a[0],a[1],a[2],但是psc[3]是psc[0],psc[1],psc[2],psc[3]。PSC预分频器,顾名思义,先预备一下分频,有时候频率过高,后面的定时器承受不住,就先用PSC先分频一下。那么此时分频后频率为1MHz,周期就是1us,再进行1000个机器周期就得到我们想要的1ms。将每接受到一次,PSC就跳动一次,当到了PSC的设置值的时候,再传递到下一个定时器。而PSC的范围计算是从0开始的,所以定时器时钟频率应该为Fosc/(PSC+ 1)。
2023-11-07 22:52:05
1894
4
原创 STM32 中断NVIC详解,配置及示例
它提供了一种单向的、由外部事件触发的中断机制,可以用于响应外部信号的变化,例如按键、传感器、通信接口等外设的状态变化。从中我们可以看到PA0/PB0/.../PG0——>EXTI0 ,PA1/PB1/.../PG1——>EXTI1,...,PA15/PB15/.../PG15——>EXTI15。EXTI模块可以实现多种中断触发方式的支持,中断延时时间短,具有高精度的中断响应能力,并可以与其他外设操作结合使用,是STM32微控制器中实现外部中断的常用模块。其中高抢占优先级的中断可以嵌套低抢占优先级的中断。
2023-10-26 13:18:56
4213
原创 STM32 PWM配置及呼吸灯
PWM工作的时候,有一个中间的比较值,例如PWM的计数是从0~100,设置中间比较值为50。假设现在值是1,它就会和50比较,因为它是向上计数,所以1++变为2,当增加到比较值的时候,电平会发生改变。我们假设LED灯在PA1上,那么我们需要配置两个东西,一个是GPIO_PA1,一个是TIM2_PWM。在PWM中可以调节的其实只有两个东西,一个叫做可调周期(调频率),另一个叫做占空比(高电平/周期)。而呼吸灯其实就是改变流经二极管的平均电流,也就是说当周期一定的情况下,流经二极管的高电平发生改变。
2023-10-25 01:27:48
732
原创 C++ 类和对象(7) 对象数组
由于该声明只初始化了数组的部分元素,因此余下的7个元素将使用默认构造函数进行初始化。上述声明要求,这个类要么没有显式地定义如何构造函数(在此情况下,将使用不执行任何操作1的隐式默认构造函数),要么定义了一个显式默认构造函数。初始化对象数组的方案是,首先使用默认构造函数创建数组元素,然后花括号中的括号函数将创建临时对象,然后将临时对象的内容复制到相对应的元素中。这你的代码使用标准格式对数组进行初始化:用括号括起的,以逗号分隔的值列表。可以创建独立对象变量,就像本章前面的示例所做的,但是创建对象数组将更合适。
2023-09-30 20:07:13
263
原创 C++ 类和对象 (6)this指针
如果s.total_val大于total_val,则函数将返回指向s的引用,否则,将返回用来调用该方法的对象(在OOP中,时topval消息要发送给的对象)。该函数隐式地访问了一个对象,而显式地访问了另一个对象,并返回其中一个对象的引用。一般情况下,类中的成员函数在操作类中的一个对象,用这个类去创建一个对象,用对象去访问类的成员函数,无论怎么访问或操作,都是一个对象。然而,要返回的并不是this,而是对象本身,因为this是对象的地址,即*this(将解除引用运算符*用于指针,将得到指针指向的值)。
2023-09-29 21:12:06
249
原创 C++ 类和对象 (5) 析构函数
对象过期时,程序将自动调用一个特殊的成员函数,该函数的名称——析构函数。如果对象是通过new创建的,则它将驻留在栈内存或者自由存储区中,当使用delete来释放内存时,其析构函数将自动被调用。最后,程序可以创建临时对象来完成特定的操作,在这种情况下,程序将在结束对该对象使用时自动调用其析构函数。如果程序员没有提供析构函数,编译器将隐式地声明一个默认析构函数,并在发现导致对象被删除的代码后,提供默认析构函数的定义。创建的是自动存储类对象,则其析构函数将在程序执行完代码块时自动被调用。
2023-09-28 23:39:35
217
原创 C++ 类和对象(4)构造函数
为此,C++提供了一个特殊的成员函数——类构造函数,专门用于构造新对象,将值赋给它们的数据成员。不能像什么这样初始化Stock对象的原因在于,数据部分的访问状态是私有的,这意味着程序不能直接访问数据成员。但是无法使用对象来调用构造函数,因为在构造函数构造处对象之前,对象是不存在的,因此构造函数被用来创建对象,而不能通过对象来调用。如果使数据成员成为公有,而不是私有,就可以按刚才介绍的方法初始化类对象,但使数据成为公有的违背了类的一个主要初衷:数据隐藏。区别在于,程序声明对象时,将自动调用构造函数。
2023-09-27 23:19:39
150
原创 STM32 UART初始化及单个字符发送代码
流控:因为UART传输的时候是串行的数据流,而此数据流常常缺少,原因是两台机器之间通信传输的速度不一样,接收缓冲区已经满了,继续发信息就会导致数据的丢失。而流控这个方式可以解决这个方式,当接受端的数据已经满了,就会告诉发送端不要在发送了,避免数据的丢失,直到接受端发送可以发送的信号。可以让芯片1采集数据后传递给芯片2,让芯片2进行数据分析,然后芯片2再传递给芯片1进行控制。USART_CK:其实是CLK是USART的时钟信号线,但是因为我们常常使用的异步通信,所以不用管它。
2023-09-26 23:33:45
408
原创 C++ 类和对象(3)
类和结构体是比较相似,而传统的C的结构体中都是一些数据的类型,类除了有数据之外还有函数。所以可以把类想象成一个具有既有数据又有函数的复合数据类型。类是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操纵数据的方法组合成一个整洁的包。以股票为例:股票中的数据类型有:股票的价格,股票的公司,所持股票的量等等。可执行的操作限制为:获得股票,增持,卖出股票,更新股票价格,显示所持股票的信息。然后定义类。一般来说,类规范由两个部分组成。简单来说,类声明提供了类的蓝图,而方法定义则提供了细节。
2023-09-25 23:46:42
126
原创 C++ 对象和类(2)
acquire()函数管理对某个公司股票的首次购买,而buy()和sell()管理增加或者减少持有的股票、方法buy()和sell()确保买入或卖出的股数不为负数。Stock类的其他成员函数不必使用作用域解析运算符,就可以使用update()方法,这是因为它们属于同一个类,因此update()是可见的。这不仅将update()标识为成员函数,还以为着我们可以将另一个类的成员函数也命名为update()。实现类成员函数还需要创建类描述的第二部分:为了那些由类声明中的原型表示的成员函数提供代码。
2023-09-24 23:01:51
207
原创 C++ 对象和类(1)
但是由于隐藏数据是OOP主要的目标之一,因此数据项通常放在私有部分,组成类接口的成员函数放在公有部分:否则,就无法从程序中调用这些函数。使用类对象的程序都可以直接访问公有部分,但是只能通过公有成员函数(友元函数)来访问对象的私有成员。类和结构体是比较相似,而传统的C的结构体中都是一些数据的类型,类除了有数据之外还有函数。可执行的操作限制为:获得股票,增持,卖出股票,更新股票价格,显示所持股票的信息。股票中的数据类型有:股票的价格,股票的公司,所持股票的量等等。只能通过public的函数访问private。
2023-09-23 23:42:29
159
原创 C/C++ 函数探幽
也就是说,这个代码的意思是把bunnies变量的值赋值给了rat变量。如果将上面类似的参数传递给接受引用参数的函数,将会发现,传递引用的限制更严格,毕竟,如果ra是一个变量的别名,则实参应该是该变量。输出表明,内联函数和常规函数是一样的,也是按照值来传递参数的,如果参数为表达式,如4.5+7.5,则函数将传递表达式的值(此处为12)。Tips:如果函数调用的参数不是左值或与相应的const引用参数的类型不匹配,则C++将创建类型正确的匿名变量,将函数调用的参数的值传递给该匿名变量,并让参数来引用该变量。
2023-09-21 23:12:39
160
原创 C/C++ 引用用作函数参数,属性,临时变量,引用参数和const
按值传递导致被调用函数使用调用程序的值的拷贝。但是在swapv()中,变量a和b是复制了wallet1和wallet2的值的新变量,因此交换了a和b的值并不会影响wallet1和wallet2的值。如果将上面类似的参数传递给接受引用参数的函数,将会发现,传递引用的限制更严格,毕竟,如果ra是一个变量的别名,则实参应该是该变量。Tips:如果函数调用的参数不是左值或与相应的const引用参数的类型不匹配,则C++将创建类型正确的匿名变量,将函数调用的参数的值传递给该匿名变量,并让参数来引用该变量。
2023-09-20 00:06:01
324
原创 STM32 WWDG窗口看门狗
WWDG_CFR(看门狗配置寄存器)就是上一张图的W[6:0](上窗口值),当WWDG_CR(看门狗控制寄存器)在被递减计数器递减时,会一直和上窗口值比较。把与门的值和T6的取反的值放入或门,把或门和WDGA的值放入新的与门中,最后确认要不要复位。举个例子,家长让小明准时回家,不准早退,不准出去玩,但是又考虑到有时候会有下雨,堵车之类的意外事情发生,就规定小明6点30到6点45之间到家,如果6点30之前到家,代表小明早退!1.当计数器的值大于上窗口的值的时候,如果此时尝试去喂狗,将立刻产生CPU复位。
2023-09-19 15:50:38
195
原创 STM32 UART通信协议 基础知识
当起始位突然从高电平变到了低电平时,B就是知道A要开始传输了,拉低电平的1个bit后,A就开始发送数据,发送完数据位后,双方规定一下有没有奇偶校验,有的话是奇校验还是偶校验,判断数据有没有错误,然后发送停止位,抬高电平,返回空闲状态。例如,对于实时性要求较高的应用,可能会选择同步通信,而对于数据量较大或实时性要求不高的应用,可能会选择异步通信。这个数据一般用5~8位的数据位,更多的时候用8个bit的数据位,因为c语言中的char正好是8位。我们常用8n1,意思是有8位数据位,没有效验码,1位停止位。
2023-09-18 23:41:46
365
1
原创 STM32 独立看门狗IWDG
就像玩手机,玩5分钟,重启一次,又过5分钟又要重启,这不得疯掉。当处理器,手表之类的电子设备,遇到特殊情况(磁场干扰等),导致程序跑飞,死机。突然,程序(正常的代码和看门狗)跑飞了,不运行了,而定时器仍在进行,10,9,8,7,...,1,0 到0的时候复位。而有了喂狗,程序10,9,8,...,4,3 每次到3的时候程序就返回到10。10,9,8,7,6,5,4,10,9,8...例如,现在程序10,9,8,...,1,0 每次减到0的时候就要复位。10,9,8,...,1,0,复位。
2023-09-17 23:06:13
136
1
原创 C/C++ 学习定义和初始化vector对象
默认初始化vector对象,创建一个制定类型的空vector;//默认初始化,svec不含任何元素;空vector可以在程序运行时很高效地往vector对象中添加元素。实际上,最常见的方式就是先定义一个空的vector,然后当运行时获取元素的值后再逐一添加。//正确 直接初始化,初始状态为空。//添加值给ivec。//正确 ivec拷贝初始化给ivec。//正确 第二行与第三行等价。//错误 svec的对象是string,不是int。
2023-09-16 23:46:59
194
1
原创 STM32 Systick 滴答定时器 (1)
(HZ是频率单位,初中物理中我们知道T=1/f,所以当Bit 2 = 0时,减掉一个数的周期T=1/9000000s。按刚刚开始讲过的,Bit 0,Bit 1,Bit 2,全部设置为1,分别意味着使能计时器,发生异常,工作频率AHB 72MHZ。比如说10,9,8,7,5,...,1,0,(向下递减)当减到0的时候。,例如STK_CTRL,STK_LOAD,STK_VAL等。当VAL=0时,当周期结束,会自动把LOAD放到VAL中。它们分别是把1左移2位,1左移1位,1左移0位。
2023-09-15 22:43:27
514
原创 学习C/C++ 将引用用作函数参数 详解
类型声明int *p表明了,p是一个int指针,所以与p对应的参数应为地址。函数调用使用实参初始化形参,因此函数的引用参数被初始化为函数调用传递的实参。可以看到使用引用和指针的方式,wallet1和wallet2正确交换。因此交换了a和b的值并不会影响wallet1和wallet2的值。变量a和b是复制了wallet1和wallet2的值的新变量。在函数的形参中去操作实参的别名(引用),就等于直接操作实参。变量a和b是wallet1和wallet2的别名。按值传递导致被调用函数使用调用程序的值的拷贝。
2023-09-14 00:18:55
697
1
大一C语音程序设计基础期末程序题,填空题,复习题
2023-09-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人