- 博客(36)
- 收藏
- 关注
原创 DMA直接存储器访问
DMA是一个数据搬运通道,配置完成之后,不占用MCU资源,同时对于内存的消耗较小。DMA不占用内存。需要知道【数据源地址】和【数据目标地址】数据源需要配置和提供的内容数据源地址,存储器地址或者外设设备数据地址数据宽度/数宽,全字(4字节)半字(2字节)字节(1字节)数据增量,从指定内存地址提取数据之后,根据当前数宽跳转到下一个数据位置,需要告知增量范围。类似于数组作为函数的参数,需要提供地址和数据有效元素个数(size)/数组容量(capacity)例如ADC的注入转换通道。
2025-10-21 19:34:27
477
原创 ADC 模拟量转数字量
在STM32 MCU中,利用ADC端口完成【电压值转换为数字值】方式。大多数传感器会利用ADC方式已进行模拟量转化数字量方式进行传感器数据提供。例如:光敏电阻,压敏电阻,水位传感器,电池电路传感器。ADC可以将数据转换后,交给后续MCU 进行阈值判断,完成需求后进行其他操作。
2025-10-20 21:13:53
625
原创 USART--串口
硬件中数据传递的一种方式,而且是一种常用方式。后续的开发中就那个,wifi,蓝牙,zigbee,都可以按照串口方式进行数据传递和设备控制。数据按照【串行数据传递格式】。
2025-10-18 19:14:30
696
原创 温湿度传感器---DHT11的使用
因为TH1的时间是(68us~74us),而Tlow的时长大概是50us,(68+50=118),也就是TH1+Tlow的时长大概是118us,如果从TH0 的开始进行延时50us,还在TH1阶段,读取到的是一个高电平,表示正在发送的是一个数据1。(因为TH0的时间是(23us~27us),而Tlow的时长大概是50us,(23+50=73),也就是TH0+Tlow的时长大概是73us,如果从TH0 的开始进行延时50us,那么刚好到Tlow阶段,读取到的是一个低电平,表示刚刚发送的是一个数据。
2025-10-18 15:52:21
844
原创 MCU和GPIO (1)
主包学习使用的开发板是STM32F103ZET6,图中这个目前使用的开发版是基于 STM32F103ZET6 型号。ST 意法半导体公司产品M 使用 Cortex-M 内核32 当前 MCU 为 32 位芯片F103F1 ==> Cortex-M3 内核03 ==> F1 系列的型号,03 是增强型。ZET6Z ==> 引脚数目 144 引脚E ==> 闪存存储器大小(Flash) 512 KBT ==> 封装标准 LQFP 封装6 ==> 工作温度范围 -40 ~ 85 ℃。
2025-10-13 20:10:23
794
原创 day02-电路基础2
三极管是利用小电流/小电压,控制驱动大电流电路控制方式。可以解决MCU芯片无法驱动的外部的功耗较高的设备。MCU对外提供的电压一般为3.3V,最大电流为20mA,对外的功率为3.3*0.02A = 0.66W在B用小电压进行驱动,填补P型半导体的空穴,紫色的这条线就可以到导通,空穴被填补后,NPN整体内部的电子就可以实现通路,此时在C添加外部大电压,既可以实现从C 到 E 的一个导通。
2025-09-23 20:27:13
379
1
原创 day01电路基础
本文介绍了电路基础中的核心知识,包括欧姆定律、常用元器件特性及应用。重点解析了电阻的串联/并联功能(分压、限流、分流),电容的"通交流阻直流"特性及其在滤波(高低频分离)、耦合(芯片间信号传输)、旁路(噪声消除)等场景的应用原理。详细说明了二极管单向导通性实现的电压钳位(0.7V压降保护)、交流限幅(±1.4V限制)功能,并以收音机为例阐述LC谐振选频与二极管检波的信号处理机制。文中通过阻抗公式、等效电路等量化分析元件参数选择依据,强调了大电容滤低频、小电容滤高频的物理本质及实际设计中的
2025-09-22 19:58:55
1321
原创 网络编程day04/05原始套接字
原始套接字(RawSocket)是一种可直接访问底层网络协议的特殊套接字,允许操作IP层及以下协议,常用于网络监测、数据包分析和自定义协议实现。文章详细介绍了UDP、TCP和IP协议的数据包格式:UDP首部包含16位的源/目的端口号、长度和校验和字段;TCP首部包含端口号、序列号、控制位等复杂字段;IP首部则包含版本号、首部长度、生存时间等关键字段,并支持分片操作。这些底层协议结构为网络编程提供了基础支持,通过原始套接字可以直接操作这些协议字段实现特定功能。
2025-09-20 18:59:20
767
原创 网络编程day03-TCP ,TCP三次握手四次挥手详解
TCP协议通过三次握手建立可靠连接,并通过四次挥手安全断开。三次握手过程中,客户端发送SYN包,服务端回应SYN+ACK包,最后客户端发送ACK包确认连接。四次挥手则通过FIN和ACK包的交互完成断开。TCP采用客户端/服务器架构,提供connect、listen和accept等接口实现通信。该协议确保数据传输的可靠性和安全性,但速度较UDP慢。
2025-09-19 21:20:52
1485
原创 网络编程day02-组播,广播
在 UDP 中,可以用组播方式,针对于同一个网段中的部分客户端进行数据发送,可以一定程度的降低发送端的工作压力。满足数据的多端接收。
2025-09-18 21:21:17
930
原创 信号量主要API及综合应用
信号量是一个底层核心模块【int】类型变量,记录当前信号量数据。线程检测对应信号量底层 int 数据数值,如果大于 0,当前线程获得 CPU 执行权,同时将信号量底层 int 数据-1 操作。如果底层数据为 0,当前线程无法获取 CPU 执行权,进入阻塞状态。同时等待信号量 > 0线程任务执行完毕,执行 V 操作,对当信号量底层 int 数据 +1,相当于释放 CPU 执行权。信号量可以控制线程互斥和线程同步。
2025-09-15 19:45:20
1113
原创 系统编程day10-同步与互斥
本文介绍了线程同步与互斥机制。互斥锁(mutex)用于确保共享资源同一时刻只能被一个线程访问,通过pthread_mutex_init、lock、unlock等函数实现。条件变量(cond)用于线程间通信,配合互斥锁使用,通过pthread_cond_wait和signal实现等待/唤醒功能。读写锁(rwlock)允许多线程同时读但独占写,提高了读多写少场景的性能。此外还讨论了死锁的成因和预防方法。文章最后通过代码示例展示了互斥锁的实际应用效果。
2025-09-13 20:16:15
982
原创 系统编程day09-线程
本文介绍了线程的基本概念、资源分配、优缺点及操作函数。线程是轻量级进程,共享进程资源但拥有独立栈空间,优点是并发性高、开销小,缺点是调试困难。详细讲解了线程创建(pthread_create)、资源回收(pthread_join)、分离(pthread_detach)、退出(pthread_exit)和取消(pthread_cancel)等核心操作,并通过代码示例演示了线程传参、多线程创建和属性设置等关键用法。最后提到线程属性初始化与销毁方法,为多线程编程提供了实用指导。
2025-09-13 09:45:02
751
原创 系统编程day08-存储映射与共享内存
存储映射 I/O (Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。于是当从缓冲区中取数据,就相当于读文件中的相应字节。于此类似,将数据存入缓冲区,则相应的字节就自动写入文件。这样,就可在不适用 read 和write 函数的情况下,使用地址(指针)完成 I/O 操作。
2025-09-12 19:54:34
1112
原创 系统调用day05信号续以及day06管道
本文摘要: 主要介绍了Linux系统中的信号处理和进程间通信技术。第一部分讲解了信号集操作函数(如sigemptyset、sigaddset等)和信号阻塞集(sigprocmask函数)的使用方法,演示了如何控制信号的阻塞和解除阻塞。第二部分详细介绍了无名管道的概念和特性,包括管道的创建(pipe函数)、读写特点以及父子进程间的通信实现。通过多个代码案例展示了管道在进程间数据传输的应用,分析了管道缓冲区大小、读写阻塞行为以及异常情况处理。文章还涉及文件描述符复制(dup/dup2函数)的技术细节。
2025-09-08 19:31:34
1057
原创 系统编程day05-进程间通信-信号
本文介绍了Linux系统中的进程间通信机制,重点讲解了信号的概念、特点及其实现方式。信号是一种软件中断机制,用于进程间异步通信,编号1-31为标准信号,34-64为实时信号。文章详细阐述了信号的产生方式(终端按键、硬件异常、软件条件等)、处理方式(忽略、终止、自定义处理)以及信号集(未决信号集和阻塞信号集)的概念。此外,还介绍了常用的信号处理函数,包括kill、raise、abort、alarm、setitimer等系统调用,以及如何通过signal和sigaction函数为信号注册自定义处理函数。最后讲解
2025-09-06 09:47:18
1579
原创 系统编程day04 - 进程2
本文主要介绍了Linux系统编程中的进程管理相关函数和概念。主要内容包括: waitpid函数的使用方法,包括参数解析、选项设置和返回值处理。通过示例演示了非阻塞回收子进程的实现。 三种特殊进程: 僵尸进程:子进程终止但未被回收,会占用系统资源 孤儿进程:父进程终止后由init进程接管 守护进程:长期运行的后台服务进程 多进程创建和回收的实现方法,包括fork循环创建多个子进程,以及使用waitpid轮询回收多个子进程。 终端相关概念:进程组、会话组,以及创建新会话的setsid函数。 exec函数族的用法
2025-09-04 20:32:45
825
原创 系统编程day03-进程
本文摘要:文章系统介绍了进程管理的核心概念与技术。主要内容包括:1)进程与程序的区别,单道/多道程序特点;2)进程状态(就绪/运行/等待)及查看方法;3)进程号(PID)管理及相关系统调用(getpid等);4)进程创建(fork函数)及父子进程关系;5)进程资源回收机制(wait/waitpid函数)。重点解析了进程控制块、并发/并行、进程状态转换等关键概念,并提供了详细的函数原型和代码示例。全文从理论到实践全面阐述了Linux环境下的进程管理机制。
2025-09-03 21:00:08
837
原创 系统编程day2-系统调用
本文概述了系统编程和系统调用的基本概念。系统编程是在操作系统下进行的编程,通过系统调用接口实现对硬件资源的访问。系统调用作为用户程序与内核的桥梁,提供了进程管理、内存管理等功能,涉及用户态和内核态的切换。重点介绍了文件描述符的概念,以及常用的系统调用函数如open、close、read、write等,说明了它们的功能、参数和返回值。这些系统调用提供了对文件的基本操作能力,是Linux系统编程的基础。
2025-09-03 20:00:27
999
原创 系统编程day1-shell
文章摘要:本文介绍了Shell编程的基础知识,包括Shell的概念、作用及分类(解释型语言与编译型语言的区别)。重点讲解了Shell脚本的执行方式、变量定义与操作(取值、清除、只读变量)、条件测试语句(文本、字符串、数值测试)以及流程控制结构(if、case、for、while等)。同时涵盖了函数定义与调用方法,并对比了不同括号()和{}的作用域差异。通过具体代码示例,帮助读者理解Shell脚本的语法特性和应用场景,为系统编程学习打下基础。全文约1500字,包含30余个代码片段。
2025-09-02 20:32:42
1210
原创 DAY13-文件操作
C语言文件操作主要通过FILE指针实现,包括fopen()、fclose()等函数。fopen()支持多种模式(r/w/a/r+/w+/a+)打开文本或二进制文件,其中'a'模式会在文件不存在时自动创建。写入操作使用fputc()、fputs()和fprintf()函数,分别用于写入字符、字符串和格式化数据;读取操作则使用fgetc()、fgets()和sscanf()函数,依次读取字符、字符串和格式化解析数据。文件操作完成后需用fclose()关闭以释放资源。示例演示了如何读写包含学生信息的结构体数据。
2025-08-27 21:19:50
535
原创 DAY12-链表
本文介绍了链表数据结构及其实现方式。首先对比了数组和链表的优缺点,指出链表在非连续空间存储数据的特性。文章详细讲解了链表的分类:按方向分为单向和双向链表;按头节点分为有头和无头链表。重点展示了四种链表实现:静态单向无头链表、静态双向无头链表、动态单向无头链表(含头插法和尾插法实现)以及动态双向有头链表。每种实现都配有代码示例和结构设计说明,特别对动态链表的节点插入操作进行了详细阐述。最后提出了基于双向有头链表的学生信息管理系统设计方案。
2025-08-27 21:03:21
510
原创 DAY11宏,条件编译
本文介绍了C语言中宏和条件编译的使用方法。宏分为无参数宏(如#define PI 3.14159)和带参数宏(如#define ADD(a,b) a+b),使用时需注意参数替换可能带来的运算优先级问题。条件编译包含三种形式:#ifdef判断标识符是否定义、#ifndef判断标识符是否未定义,以及#if根据条件真假执行不同代码块。这些功能在代码调试、平台适配等场景中非常实用。
2025-08-25 20:38:39
196
原创 常用内存操作函数文档说明
本文介绍了C语言中五种常用的内存操作函数: memchr:在内存块中搜索特定字符的首次出现位置,不因空字符终止,适用于二进制数据搜索。 memcmp:逐字节比较两个内存块的内容,返回差异结果,适用于结构体或二进制数据比较。 memcpy:高效复制内存块内容,但不处理内存重叠,需确保目标空间足够。 memmove:安全复制内存块,自动处理源与目标的重叠问题,适合移动数据或插入操作。 memset:按字节设置内存块的初始值,常用于清零或填充特定模式,效率高但需注意数据类型。
2025-08-25 20:26:03
1155
原创 常用字符串函数的函数文档说明
本文介绍了C语言中常用的字符串操作函数,分为四类:复制、拼接、比较和查找。 字符串复制 strcpy:完全复制源字符串到目标数组,不检查缓冲区长度,易溢出。 strncpy:限制复制的字符数,防止溢出,但需手动添加终止符\0。 字符串拼接 strcat:将源字符串追加到目标字符串末尾,不检查剩余空间。 strncat:安全拼接,限制追加字符数并自动添加\0。 字符串比较 strcmp:完全比较两个字符串,返回负、零或正值表示字典序关系。 strncmp:仅比较前n个字符,功能类似strcmp。 字符串查找
2025-08-25 19:09:24
1253
原创 DAY10.2结构体一点点拓展
探讨了C语言中结构体和共用体的内存分配机制。结构体采用内存对齐原则,总大小为最大成员类型的整数倍,成员顺序会影响内存占用(示例中结构体大小从44字节到56字节不等)。共用体则共享同一块内存,大小为最大成员所占空间,后赋值成员会覆盖之前数据(如32字节共用体示例)。此外,还介绍了枚举类型的基本用法,包括默认从0开始递增、自定义起始值和中途赋值等情况。这些特性对优化程序内存使用和提升代码可读性具有重要意义。
2025-08-25 17:11:57
296
原创 DAY10-结构体
本文系统介绍了C语言中结构体的概念与使用方法。主要内容包括:1)结构体的基本概念和声明方式(匿名和typedef两种);2)结构体变量的定义、初始化和访问方法;3)结构体指针的使用及动态内存分配(包括成员和整个结构体的动态分配);4)结构体数组的定义和操作;5)结构体指针数组在栈区和堆区的实现方式。文章通过具体代码示例详细演示了结构体在数据组织、内存管理等方面的应用,特别强调了指针操作和内存释放的顺序问题。
2025-08-23 09:54:23
533
原创 DAY09-指针补充与动态内存分配
文章主要讲解了C语言中的三个重要概念:1)数据存储的大小端模式区分,通过代码示例说明如何判断系统存储方式;2)二级指针的概念和使用方法,展示了如何通过二级指针访问数据;3)动态内存分配的三种函数(malloc/calloc/realloc)及其使用要点,包括内存初始化、释放和管理。文中提供了多个代码示例,帮助理解这些核心概念的实际应用,特别强调了动态内存分配的正确使用方法和注意事项。
2025-08-21 20:08:12
1139
原创 DAY08-指针与地址
本文介绍了计算机内存与指针的核心概念。首先区分了ROM(硬盘)和RAM(内存)的功能差异。重点讲解了内存地址的概念,说明指针变量如何存储地址并指向内存单元。文章详细解析了指针的基本操作(取地址、取值)和与数组的关系,包括数组名即首元素地址、地址运算规则等。特别说明了数组作为函数参数时的指针特性,以及字符串与字符数组的表示和遍历方法。最后通过字符串比较函数的实现,展示了指针在字符串处理中的应用。这些内容是理解计算机内存管理和指针操作的基础。
2025-08-20 20:50:06
929
原创 DAY07-数组及相关算法
本文介绍了C语言中数组的基本概念和使用方法。主要内容包括:1.数组是连续存储相同类型数据的构造类型,通过下标访问元素;2.数组定义格式和初始化方式;3.字符数组和字符串数组的区别;4.使用for循环遍历数组;5.数组作为函数参数的传递方式;6.重点讲解了冒泡排序和选择排序两种算法,通过示例代码演示排序过程,并优化了冒泡排序的循环次数。文章通过具体案例帮助理解数组操作及其应用场景。
2025-08-19 20:41:55
711
原创 DAY06-函数
若后续需要用到函数的返回值作为判断,我们就需要用返回值的函数类型。若结果只是需要输出等一些不需要参数返回值的场景,我们可以使用无返回值的函数类型。这里以有参数有返回值作为一个举例:函数需求:现在需要一个函数,用户提供两个int类型的数据,函数执行完,返回这两个数据中较大的那一个。需求分析:返回值类型:返回的是两个int中的一个,所以也是int类型函数名:GetMax形式参数:int num1 ,int num2。
2025-08-19 16:49:49
1161
原创 DAY04-运算符
问:已知rand()是一个1~100之间任意的一个以随机数,我们该如何操作可以得到60~100的随机数。rand()41可以取到0~40之间的任意数,加上60,我们就可以取到60~100之间的任意随机数。在for循环中,需要认清++或是--的逻辑,看是先带入还是先运算。逻辑或的两侧,只要一侧结果为真,则最后结果就为真。所谓运算,可以是一次输出,也可以是一次算数运算。,相与以后得结果才是真,否则为假。先完成一次自增操作,再带入运算。先带入运算,再完成一次自增操作。先完成一次自减操作,再带入运算。
2025-08-15 14:56:36
1110
原创 linux中vim的使用
vim是一款高度可定制、功能强大的文本编辑器。是Unix编辑器的vi增强版,以高效的操作和极低的资源占用著称,尤其适合编程、系统管理和文本处理。2.vim的安装想要使用vim的第一步就是要安装vim。在虚拟机中可以使用下面的命令进行下载安装vim,根据提示进行安装即可。
2025-08-14 14:12:13
861
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人