<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[luliplus的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/luliplus</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; luliplus]]></copyright><item><title><![CDATA[STM32F103硬件SPI单线双向模式驱动595数码管]]></title><link>https://blog.youkuaiyun.com/luliplus/article/details/156831667</link><guid>https://blog.youkuaiyun.com/luliplus/article/details/156831667</guid><author>luliplus</author><pubDate>Wed, 14 Jan 2026 00:21:09 +0800</pubDate><description><![CDATA[本文详细介绍了STM32F103硬件SPI的单线双向模式原理及应用。单线双向模式通过MOSI或MISO引脚实现半双工通信，可节省IO资源。文章重点分析了该模式的寄存器配置、数据收发过程及注意事项，特别指出接收模式下存在的时钟控制缺陷。通过驱动595数码管模块的实例，展示了单线发送模式的具体实现，包括SPI初始化、数据发送函数编写及动态刷新显示的方法。实验验证了该模式在单向数据传输场景下的可行性，为SPI接口的优化使用提供了参考方案。]]></description><category></category></item><item><title><![CDATA[STM32使用SFUD库驱动W25Q64]]></title><link>https://blog.youkuaiyun.com/luliplus/article/details/141300038</link><guid>https://blog.youkuaiyun.com/luliplus/article/details/141300038</guid><author>luliplus</author><pubDate>Sun, 15 Dec 2024 21:54:17 +0800</pubDate><description><![CDATA[SFUD是一个通用SPI Flash驱动库，它通过标准，本文简称Flash。你的电路板上可能有一片SPI Flash芯片，那么你可以使用SFUD库轻松完成对它的读/擦/写的基本操作，而不用自己去看手册，写代码造轮子。但是SFUD的功能不仅仅于此：①通过SFUD库可以实现在一个项目中对多个Flash的同时驱动，只要把他们注册到SFUD的flash_table中即可 ②嵌入式产品因为供货问题替换芯片型号是常有的事，如果我们的驱动代码是针对某一个具体的Flash而写的，那么每换一个型号可能就要修改一下代码。]]></description><category></category></item><item><title><![CDATA[STM32F103之DMA]]></title><link>https://blog.youkuaiyun.com/luliplus/article/details/140967391</link><guid>https://blog.youkuaiyun.com/luliplus/article/details/140967391</guid><author>luliplus</author><pubDate>Sun, 18 Aug 2024 02:30:54 +0800</pubDate><description><![CDATA[DMA，即Direct Memory Access，是一种在无需CPU参与的情况下，将数据在存储器（单片机的RAM）和外设（一般是I/O设备）之间高效传输的硬件机制。实现这种功能的集成电路单元叫做DMA Controller，即DMA 控制器。]]></description><category></category></item><item><title><![CDATA[STC8G之硬件I2C接口]]></title><link>https://blog.youkuaiyun.com/luliplus/article/details/139031154</link><guid>https://blog.youkuaiyun.com/luliplus/article/details/139031154</guid><author>luliplus</author><pubDate>Sun, 19 May 2024 10:51:06 +0800</pubDate><description><![CDATA[STC8G系列单片机拥有一个I2C接口。它支持主机模式和从机模式。本文主要介绍主机模式。]]></description><category></category></item><item><title><![CDATA[STC8G之PCA模块详解]]></title><link>https://blog.youkuaiyun.com/luliplus/article/details/138924253</link><guid>https://blog.youkuaiyun.com/luliplus/article/details/138924253</guid><author>luliplus</author><pubDate>Sat, 18 May 2024 16:13:12 +0800</pubDate><description><![CDATA[STC8G系列有1个PCA控制器，它带有3个通道（3 channel），或者说3个子模块，他们都共用一个16位的定时器：PCA Base Timer。这个定时器为3个子模块提供时基。PWM发生器（对外输出PWM波）软件模拟定时器脉冲输出（输出可编程的方波信号）捕获模式（对外部输入到引脚的电平信号进行采样）]]></description><category></category></item><item><title><![CDATA[FreeRTOS基础七：资源管理]]></title><link>https://blog.youkuaiyun.com/luliplus/article/details/121320167</link><guid>https://blog.youkuaiyun.com/luliplus/article/details/121320167</guid><author>luliplus</author><pubDate>Sun, 24 Sep 2023 17:02:09 +0800</pubDate><description><![CDATA[实现多个任务对同一个资源的互斥访问，以确保资源在使用过程中的状态的一致性，确保安全使用。



FreeRTOS使用了PendSV和SysTick中断。

要将configKERNEL_INTERRUPT_PRIORITY 设置为系统中优先级最低的值。这个优先级是用来设置PendSV和SysTick中断的优先级。在port.c文件中的xPortStartScheduler函数中，内核配置了PendSV和SysTick中断的优先级。



临界区

临界区的底层原理是非常简单而粗暴的。



互斥体

互斥体]]></description><category></category></item><item><title><![CDATA[FreeRTOS基础六：中断管理2]]></title><link>https://blog.youkuaiyun.com/luliplus/article/details/132383525</link><guid>https://blog.youkuaiyun.com/luliplus/article/details/132383525</guid><author>luliplus</author><pubDate>Sat, 19 Aug 2023 22:09:54 +0800</pubDate><description><![CDATA[我们可以把这一些需要受内核管理的中断，优先级设置的低一些，把另一些不允许关闭的中断优先级设置的高一些，然后通过BASEPRI这个寄存器把优先级低于某个值的（优先级寄存器的值大于等于某个值的）中断一口气全屏蔽掉，这样我们在进入临界段前，只保存BASEPRI的值就好了。如下图所示，向一个STM32F103单片机的中断A的优先级寄存器中写入数据0101_1111，向中断B的优先级寄存器中写入数据0111_1111，由于只有高4位有效，因此中断A的数值优先级是5，中断B的数值优先级是7，且B的优先级高于A。]]></description><category></category></item><item><title><![CDATA[GD32移植CoreMark实现性能测评]]></title><link>https://blog.youkuaiyun.com/luliplus/article/details/125624285</link><guid>https://blog.youkuaiyun.com/luliplus/article/details/125624285</guid><author>luliplus</author><pubDate>Tue, 05 Jul 2022 22:18:40 +0800</pubDate><description><![CDATA[本文将演示CoreMark移植到GD32/STM32上进行性能测评。文章末尾给出了GD32F130C8T6，GD32F303CCT6和STM32F103ZET6三款单片机的测试对比结果。访问CoreMark的Github主页，下载如下图所示的源文件。在工程中新建一个子目录CoreMark，并放入其中。在Keil开发环境中，需要对CoreMark源文件(.c)加入到分组中，并指定CoreMark的头文件的包含路径，这些步骤不再赘述。 main函数CoreMark代码框架定义了main函数，因此我们要屏蔽掉自己]]></description><category></category></item><item><title><![CDATA[Air724UG之串口通信]]></title><link>https://blog.youkuaiyun.com/luliplus/article/details/125295142</link><guid>https://blog.youkuaiyun.com/luliplus/article/details/125295142</guid><author>luliplus</author><pubDate>Wed, 15 Jun 2022 14:52:41 +0800</pubDate><description><![CDATA[Air724UG串口通信]]></description><category></category></item><item><title><![CDATA[GD32F130之USART多机通信]]></title><link>https://blog.youkuaiyun.com/luliplus/article/details/124204211</link><guid>https://blog.youkuaiyun.com/luliplus/article/details/124204211</guid><author>luliplus</author><pubDate>Tue, 07 Jun 2022 16:14:06 +0800</pubDate><description><![CDATA[简介

在多机通信中，一个从机应该只接收它需要接收的数据，且只应该在它需要接收数据时才检测串口。而始终接收RX线上的数据对从机来说是一种负担。



多机通信硬件设计

远距离方案：RS485

板级方案：





静默模式

静默模式有什么作用？

答：如果 USART 处于静默模式，所有的接收状态标志位将不会被置位。

如何进入静默模式？

答：软件可以通过将 USART_CMD 寄存器中MMCMD 位置 1 使 USART 进入静默模式。

如何从静默模式中唤醒？

答：有两种方式可选，①检测到总线]]></description><category></category></item><item><title><![CDATA[GD32F130之LVD低压检测]]></title><link>https://blog.youkuaiyun.com/luliplus/article/details/124547300</link><guid>https://blog.youkuaiyun.com/luliplus/article/details/124547300</guid><author>luliplus</author><pubDate>Thu, 05 May 2022 16:34:08 +0800</pubDate><description><![CDATA[阿萨德sad手大sadsadsad阿萨德撒阿萨德阿萨德的


]]></description><category></category></item><item><title><![CDATA[GD32F130之FMC用户非易失存储器]]></title><link>https://blog.youkuaiyun.com/luliplus/article/details/124547331</link><guid>https://blog.youkuaiyun.com/luliplus/article/details/124547331</guid><author>luliplus</author><pubDate>Tue, 03 May 2022 20:14:07 +0800</pubDate><description><![CDATA[广义上的EEPROM的分类

PROM：即Programmable ROM的缩写，也就是可编程ROM。可编程的意思通俗说就是可以写入自定义的数据。PROM出厂后，用户可以进行“一次”数据改写操作，之后就无法继续改写了。
	EPROM：可擦除(erase)、可编程ROM。也就是说用户除了可以进行编程外，还可以将前一次编程的数据抹去，这样就可以继续进行编程了。所以用户可以进行多次“擦除-编程-当做ROM使用”操作。这种芯片大多使用紫外线进行擦除，芯片封装上开了一个小窗口，放在紫外线下一段时间就可以将数据擦除，擦]]></description><category></category></item><item><title><![CDATA[STM32单片机不同boot模式的本质]]></title><link>https://blog.youkuaiyun.com/luliplus/article/details/124392543</link><guid>https://blog.youkuaiyun.com/luliplus/article/details/124392543</guid><author>luliplus</author><pubDate>Mon, 25 Apr 2022 13:28:32 +0800</pubDate><description><![CDATA[简介

如下图所示，是CM3内核规定的4GB地址空间的划分情况。于是各个芯片设计厂商（如ST，NXP等）在设计CM3内核单片机时，就会遵守这个规定。





下图是STM32F103系列的存储器映射方案图。可以发现，⑤处SRAM映射的地址确实是从0x20000000开始，结束地址取决于单片机SRAM的实际大小。

在①处的Code空间，ST将【④System memory】、【③Main Flash memory】和【②Aliasd memory】映射在此。

其中【System memory】就是存储单]]></description><category></category></item><item><title><![CDATA[爆改串口实现OneWire驱动DS18B20]]></title><link>https://blog.youkuaiyun.com/luliplus/article/details/124227612</link><guid>https://blog.youkuaiyun.com/luliplus/article/details/124227612</guid><author>luliplus</author><pubDate>Sun, 17 Apr 2022 18:36:44 +0800</pubDate><description><![CDATA[OneWire简介

由美信（Maxim）开发

OneWire是一种单总线通信接口，一根双向数据线，还有一根共同电压参考地线。
	低速(15kbps)，串行半双工通信
	可以支持100米长距离通信
	单主多从总线结构，最多支持63个从机挂接在同一个总线上。
	总是由主机发起通信过程，从机是被动参与通信。
	每个字节数据传输时，位按照LSB顺序
	每个OneWire从机都有一个出厂就设定好的，固化在ROM中的不可更改的64位器件唯一ID。
	主机和从机的数据线驱动引脚都要配置为开漏输出模式。总线通过一个外部]]></description><category></category></item><item><title><![CDATA[记群内因串口DMA发送而引发的讨论]]></title><link>https://blog.youkuaiyun.com/luliplus/article/details/124127341</link><guid>https://blog.youkuaiyun.com/luliplus/article/details/124127341</guid><author>luliplus</author><pubDate>Tue, 12 Apr 2022 18:41:34 +0800</pubDate><description><![CDATA[起初我的发送代码写的是下面这种实现：


void USART0_printf(const char*format , ...)
{
	int tx_len;
	va_list args;
	
    //将要发送的数据写入到DMA发送缓冲区USART0_tx_dma_buf
	va_start(args,format);
	tx_len = vsnprintf((char*)USART0_tx_dma_buf,USART0_TX_DMA_BUF_SIZE,format,args);
	va_end(arg]]></description><category></category></item><item><title><![CDATA[vsnprintf函数使用]]></title><link>https://blog.youkuaiyun.com/luliplus/article/details/124123219</link><guid>https://blog.youkuaiyun.com/luliplus/article/details/124123219</guid><author>luliplus</author><pubDate>Tue, 12 Apr 2022 14:57:55 +0800</pubDate><description><![CDATA[简介

作用：使用vsnprintf()用于向一个字符串缓冲区打印格式化字符串，且可以限定打印的格式化字符串的最大长度。

此函数需要C99或者C++11及以上版本才能支持。


int vsnprintf (char * sbuf, size_t n, const char * format, va_list arg );

参数sbuf：用于缓存格式化字符串结果的字符数组

参数n：限定最多打印到缓冲区sbuf的字符的个数为n-1个，因为vsnprintf还要在结果的末尾追加\0。如果格式化字符串长度大]]></description><category></category></item><item><title><![CDATA[USART+DMA+循环队列接收不定长数据]]></title><link>https://blog.youkuaiyun.com/luliplus/article/details/124103318</link><guid>https://blog.youkuaiyun.com/luliplus/article/details/124103318</guid><author>luliplus</author><pubDate>Mon, 11 Apr 2022 21:53:52 +0800</pubDate><description><![CDATA[GD32F130之FreeRTOS环境下USART+DMA接收不定长数据
]]></description><category></category></item><item><title><![CDATA[GD32F130之DMA]]></title><link>https://blog.youkuaiyun.com/luliplus/article/details/123723700</link><guid>https://blog.youkuaiyun.com/luliplus/article/details/123723700</guid><author>luliplus</author><pubDate>Mon, 11 Apr 2022 19:49:12 +0800</pubDate><description><![CDATA[什么是DMA

DMA，即Direct Memory Access，是一种在无需CPU参与的情况下，将数据块在内存（SRAM）和外设（一般是I/O设备）之间高效传输的硬件机制。实现这种功能的集成电路单元叫做DMA Controller，即DMA 控制器。

使用DMA的好处

一般情况下，为了实现内存（SRAM）和外设（一般是I/O设备）之间的数据传输，有三种常用的方法：轮循法（polling），中断法（interrupt）以及本文要介绍的DMA方法。

轮循法（polling）：在主循环中，CPU不断检查]]></description><category></category></item><item><title><![CDATA[FreeRTOS基础四：特殊的队列之邮箱]]></title><link>https://blog.youkuaiyun.com/luliplus/article/details/121104782</link><guid>https://blog.youkuaiyun.com/luliplus/article/details/121104782</guid><author>luliplus</author><pubDate>Mon, 11 Apr 2022 16:38:49 +0800</pubDate><description><![CDATA[邮箱(Mailbox)

FreeRTOS中的队列有一种特殊的用法，我们把它叫做邮箱。邮箱不是另一种组件，它还是队列，只是用法比较特殊而已。

邮箱是长度为1的队列
]]></description><category></category></item><item><title><![CDATA[FreeRTOS基础四：队列]]></title><link>https://blog.youkuaiyun.com/luliplus/article/details/121087810</link><guid>https://blog.youkuaiyun.com/luliplus/article/details/121087810</guid><author>luliplus</author><pubDate>Mon, 11 Apr 2022 15:33:57 +0800</pubDate><description><![CDATA[FreeRTOS中的队列组件提供了任务到任务，任务到中断以及中断到任务的通信机制。

当队列创建的时候，队列的长度和元素的大小都设定好了。

队列的基本特性



备份入队策略

Queue by copy vsersus Queue by reference



队列的创建和使用

使用xQueueCreate()内核函数来创建一个队列。队列的存储空间从FreeRTOS heap中分配。在使用xQueueCreate()创建队列时，如果FreeRTOS heap中没有足够的存储空间分配给当前队列，则函数]]></description><category></category></item></channel></rss>