自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 Linux学习笔记9

使用逻辑:先建立一个fd[2]数组,将fd[]传入pipe函数去创建管道,之后创建进程通过返回值判断是子进程还是父进程,如果是子进程像读取数据,则要将fd[0]给close,父进程同理。有名管道fifo 给文件系统提供一个路径,这个路径和管道关联,只要知道这个管道路径,就可以进行文件访问,fifo 是指先进先出,也就是先写入的数据,先读出来。是用于标识和访问IPC资源的一种机制,它使得不同的进程可以通过共享的IPC键来访问同一个IPC资源,从而实现进程间的通信和共享数据。符号表示将一个进程放入后台运行。

2024-06-05 18:19:43 969 1

原创 Linux学习笔记8

在Linux中,man命令用于查看系统手册页(manual pages)。系统手册页是关于各种Linux命令、函数库以及系统调用的详尽文档,能够提供关于命令的使用方法、参数说明、示例以及其他相关信息可以利用man xxx的命令去查找某个函数某个命令的用法。

2024-06-04 16:02:08 988 2

原创 Linux学习笔记7

在Linux笔记一里我说过NFS和根文件系统的关系(即“NFS可以通过网络将文件系统中的数据提供给远程计算机使用,当一个计算机通过NFS挂载远程文件系统时,实际上是在网络上请求远程服务器提供文件系统的数据”),总之我们可以理解成NFS 允许多台计算机通过网络同时访问和共享相同的文件和目录,就好像它们在本地计算机上一样,只需要通过文件路径即可访问远程文件系统中的文件。所以我们可以将可执行文件放在这个目录下的bin目录里,之后开启虚拟机,使用“ls /bin/”,找到刚刚放的可执行文件,在串口输入命令运行。

2024-06-03 10:50:55 726 3

原创 力扣刷题笔记——Day1

一开始用的算法性能太差了,就是先把nums各个元素平方,之后冒泡排序处理,结果超时了,而且一开始忽略了要把在函数内部创建数组/指针是存放在临时的栈里的情况,函数结束之后栈就被释放了【返回值是通过复制返回值到调用方的寄存器或内存位置来实现的。示例 1:输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100]解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100],如果目标值存在返回下标,否则返回。个元素有序的(升序)整型数组。

2024-05-21 18:22:50 591

原创 Linux学习笔记6

这样它们就可以直接通过局域网进行通信,而无需经过路由器。server_args = -s /var/tftpboot/: 指定了 tftp 服务器进程的参数,其中 -s 表示指定 TFTP 的根目录为 /var/tftpboot/ ——————TFTP 客户端就是从这个目录里面获取服务器上的文件。输入命令“sudo apt-get install tftp tftpd”安装tftp 和tftpd,然后建立TFTP 的配置文件,使用命令“vi /etc/xinetd.d/tftp”建立文件,写入代码。

2024-05-20 18:17:02 1036 1

原创 STM32——ADC

接着我们看ADC初始化结构体。

2024-05-17 17:53:19 1451

原创 Linux学习笔记5

1)函数tcgetattr 用于读取当前串口的参数值,需要用到头文件“#include <termios.h>”和“#include <unistd.h>”。函数原型为int tcgetattr(int fd, struct termios *termios_p)。参数1:fd 是open 返回的文件句柄。参数2:*termios_p 下面注释里会提及并解释使用这个函数前可以先定义一个termios 结构体,用于存储旧的参数注释:成员tcflag_t c_iflag:输入模式标志。

2024-05-16 18:22:04 916

原创 Linux学习笔记4

书接上文,我们上两篇在讲建立最小Linux系统时要创建的几个脚本,接下来我们继续说一下。

2024-05-13 18:05:43 691 1

原创 Linux学习笔记3

家目录是用户登录后的默认工作目录,每个用户都有一个独立的家目录,用于存储其个人文件、配置文件和其他相关数据。每个组都有一个唯一的GID。用户可以属于一个或多个组,但每个用户都有一个主组,其GID通常与用户的UID对应的GID相同。注释:软限制指的是系统中对资源的软性限制,它是可以被用户进程修改的,但不能超过硬限制(硬限制可以通过。:这是用户的主组ID(GID),也就是用户所属的主要组的ID,通常也是0,即 root 组。是一个特殊的设备文件,写入到它的内容会被丢弃,相当于把命令的输出扔掉,不显示在终端上。

2024-05-11 15:53:01 793

原创 Microsoft Project使用简明教程

Microsoft Project 是微软公司开发的项目管理软件,用于规划、协调和跟踪项目的进度、资源和预算,如下图所示,左边是任务的显示,右边是一个日程的显示图,最上方的长方形处在我们项目设定日程后可以生成一个项目日程概览。假如说2、3任务是隶属于1任务的子任务(换句话说,假如1任务是项目设计,而2、3任务是理念设计和总体设计),那么我们可以用到“降级任务”这个选项——先选中要降级的任务,再去按“降级任务”选项。单击蓝色感叹号,之后在“项目”那个栏选择“添加基线”,之后选“完整项目”

2024-05-10 18:23:10 7268

原创 Linux学习笔记2

书接上文,上次说到了Linux最小内核,今天来说一下制作最小系统的流程。

2024-05-09 17:24:18 1142 3

原创 Linux学习笔记1

是用于初始化根文件系统的 RAM 镜像文件。说到根文件系统,我们要明确一个概念,就是——Linux 最核心的思想是“一切皆文件”,所以我们再启动linux的时候会去寻找根文件系统,因为应用程序什么的都以文件形式存在于根文件系统,根文件系统是操作系统中的基本文件系统,包含了操作系统所需的所有核心文件和目录。双网卡指的是NAT和桥接两个网卡,NAT(是虚拟的网卡)是用于保证ubuntu可以上网(一般是通过Windows的网卡去连接外部网络),桥接(是真实的网卡)可以保证ubuntu可以和开发板互通。

2024-05-08 18:20:19 666

原创 FSMC控制SRAM

它们是两种不同的存储器控制器,常见于一些现代的微处理器或微控制器中。它们之间的主要区别在于所控制的存储器类型和功能上:FSMC主要用于控制静态存储器,如SRAM(Static Random Access Memory)等。不能扩展SDRAM。FSMC提供了与静态存储器进行接口通信的功能,包括读取和写入数据,控制地址线和数据线的操作等。FSMC通常用于需要快速访问速度和低延迟的应用场景,例如高性能嵌入式系统中。

2024-03-23 21:24:56 865 2

原创 SDIO协议(以SD卡为例)

控制命令发送、接收和卡的响应。比如我们要发送命令CMD7+我们要选择的RCA 地址(即参数),之后控制它去发送,就用移位寄存器一位一位发出去,还会加上CRC校验码,之后通过CMD线发出去,发送出去后会有状态标志,我们可以通过状态标志去确认是否真的发送出去。SDIO适配器是STM32和SD卡通信的中间设备,有控制单元,命令路径单元(CPSM,用来描述SDIO适配器的状态变化),数据路径单元(负责与SD卡进行数据传输,适配器以数据路径状态机去描述SDIO适配器的状态,如下图),寄存器单元和FIFO(见下图)

2024-03-19 23:05:03 1502 1

原创 SPI及I2C大致特点(简洁版)

主机写数据到从机:数据包的组成,先传输开始信号,之后传从机地址,之后传读/写位,如果从机接收到了它会返回一个应答信号,之后就传输数据了,传输完后从机还要返回一个应答信号,之后主机又传输数据,从机又传输一个应答或非应答信号,如果是非应签信号则主机收到后就发一个停止信号给从机(主机每次传完个字节都会等待从机响应一个应答信号)之后发送地址和数据方向位,之后看从机有没有发送自己的响应,有的话状态寄存器SR1的ADDR位等于1(表示地址发送结束)和数据寄存器为空(Txe)

2024-03-17 15:47:45 563 2

原创 十分钟就可以了解的RTT的简明内部机制串讲

If一开始是B运行,某时刻切换到A在运行(此时B的现场会保存在B的栈),A用rt_thread_kill(B,SIGNAL)发线程给B,B会先恢复寄存器到CPU,本来应该是CPU收到B恢复的R15寄存器的值的时候直接跳转到入口函数处去的,但是为了让CPU先去执行信号处理函数,我们会在B的栈里伪造一个含有16个寄存器的现场,里面的R15放信号处理函数,此时CPU会先去运行信号处理函数,运行完之后切换回老的栈。在实际工程中,为避免复杂化我们一般保存所有的寄存器,即在栈上划分出一个保存寄存器。

2024-03-02 23:32:05 631 1

原创 STM32F407基于RTThread通过SPI实现RC522的读写

之后在main函数里的while(1)函数里加上 rt_thread_mdelay(1000);读操作 把对应区块1的数据读出来 MFRC522_Read第一个参数可以改成其他数字 对应其他区块。打开下面的百度网盘链接,里面包含rc522的配置文件,加入工程里。想要修改卡里的内容需要在main函数里初始化之后进行如下函数操作。在main.c文件里原有的头文件后面再加上下面的头文件。将RC522与STM32F407的连接,对应引脚如下。为了方便检测IC卡的数据,可以在手机里下载这个软件。

2024-02-20 16:16:33 577 2

原创 STM32F407——基于RT-Thread实现触摸屏按键点灯案例

【补充:关于NVIC的配置,注意:RT-Thread 操作系统重定义 HardFault_Handler、PendSV_Handler、SysTick_Handler 中断函数,为了避免重复定义的问题,在生成工程之前,需要在中断配置中,代码生成的选项中,取消选择三个中断函数(对应注释选项是 Hard fault interrupt, Pendable request, Time base :System tick timer)】配置系统时钟,要挂载在定时器六下面,不然会与RT-Thread 的时钟冲突。

2024-02-13 15:34:03 1548 2

原创 STM32学习之触摸屏(野火教程观看小结)

当手指触摸屏幕时,手指与导电涂层之间形成了一个微小的电容。传感器会检测这个电容的变化,并将其转化为触摸信号。:主要基于电阻效应,即当触摸屏被触摸时,触摸点处的导电层之间会形成一个电阻,导致电流通过。电容触摸屏比电阻触摸屏贵一些,电阻只能支持单点触碰,电容屏支持多点,可以通过这个去判断到底是电阻屏还是电容屏。而且电阻触摸屏要大力触碰才可以感应到,电容屏相对而言用比较小的力就可以。

2024-01-29 18:02:45 2264 1

原创 RT-threadStudio利用线程特性去实现功能串讲

线程A假如愿意等待10 tick,我们要用线程结构里的定时器去把设为10 tick,定时器递减到0时,定时器的处理函数就会调用,然后它会把线程放入就绪链表(因为之前等待时把线程在就绪链表里删过了)且设置A的状态(statue=E_TIMEOUT)】我们还得在写邮箱时加入一个关中断的操作,这样做是为了避免两个线程同时写入邮箱的情况,因为这种情况下数据会被叠加(它们写入邮箱的同一个区域),关中断可以保证每次只有一个线程写入邮箱(因为线程是由中断触发的)/* 线程栈大小,单位为字节 *//* 线程链表节点 */

2024-01-18 10:08:21 1143 1

原创 RT-thread Studio——基于STM32F407点灯小实验串讲

时钟管理可以用以去创建一些定时器,此处可以类比一下单片机的定时器,单片机是定时器TIM是硬件形式的,而RT-thread内核的定时器是软件形式的,更为方便,我们随时可以建立或删减定时器……线程管理部分的作用功能具体地说,就是转换任务之间各种状态,然后让CPU实现任务的切换等等,任务的各种状态我也提一嘴:就绪态就是具备了在CPU运行的条件但还没运行的状态,原因是CPU现在有处于运行态的任务在运行,而运行态的任务会被中断等高优先级的任务打断而转变成挂起态,等中断执行完之后才继续运行……

2024-01-16 10:08:28 1259 3

原创 RT-Thread——线程创建概述

而我们在启动一个线程的时候会假装暂停在第一条指令之前,目的是为了创建栈并把寄存器的值保存在栈中(所以为了完成此步CPU会分配一个属于任务自己的栈)并恢复到CPU中,之后会CPU会执行PC处也就是入口函数处的程序,这一步的目的简单地说就是让PC寄存器的值等于入口函数处的地址(PC寄存器的值为入口函数的地址),步骤是假装暂停入口函数,构造栈的内容并写入CPU。可以把线程理解成任务,假如a和b任务差不多同时发生,先运行A任务,之后保存A的现场。【图中的stack_frame其实指的是栈里放寄存器的那块区域】

2024-01-13 17:31:20 934 2

原创 RT-thread学习基础——理解ARM架构和简明汇编教程

关于PUSH和POP指令,我们要先了解我们寄存器R13/R14/R15,R13是堆栈指针SP,栈的地址从上到下是由高到低的,我们令R13的值(即SP的值)等于最高位的栈地址xxx,之后我们执行PUSH{R0,R1},SP先执行SP=SP-4之后(执行-4的原因是因为首地址一般是所占内存的最低位),再将高标号的寄存器值(R1的值)放入栈里,之后再令SP=SP-4,再把R0的值放入栈里,总之PUSH会多次调用STR指令和SP,它会记录返回地址(即B处),这个地址保存在R14,之后执行A,执行完A后继续执行B。

2024-01-13 14:20:26 323 1

原创 对RTOS的一些理解

我们可以简单理解成前台是一个以中断为核心的结构,后台是一个不断循环的结构(如我们的while结构),在正常情况下,如果没有发生中断什么的话,我们可以在后台实现一些功能如(LED闪烁等等),如果中断一来,我们就停止后台程序的执行转而去执行中断程序。在实际生活中,单片机的单进程处理可能会带来某些事件的运行时限滞后或者响应时间滞后的现象,意味着我们可能无法准确地知道某个任务运行的具体精确时间,如果我们要求设备要有严格的处理时限,比如医疗设备等,那么我们就需要使用RTOS。

2024-01-12 16:29:26 379 1

原创 小白也可以做的STM32RC蓝牙小车的大概思路

还可以改一下名字 在在连接蓝牙的时候比较好找】,记住手机要在蓝牙模块AT指令配置后通过USB转TTL供电时直接先连一次,之后再将蓝牙拔到单片机的串口上,然后再用手机连接一次(因为将蓝牙转移到单片机串口的过程是掉电的,所以得重连)系统时钟除以定时器设置的分频是定时器时钟(单位M),定时器时钟值分之一即定时器的计数器计数一次的时间,然后period值的含义是每个周期计数个数,故计数一次周期的时间为period(1/定时器时钟)由于前轮只具备控制方向角度的功能,并没有轮胎转动的功能,所以我们不需要配置刹车功能。

2023-11-03 22:56:55 102 4

原创 入门小实验——STM32RC电机控制

我的想法是通道一设为mode1 先输出高电平 通道二设为mode2 先输出低电平 【这样两个通道一开始时正好电平互补 且电机为正转 当然两个通道可以都设成mode1 只不过后面配置Pulse要更改一下数值】 之后设置Pulse(和占空比有关 计数器计数到这个数时会产生边沿变换) 设置通道一的Pulse默认为5000 占空比为50% 通道二的Pulse为10000 即一直输出低电平PWM 即通道二的值为零。我们可以试一下直接在其对应的GPIO引脚输出高电平、低电平,我们会发现它是全速转动的。

2023-10-31 16:17:59 225 2

原创 入门小实验——STM32RC舵机控制(hal库版)

if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_8)==0) //检测按键是否为低电平。我们可以让key按键去控制刹车(我用的按键一开始配置的是上拉 如果检测到其为低电平 则进入刹车函数)所以2ms可以转180° 2ms/0.002ms=1000次 即1000次计数可以转180°。配置CH1 CH2等一下写代码时可以用其来定义舵机转180°和270°的PWM输出函数。转一度的次数为1000/180 转x度需要250+x(1000/180)次。//在PA6 写入高电平刹车。

2023-10-28 21:14:12 417 1

原创 STM32F103RC 系统定时器

结构体Systick_Type的第一个成员CTRL指的是控制寄存器 这个寄存器有四个主要的控制位 但我们使用时只需要了解3个。然后可以通过systick的中断服务函数(在stm32f10x_it里寻找)去配置一些定时中断的东西 如定时将LED 反转等。当然以上仅作了解即可 使用hal库配置的话只需要了解相关函数即可 在工程文件里的内核文件里找到与systick相关的函数。LOAD用于配置重装载的值(如1000等 在VAL清零后可以装填入其中)第一个是中断回调函数 (可以把中断时的配置操作写进来)

2023-10-26 14:42:24 133

原创 STM32F103RC按键中断(hal库版)

配置时注意看原理图再去配置 比如SW4应该配置成上拉(这样按下时会变成低电平产生一个下降沿 如果配置成浮空 则第一次按下后可能后面就一直是低电平 响应不了下降沿中断)在keil里打开 然后自己再写一个中断回调函数(作用和中断服务函数差不多 不过stm32f10x_it.c里的中断服务函数不能写延时函数 而中断回调函数可以) 如下。先初始化需要中断的外设的GPIO配置(比如按键key3按下时灯led亮 则我们需要设置配置他们的GPIO模式、速度、上下拉等 )之后配置时钟 生成代码。(相应GPIO配置)

2023-10-24 21:09:09 162

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除