- 博客(155)
- 收藏
- 关注
原创 06:高级命令
每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux系统对用户组的规定有所不同,如linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。组里面的用户拥有超级用户的权限,只有安装系统时创建的第一个用户添加到了。综上:创建用户的同时,也会自动创建与用户名相同的组和主目录文件夹,组里面,所以后面的用户都没有获取超级用户的权限。组里面,其他后面创建的用户都没有添加到。
2025-02-18 21:48:28
327
原创 02:Linux的网络配置
【注意】桥接模式下:虚拟机会占用同网段的主机号,所以在相同的网段下,除了那几个特殊的主机地址,只能创建252个虚拟机。所以会存在ip不足的情况。由于桥接模式中ip地址比较稀缺,所以一般使用NAT模式。NAT模式就是在真机中虚拟出一个路由器,虚拟机连接着这个虚拟路由器。,桥接模式下,虚拟机的网关和DNS都需要和真机一样才能访问互联网。综上:NAT模式下:虚拟机构成了同一网段,不在和真机同一网段。虚拟机的网络ip和真机的网络ip连接在。阉割版的NAT模式:不能进行上网。
2025-02-17 16:07:58
480
原创 04:Linux文件命令
Linux系统的思想是“一切皆文件”,所以Linux系统把文件分为七类:规则文件(-)、目录文件(d)、管道文件( p)、链接文件(l)、套接字文件(s)、字符设备文件©、块设备文件(b)【注意】软链接文件的源文件必须写成绝对路径,而不能写成相对路径(硬链接没有这样的要求),否则软链接文件会报错。
2025-02-15 22:33:49
88
原创 03:Linux文件系统
文件系统的最顶层是由根目录开始的,系统使用“/”来表示根目录,在根目录之下的既可以是目录(目录就相当于 Windows 中的文件夹),也可以是文件,而每一个目录中又可以包含(子)目录或文件。在Linux的系统开发中,一般都是使用的终端Terminal进行控制,也被称为shell终端。该程序能够接收用户输入的shell命令,内核对命令进行解析和处理,处理完毕后内核将结果反馈给用户,所以需要用户掌握对应的shell命令才能控制。如果遇到不会使用的命令,可以通过man手册来获取命令帮助。命令来查看命令的类型。
2025-02-15 10:47:03
210
原创 07【基础学习】串口通信(二):收发数据包
我们使用上位机个单片机发送数据包时,规定包头和包尾,将我们需要发送的数据放在中间,数据的长度我们也可以自己规定。一般情况下HEX数据包我们使用固定长度数据包。而文本数据包使用是可变长度数据包。
2025-02-14 22:59:17
800
2
原创 05【基础学习】定时器生成PWM波
例如:一个脉冲周期为10ms的pwm波形图,第一个周期高电平为7ms(占空比70%);频率为50Hz,则周期T = 20ms,而占空比为70%,则信号的高电平持续时间t = 14ms,信号的低电平持续时间t = 6ms。综上:需要产生700Hz的电平信号,即每隔0.71ms电平翻转一次即可。在700Hz的电平信号下,蜂鸣器发出叮的声响,在500Hz的电平信号下,蜂鸣器发出咚的声响。700Hz的电平信号的周期T ≈ 1.42ms,500Hz的电平信号周期T = 2ms。综上:定时周期越小,误差就越大。
2025-02-11 21:11:01
983
原创 04【基础学习】定时器
综上:若12T下需要定时1ms(即定时器启动,1ms后定时器溢出标志位置位),那么定时器T0的计数器的初值应该设置为多少喃?1ms = 1000us,即65536 - 1000 = 64536。定时计数器T0的初值应该设置为64536,即定时计时器从64536开始计数。定时器溢出后,计数器从0开始向65535计数。
2025-02-10 23:03:36
900
1
原创 03【基础学习】按键
STC89C5X 系列单片机提供了 8 个中断请求源,它们分别是:外部中断 0 (INT0)、外部中断 1 (INT1)、外部中断 2 (INT2)、外部中断 3(INT3)、定时器 0 中断、定时器 1 中断、定时器 2 中断、串口(UART)中断。注意:51 系列单片机一定有基本的 5 个中断,但不全有 8 个中断,需要查看芯片手册,通常我们使用的都是基本的 5 个中断:INT0、INT1、定时器 0/1,串口中断。相同一行的矩阵按键的一段连接到相同的一个IO引脚,即2个IO引脚控制一个按键KEY。
2025-02-09 15:23:55
560
原创 02【基础学习】数码管
使用单片机的IO口来控制公共引脚的极性,进而来选择哪一个数码管进行显示数值。如图:数码管分为共阳极数码管和共阴极数码管。通过控制LED来控制数码管的显示。如图:图中由4个静态数码管构成的动态数码管,他们的LED中的小棍都是连接在一起,然后通过引脚引出来的。如图为数码管,数码管是显示器件,用来显示数字或字母的。动态数码管是将多个静态数码管相同的引脚连接在一起,然后引出来。综上:代码验证了他们的LED中的小棍都是连接在一起,然后通过引脚引出来的。编辑应用层代码,使用4位的共阳极的数码管显示整数,小数,负数。
2025-02-07 15:15:51
613
原创 01【基础学习】点亮发光二极管
使用模块化编程,将LED的显示封装为文件函数。使用Proteus搭建一个如下C51的最小系统。只是粗略的延时,下面的代码使用模块化编程。颜色分类:白色、蓝色、绿色、红色、橙色、黄色。导通电压:正向导通电压:1.8V-2.2V。来进行对位操作,可以操作单个引脚。驱动方式:电压正向偏置,电流驱动。
2025-02-07 15:14:50
583
原创 10:预处理
C语言编译器在编译程序之前,会先使用预处理器(预处理器)处理代码,代码经过预处理之后再送入编译器进行编译。预处理器的主要任务包括宏替换、文件包含、条件编译等预处理过程中会执行预处理指令,预处理指令以号开头。
2025-02-01 21:38:22
536
原创 12:Heap代码的分析
若不对齐存储数据,当CPU读取char数据和int数据时,第一次读取:从0x00~0x03,读取到12,20,30,40。第三次读取:从0x04 ~ 0x07,读取到50,然后加上第二次读取的数据,最后作为int类型的数据。若对齐存储数据,当CPU读取char数据和int数据时,第一次读取:从0x00~0x03,读取到12。结构体Node是以4个字节对齐,则m与Node间隔中间添加3个空白字节,Number 也是以4个字节对齐,则n后面添加3个空白字节。计算机读取内存中的数据时是一组一组的读取的。
2025-01-27 21:30:23
992
原创 04:FreeRTOS链表代码分析
【注意】,若状态链表中存在了3个TCB_t的数据节点,而此时正在管理节点的pxIndex正指向第2个数据节点中的通用节点(即正在执行第2个TASK),则想要插入一个新的数据节点,那在哪里插入喃?综上:状态链表如下图所示:任务控制块为链表中的数据节点,通过通用节点前后连接在一起。,通用节点中的pvOwner保存的数据节点的地址,pxContainer保存的管理节点的地址。综上:由TCB_t的源代码所得:TCB_t的结构体是数据节点,数据节点中存在2个通用节点,在链表的连接中通用节点连接在一起。
2025-01-25 20:49:47
324
原创 02:链表
综上:上面的代码进行了2种类型的链表的创建,添加,删除。可以按照如下的定义数据节点,这样通用节点的地址和数据节点的地址相等。当多定义几个相同类型的节点,然后将他们的地址赋予前面的节点的指针变量,这样就构成一条链表。注意,上面中存在这下面的这一段代码,这段代码是通过通用节点的地址得出数据节点的地址。【注意】:上面的代码中存在这下面的一段代码,这段代码是节点添加到链表的关键。表示需要被删除节点的地址,那怎样表示被删除节点的前面节点的地址喃?表示为地址为0的数据节点中通用节点的地址,也就是通用接地的偏移地址。
2025-01-24 16:28:42
623
原创 28:CAN总线入门一:CAN的基本介绍
CAN总线是一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线,广泛应用于汽车、嵌入式、工业控制等领域。两根通信线(CAN_H、CAN_L),线路少差分信号通信,抗干扰能力强高速CAN(ISO11898):125k~1Mbps,
2025-01-17 19:51:44
1260
原创 09:事件标志组+任务通知
而任务通知是在创建任务的同时就创建好了,位于任务的TCB。当使用直接任务通知时,顾名思义,发送任务直接向接收任务发送通知,而无需中间对象。每个 RTOS 任务都有一个任务通知组,每条通知均独立运行,都有“挂起”或“非挂起”的通知状态,以及一个 32 位通知值。因为按键按下后,发送通知值后将Task2唤醒,由于Task2唤醒后优先级比Task1高,所以会立马抢占Task1的执行。因为按键按下后,发送通知后将Task2唤醒,由于Task2唤醒后优先级比Task1高,所以会立马抢占Task1的执行。
2025-01-16 16:57:57
868
原创 11:中断ISR+任务相关API函数使用
1套是在Task中调用执行,一般在Task中调用执行的API函数参数中都有等待Tick,即若API没有执行成功返回值pdTRUE,则执行API的Task会进行等待(Task变为阻塞态),具体等待多久个Tick与传入的参数有关。而在中断服务函数中调用的API函数末尾带有FromISR。而这些API函数参数里面并未有等待Tick,即不论这些API函数的执行结果是否为pdTRUE,则中断服务函数都不会进行等待。因此,需要更精准的计算出Task的运行时间,则需要一个定时器,且精度至少要大于SysTick的10倍。
2025-01-16 14:25:52
388
原创 10:软件定时器+中断管理
综上:创建出Task1,和软件定时器服务任务后,虽然软件定时器的服务任务优先级大于Task1,但是由于还没有启动定时器服务任务,所以一直执行Task1。当启动后,定时设置的是500Tick,则启动后先将服务任务阻塞500Tick,然后500Tick后恢复,然后去抢占Tick1,执行软件定时器服务任务。比如: BASEPRI设置为0x50(只看高四位,也就是5),代表中断优先级在5 ~ 15内的均可被屏蔽,0~4的中断优先级正常执行。两个定时器每1s,打印一段字符串,当关中断时,停止打印,开中断时持续打印。
2025-01-15 22:44:52
1054
原创 08:互斥量
然后继续执行TaskB,然后被TaskC抢占了,直到TaskC执行完后,再去执行TaskB,直到释放二值信号量,才去执行优先级最高的TaskA。Task3看竞争不过Task2,那么就把优先级给Task1,让Task1的优先级变为3。总的来说:就是由于二值信号量的存在,更高优先级的TaskA和TaskC去竞争抢占时,既然没有竞争过比自己优先级小的TaskC,这种情况就是优先级反转。Task1继承了Task3的优先级,并未被Task2抢占,而是完整的执行到释放信号量,然后去执行Task3,在去执行Task2。
2025-01-14 11:55:55
607
原创 07:信号量
综上:通过二值信号量来表示UART1的使用钥匙,当二值信号量为1时表示UART1使用钥匙还在信号量里面,然后Task将钥匙拿出来去使用UART1(二值信号量为0,其他Task不能使用UART1),然后UART1被使用完后,钥匙返回信号量里面,以便其他Task的使用。综上:二值信号量本质是一个长度为1的队列,但是此队列不能作为Task之间的数据传递。获取信号量,若信号量值为0,则阻塞等待,每调用一次函数,计数值-1。获取信号量,若信号量为0,则阻塞等待,获取成功后写入0。使用二值信号量需要添加如下2个代码;
2025-01-13 16:29:16
554
原创 06:同步与互斥
即Task2的执行是依赖Task1的执行情况的,Task2必须等待Task1执行完毕,才能去执行,这种情况被称为同步。当Task1将数据放入队列里面,队列里面不为空时,将Task2进行唤醒。但是,上面的同步方法存在着一个很大的问题,就是依然会去执行Task2任务,Task2会去和Task1竞争CPU资源,造成了CPU资源的浪费。综上:2个任务都需要使用UART1进行打印输出,当Task1还没有打印完,Task2使用串口打印,最终造成打印出来的数据是混乱的,所以Task1和Task2存在互斥的现象。
2025-01-12 21:02:24
1035
原创 05:任务状态与调度
pxReadyTasksLists[x],其中x = configMAX_PRIORITIES代表任务优先级级数,如果在32位的硬件中,x的取值范围1-32。如图:若任务的优先级为0,则后面链接着空闲任务,若先将任务全部创建好后在启动调度器,则先执行的是Task1;当所有的任务进入阻塞态时,CPU就执行空闲任务函数即,在5ms的阻塞时间,CPU就执行空闲任务,空闲任务的优先级最低。那遍历的周期是多少喃?task3:判断按键按下逻辑,KEY1按下,挂起task1,按下KEY2在任务中恢复task1。
2025-01-11 15:33:01
636
原创 03:FreeRTOS的第一个程序
RTOS学习链接:链接: link①FreeRTOS的官方网站:链接: link,将FreeRTOS源文件下载下来,并解压。②找到如下FreeRTOS开发所需要的文件。③创建一个文件夹名为FreeRTOS,然后在FreeRTOS文件中分别创建source,include,portable三个文件夹④向创建的新文件中添加文件。1、将配置文件FreeRTOSConfig.h添加到include文件夹中2、将核心文件添加到source文件夹中3、将核心文件的头文件添加到include文件夹中
2025-01-08 16:14:11
964
原创 01:C语言的本质
没有初始值和初始值为0的全局变量,在Flash的数据段里面并未保存数据。所以将r0的数据写入到栈空间的r3的位置。所以将r0的数据写入到栈空间的r3的位置。表示将r0的数据写入(sp + 0x00)的地址存储空间。所以将r0的数据写入到栈空间的r2的位置。综上为有初始值的全局变量和静态变量的内存分配情况,那若没有初始值/初始化为0的全局变量。如下图所示:Linker(链接器):将0x0800 0000的空间与0x2000 0000的空间链接在一起。表示的是Flash的数据段的起始地址。
2025-01-05 22:29:08
1304
原创 RTC:实时时钟
若发生了侵入事件,会将BKP中的数据清除(主电源断电,侵入事件也有效)。侵入事件检测引脚为PC13且检测电平。BKP的读写需要RTC的配置,但是不需要开启LSE的时钟源。只需要打开RTC时钟+配置RTC总控结构体。当侵入事件产生后,应该先关闭侵入检测。需要侵入检测则重新调用API函数开启侵入检测。③stm32f1xx_it.c文件的代码如下。①RTC.c文件需要修改的代码如下。②main.c文件的代码如下。②main.c文件的代码如下。①RTC.c文件的代码如下。①RTC.c文件的代码如下。
2025-01-03 11:18:12
732
原创 CRC:循环冗余校验
CRC32:多项式是X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1,对应数字是0x104C11DB7。常见的CRC校验:CRC8,CRC16,CRC32。CRC12:多项式是X12+X11+X3+X2+1,对应的数字是0x180D。CRC16:多项式是X16+X12+X5+1,对应的数字是0x11021。CRC16:多项式是X16+X15+X2+1,对应的数字是0x18005。CRC8:多项式是X8+X5+X4+1,对应的数字是0x131。
2025-01-02 18:36:08
2130
原创 SPI(二):主从通信
当接受到主机发送来的数据的同时,也会把WData的数据发送给主机。④stm32f1xx_it.c文件的代码如下。④stm32f1xx_it.c文件的代码如下。④stm32f1xx_it.c文件的代码如下。③main.c文件的代码如下。③main.c文件的代码如下。①SPI.c文件的代码如下。②SPI.h文件的代码如下。①SPI.c文件的代码如下。②SPI.h文件的代码如下。①SPI.c文件的代码如下。②SPI.h文件的代码如下。①SPI.c文件的代码如下。②SPI.h文件的代码如下。
2025-01-01 16:57:00
393
原创 I2C(一):存储器模式:stm32作为主机对AT24C02写读数据
I2C的DMA非常的难用,需要配置I2C的NVIC中断和配置I2C的中断函数。④stm32f1xx_it.c文件的代码如下。③main.c文件的代码如下。③main.c文件的代码如下。③main.c文件的代码如下。③main.c文件的代码如下。①I2C.c文件的代码如下。②I2C.h文件的代码如下。①I2C.c文件的代码如下。②I2C.h文件的代码如下。①Key.c文件的代码如下。①I2C.c文件的代码如下。②I2C.h文件的代码如下。①I2C.c文件的代码如下。②I2C.h文件的代码如下。
2024-12-30 14:13:29
1050
原创 04:(手撸HAL+CubeMX)DMA篇
如上代码:HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength);这个函数一般用于内存直接的搬运,因为外设搬运有专门的外设DMA函数。实验:DMA将DataA数组中的数据搬运到DataB数组中,然后通过串口1输出。实验:使用串口UART1的DMA进行发送数据。实验:使用DMA进行串口的不定长数据的接收。
2024-11-27 15:25:02
268
原创 03:(手撸HAL+CubeMX)串口UART篇一
然后CPU就会进入if语句里面去执行关闭串口接收中断。然后执行全部接收完成回调函数。若此时串口的DR还有数据,CPU也不会在进行将DR中的数据搬运到数组里了。
2024-11-26 20:56:12
639
原创 18:(标准库)DMA二:DMA+串口收发数据
如上图所示:UART1的Tx发送请求使用DMA1的通道4,UART1的Rx接收数据请求使用DMA1的通道5。申请数据搬运,DMA1将缓冲区的数据搬运到TDR数据寄存器中,然后串口将数据发送出去。申请数据搬运,DMA1将数据从RDR寄存器中搬运到缓冲区中。:当UART1的发送数据寄存器TDR中没有数据时,就会向。:当UART1的接收数据寄存器RDR中有数据时,就会向。
2024-11-26 20:45:08
1288
1
原创 16:(标准库)ADC三:使用外部触发启动ADC/模拟看门狗
ADC的触发方式有很多,一般情况都是使用软件触发反式启动ADC转换。除了软件触发方式还能使用外部事件触发启动ADC转换。使用定时器的PWM模式触发,每隔1s触发一次,因为定时器的定时器周期配置的为1s。
2024-11-24 20:13:42
643
2
原创 15:(标准库)ADC二:ADC内部通道的使用
在之前的代码中参考电压都是使用的是3.3v,因为参考电压引脚VREF连接着内部供电电压VDDA,而VDDA连接着VDD,而VDD是3.3v。但是在实际的使用中,VDDA的会随着使用的片上外设增加而减小,所以参考电压也会改变,而不一直是3.3v。可以通过内部通道17测量出实际的参考电压的值。综上:若没有使用校准的参考电压时:即3.3v,测量出的温度传感器的内部电压为1.45v,计算出的温度为21度。而使用了校准的参考电压,即3.25v,测量出的温度传感器的内部电压为1.43v,算出的温度为25度。
2024-11-24 14:27:35
1193
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人