- 博客(72)
- 收藏
- 关注
原创 快速设计简易嵌入式操作系统(5):贴近实际场景,访问多外设,进一步完善程序
其次,两种状态都是关联到这俩任务上的,由于任务逻辑较为简单,所以可以作为是各任务此时的状态,而区分任务的量是其id号,然后状态的变化在于规定的时间,时间的变化在于计数的多少,也就是说:通过对id号的判断,容易获取任务的状态;,然后好不容易切换到另一个任务以后,因为任务1本身闪烁的延时又延时了1s,最后任务1的LED才出现闪烁的现象,整个过程算下来实际任务1的LED就是每2s闪烁一次了,任务0的LED闪烁情况也是同理。接下来,我们优化代码,首先就是对于延时的优化,采取硬件的方式来实现。
2025-08-15 17:36:08
613
原创 快速设计简易嵌入式操作系统(4):继续完善基于STC8的操作系统设计,添加任务切换机制:任务调度器实现
完善基于STC8的简单操作系统设计之任务调度器实现
2025-08-13 12:04:48
643
原创 C语言模拟 MCU 上电后程序的执行顺序 + 回调函数机制 + 程序计数器(PC)和堆栈的作用
本次叙述了笔者一个尝试,C语言模拟MCU上电过程和回调原理
2025-08-11 19:07:29
852
原创 快速设计简单嵌入式操作系统(3):动手实操,基于STC8编写单任务执行程序,感悟MCU指令的执行过程
本次内容叙述了基于STC8单片机的单任务执行的代码实操,简单理解了MCU上电后执行程序指令的基本流程。
2025-08-11 18:30:41
825
原创 GitHub使用小记——本地推送、外部拉取和分支重命名
本文记录了笔者使用git或vscode进行版本管理时涉及到的代码推送、拉取、分支重命名等基础操作方法
2025-07-30 20:42:21
994
原创 简易数字钟的设计仿真(基于QuartusII18.0和仿真软件ModelSim10.5b)
刚开始计时时,系统从 00:00:00 启动,报时模块在首个时钟上升沿检测到分钟和秒均为 0,输出高电平,但下一时钟沿秒计数器即开始计数,秒值变为 01,报时条件不满足,信号仅维持一个时钟周期,呈现瞬间高电平;从分频器的 10 分频实现,到计数器的循环进位逻辑,再到报时模块的条件判断,每个环节都需要将理论知识转化为具体的 VHDL 代码,过程中深刻体会到硬件设计与时序逻辑的严格性——例如秒计数器在 59 时的归零与进位同步问题,必须通过精确的状态转换控制才能避免逻辑错误。设计达到预期目标,功能基本达成。
2025-06-29 13:33:10
661
原创 二叉树实验
接着,我们需要表示二叉树的节点,所以应该定义一个名为TreeNode的结构体。每个节点包含一个字符型数据字段,以及指向左右子节点的指针。这样的结构非常贴合二叉树的定义。100// 输入字符串最大长度// 二叉树节点结构体char data;} TreeNode;宏定义是为了限制输入字符串的最大长度,防止缓冲区溢出,保证程序安全性。此外,我们为了标识不同的遍历方式,可以定义一个枚举类型。使用枚举提高了程序的可读性,也方便后续判断使用哪种遍历方式。// 三种二叉树遍历方式枚举。
2025-05-30 15:49:23
1046
原创 计算机网络常见体系结构、分层必要性、分层设计思想以及专用术语介绍
本文讲述了计算机网络常见体系结构、分层设计的必要性、分层处理思想以及相关专业术语等。相关叙述、图片参考《计算机网络微课堂》视频以及《计算机网络 第七版》教材。
2025-05-29 19:20:56
1148
2
原创 计算机网络相关发展以及常见性能指标
本文讲述了因特网概述、三种交换方式、计算机网络定义和分类以及其常见性能指标等内容,全文及相关图片均参考《计算机网络微课堂》视频。
2025-05-29 06:10:21
900
原创 顺序表实验
我们定义一个结构体SeqList// 动态顺序表结构体定义// 动态数组指针int size;// 当前有效数据数量// 数组容量} SL;关键点说明arr是指向动态数组的指针,用于存储数据。size表示当前已有的元素个数。capacity表示当前分配的最大容量。ElemType被定义为int,可以根据需要修改为其他类型。掌握了顺序表的定义与基本操作实现了有序插入、数据反转等实用功能学会了随机数生成与格式化输出技巧理解了C语言中动态内存的申请与释放机制。
2025-05-26 13:32:20
792
原创 STM32基础综合案例:花式流水灯(寄存器实现)
一、需求描述引言前面陆陆续续学习了STM32的相关知识,截至目前,其基础知识就算学完了。接下来,我们将借助一个综合的案例——花式流水灯,以巩固前面学习的STM32相关知识,包括GPIO的使用、按键控制、中断控制、串口使用以及I2C的使用。案例描述本案例“花式流水灯”旨在通过实现一个,综合应用包括技术。系统设计用于,用户可以,并使用特定符号进行分隔。此外,通过的显示。系统启动时会尝试从M24C02 EEPROM中读取预存的方案数据,若无数据则等待串口指令并更新存储。
2025-02-16 14:18:32
1190
2
原创 硬件实现I2C案例(HAL库实现)
二、硬件电路设计引言前面陆陆续续利用寄存器方式实现了软件模拟I2C、硬件实现I2C的案例。接下来,我们使用HAL库的方式实现以下硬件I2C案例。当然了,本次案例可能复用前面寄存器实现的硬件I2C案例中实现的某些代码块,所以建议看这之前可以先看看前面寄存器实现的案例介绍。一、需求描述二、硬件电路设计本次案例属于是前面寄存器实现的硬件I2C案例的另一种实现方式,故需求和硬件设计不变,不清楚的可参考下面文章:硬件实现I2C案例(寄存器实现)_iic硬件电路-优快云博客三、软件设计。
2025-02-14 13:31:05
2105
原创 硬件实现I2C案例(寄存器实现)
首先,读取SR1已经在等待过程的条件中进行,然后由于我们BTF是在传输数据过程中被置位的,而之后的传输无非两种情况:一是继续传输数据,则在下一次用到BTF之前就会进行数据的读写操作,此时BTF会被自动清除;这就意味着,从机发送数据到总线上后发出的应答以及之后主机发出的停止信号应该在当前发送数据前设置好才对,换句话说,如果从机发送数据了之后才设置ACK以及STOP的话,会导致这俩信号将在这之后传输的字节接收后才产生,这样的话就对应的就是下一次传输的字节数据的应答与停止了。而且寄存器对这俩标志位的描述是。
2025-02-07 21:18:22
1398
1
原创 硬件实现I2C常用寄存器简单介绍
而从模式下需要判断停止信号是否发出(STOPF),是因为从设备需要保证确实识别到通信结束了再去开始一段新的通信,否则从设备贸然停止本次通信将有失配合,而停止信号表示主设备结束了当前传输,从设备可以准备下一次通信,所以为了保证在主设备确实发出停止信号后再去进行新的通信,这里从设备需要一个标志STOPF来判断主机已经发出停止信号。可与串口介绍寄存器时的RXNE类比,通常用于接收或者读取数据前的判断数据寄存器是否填满,填满了意味着可以开始接收数据了,此时自动置1,软件对数据寄存器进行读写时会自动清除。
2025-02-07 00:08:04
1116
原创 I2C外设基本介绍
同时,无论在模拟的周期频率上,还是在时序的模拟上,利用软件模拟的I2C也显得没那么精准,而且大量的延时和电平的控制全部都需要CPU进行控制,大大加重了CPU的负担......考虑到这些问题,本次我们就来介绍32中的。首先,深入SDA数据总线,箭头走向一个数据控制模块,顾名思义控制来往数据的,因为I2C协议规定位传输高位先行,所以箭头继续直接走向【数据移位寄存器】的最右方,表示外部接收的数据从低位进入移位寄存器,然后不断左移依次填满,最后将移位寄存器中满满的数据并行交给DR数据寄存器处理。
2025-02-06 20:28:32
829
原创 软件模拟I2C案例(寄存器实现)
宏定义起到一个全局替换的效果,经过宏定义,我们可以将某些复杂代码利用简洁移动的语句进行代替,增强代码可读性和编写效率。(1)由于I2C协议涉及到。
2025-02-06 12:29:47
1805
原创 模拟I2C通讯之时序图整理
引言前面介绍了I2C通讯的概念、原理以及协议,然后在介绍了支持I2C协议的一款EEPROM芯片M24C02的相关知识后,接下来我们再来整理一下STM32使用I2C通讯与M24C02芯片进行数据传递所需要理解的一些。一、I2C通讯协议相关时序1、起始和停止信号I2C通讯时进行数据传递前我们先会有一个起始信号,同时数据传递结束后会有一个停止信号。由上述时序图可知,一开始设备不会占用总线即总线空闲,默认高阻态,同时总线外边连上拉电阻接到电源,所以总线呈现高电平。
2025-02-03 13:36:01
2218
原创 软件模拟I2C案例前提须知——EEPROM芯片之M24C02
值得注意的是,本次案例使用的软件模拟I2C,所以我们并不会使用STM32芯片内部的I2C模块,只是借助软件去模拟I2C协议的时序状态。接着还有两个引脚分别是SCL和SDA,显然就是连接两根总线的引脚。由于该芯片手册不光是关于M24C02芯片的介绍,还有M24C01等的介绍,所以这里关于存储上有两种,分别是1kbit和2kbit,当然,我们的芯片内存时2kbit。这里的设备地址是进行数据传递之前就要先知道的设备码,之后才会根据需要去传输对应的EEPROM存储器中对于的内存单元,也就是那个8位的数据地址。
2025-02-01 12:24:15
1528
原创 I2C基础知识
引言引言这里祝大家新年快乐!前面我们介绍了串口通讯协议,现在我们继续来介绍另一种常见的简单的串行通讯方式——。一、什么是I2C是由Phiilps公司在上个世纪80年代开发的,其英文翻译过来实际上是【内部集成电路】,所以他就是为。关于,简单说明一下:根据英文缩写,应该是写成IIC,不过通常我们读的时候会把两个I读成I2(I的平方的意思,标准写法的2应该是在I的右上角)。之所以平时描述时直接写I2C,主要是因为打角标相对麻烦,所以就出现这样的写法。
2025-01-31 20:55:00
1328
原创 STM32调试手段:重定向printf串口
其实也非常简单,其在STM32CubeMX中需要进行的配置和前面串口通讯轮询案例的HAL库实现需要的配置是一样的,因为本次作重定向主要就只是多重写一个fputc函数,即。很简单,只需要将 fputc 里面的输出指向 STM32 串口即可,fputc 函数有固定的格式,我们只需要在函数内操作STM32串口即可。我们知道 C 语言中printf 函数默认输出设备是控制台,如果要实现在串口或者 LCD 上显示,必须重定义C语言标准库函数里调用的与输出设备相关的函数。然后,根据上面所述原理,这里直接给上。
2025-01-22 16:53:08
4572
原创 USART_串口通讯中断案例(HAL库实现)
我们现在是想找一下串口中断相关的回调函数,所以先得知道怎么样用该文件中定义的内容,如上图有描述“如何使用这个driver”,大概就是会涉及到咱要找的回调函数了。当然本次我们主要是借助中断实现数据的接收,所以看看关于数据接收的中断回调函数即可,其他的我们有时间自己去同理试一试也可以的。,这就说明我们此时不是自己给长度了,其会自动检测数据长度,因此我们可以直接从中断回调函数中拿到我们接受到的数据的长度,然后在发送接收数据时传进去即可。前面,我们使用HAL库实现了串口通讯的轮询案例,接下来,我们。
2025-01-21 18:21:00
1260
原创 USART_串口通讯轮询案例(HAL库实现)
多了一个判断,因为这里HAL库中的发送是无脑直接拿到数据就发的,我们现在在循环中,没有发之前给的buffer,虽然我们没写入数据,但是其初始化是0,所以此时接收到的就是0,即发送就会直接把“\0”全部发出来。而为了避免这种情况,我们对接收函数做一个判断,因为其是有返回值的,就是为了避免接收有问题,当它确实正确接收到数据后,就会返回HAL_OK,所以我们这里判断它是否等于这个,等于即说明接收到我们发的了,这样我们再把数据发出来就好了。显然,这里就看见GPIO口的配置了,同时我们会发现,上面它定义了一个。
2025-01-20 17:53:09
1839
原创 USART_串口通讯中断案例(一)(寄存器实现)
根据前面轮询案例的分析,我们发现在进行字符串收发的时候形成的循环阻塞相对会多一些,一方面有单字符内部接收时的轮询、另一方面还有我们循环每一次的单字符接收,这样的轮询接收字符的方式就会大大降低CPU的执行效率。由于我们案例使用的串口是USART1,所以我们首先得去知道USART1的中断处理函数叫啥,前面讲述中断的时候说过:可以直接。前面轮询案例已经介绍了串口主要使用的一些寄存器,这里我们将使用中断来进行串口通讯,所以避免不了的是开启串口相关中断使能,按照前面介绍的寄存器,如果看得仔细的朋友应该能发现,在。
2025-01-19 15:07:03
1243
原创 USART_案例(一)接收字符串代码改进
注意:这里最后我们让接收到的字符长度-1,是因为接收字符串时最后产生空闲帧结束字符接收会再多返回一个0,在字符串中就是“\0”,但是这不是我们希望收到的字符,所以我们干脆长度-1,这样就不会显示出来,在逻辑上我们就相当于没有接收到额外的字符了,这样也更符合我们接收的内容。根据上面的理解,TXE为1是指此时发送的数据为空,可以开始下一轮数据的发送。根据上图说明我们容易知道TXE表示的是发送数据寄存器为空的标志,当数据寄存器中的数据被转移到移位寄存器时就会被置1,当我们再次写入数据的时候,该位又会清零。
2025-01-18 20:59:47
813
原创 STM32之USART_串口通讯
目录引言一、通讯相关基础1.1 并行通讯与串行通讯1.2 单工、半双工、全双工通讯1.3 同步与异步通讯1.4 串口介绍1.5 串口通讯协议二、USART外设三、USART_功能框图原理介绍四、波特率的设置五、总结引言 本次介绍STM32中片上外设中的模块之一——串口通讯模块,也是最为简单基础的一种串口通讯,其名称也叫USART。当然,串口、USART这俩概念到底是什么、他们俩之间的关系是什么、哪些模块叫串口、我们可能见过的RS232等就叫
2025-01-16 15:12:06
2155
2
原创 STM32按键中断案例(HAL库实现)
现在,我们再来基于HAL库对该案例进行二次实现,关于HAL库的基本操作流程,如果有朋友还不熟悉的话,可以参考我前面最初关于HAL库的基本介绍以及基于HAL库实现流水灯的详细讲解,这里我们就直接开始实现了。会发现,调用的函数中也主要是俩条语句,实际上551行这个语句时清除中断标志位的意思,参数就是我们传进来的按键对应端口,其底层就是我们寄存器实现时配置的挂起寄存器,不信我们可以看看。然后如下图看看生成的代码,发现我们寄存器方式编写的大部分代码,如按键和LED的初始化都已经自动生成好了,也就是说。
2025-01-10 22:47:53
1995
1
原创 STM32按键中断案例(基于寄存器)
三、软件设计由于本次案例将基于寄存器实现,同时本次案例中涉及到中断处理,通过我们前面对中断的学习容易发现,处理中断过程中会。
2025-01-10 18:18:19
1314
空空如也
软考中级嵌入式系统设计师证对后面工作的性价比
2024-12-05
TA创建的收藏夹 TA关注的收藏夹
TA关注的人