<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Fatherxom的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Fatherxom</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Fatherxom]]></copyright><item><title><![CDATA[DMA直接存储器存储]]></title><link>https://blog.youkuaiyun.com/Fatherxom/article/details/166686734</link><guid>https://blog.youkuaiyun.com/Fatherxom/article/details/166686734</guid><author>Fatherxom</author><pubDate>Sat, 26 Sep 2026 10:48:36 +0800</pubDate><description><![CDATA[这段代码的问题很典型：CPU 全程阻塞。转换期间 CPU 除了等什么都干不了，主循环被拖死。切换通道有代价。刚切完通道就读，容易读到上一个通道的残影。实时性差。如果此时来了一个中断或要处理通信，只能排队。DMA 的本质：在总线矩阵上挂一个独立的硬件搬运引擎，它和 CPU 平级，都能访问总线和存储器。配置好源地址、目的地址、搬运数量后，它自动一趟一趟地搬，搬完举手（置标志位或发中断）通知 CPU。]]></description><category></category></item><item><title><![CDATA[ADC模数转换器]]></title><link>https://blog.youkuaiyun.com/Fatherxom/article/details/166685825</link><guid>https://blog.youkuaiyun.com/Fatherxom/article/details/166685825</guid><author>Fatherxom</author><pubDate>Sat, 26 Sep 2026 10:33:43 +0800</pubDate><description><![CDATA[ADC（Analog-to-Digital Converter，模数转换器）的工作可以拆成三步：连续变化的电压 ──► 采样（Snapshot）──► 量化（打格子）──► 编码（输出数字）采样：在某个瞬间"拍一张照片"，把电压值固定住。量化：把 0～Vref 的电压范围切成 2ⁿ 个格子（n 为分辨率）。STM32 主流是 12 位，即切成 4096 格。编码：告诉 CPU 这个电压落在第几个格子里。]]></description><category></category></item><item><title><![CDATA[STM32定时器（TIM）全解：定时中断 / 输出比较 / 输入捕获 / 编码器接口]]></title><link>https://blog.youkuaiyun.com/Fatherxom/article/details/165721480</link><guid>https://blog.youkuaiyun.com/Fatherxom/article/details/165721480</guid><author>Fatherxom</author><pubDate>Thu, 17 Sep 2026 10:46:18 +0800</pubDate><description><![CDATA[总结一句话：定时器的本质就是一个"可编程的计数器"。定时中断用它来计时，输出比较用它来产生波形，输入捕获用它来测量波形，编码器接口用它来追踪旋转。四种模式只是同一个硬件的不同"玩法"，掌握了 CNT、PSC、ARR、CCR 这四个寄存器的关系，就掌握了整个定时器。]]></description><category></category></item><item><title><![CDATA[EXTI外部中断]]></title><link>https://blog.youkuaiyun.com/Fatherxom/article/details/165578616</link><guid>https://blog.youkuaiyun.com/Fatherxom/article/details/165578616</guid><author>Fatherxom</author><pubDate>Wed, 16 Sep 2026 15:13:05 +0800</pubDate><description><![CDATA[1. 开启GPIO时钟，配置引脚为输入模式2. 开启AFIO时钟（复用功能时钟，EXTI需要用到）3. 将GPIO引脚连接到EXTI中断线4. 配置EXTI触发方式（上升沿/下降沿/双边沿）5. 配置NVIC优先级，使能中断通道6. 编写中断服务函数，清除中断标志位。]]></description><category></category></item><item><title><![CDATA[GPIO的输入与输出]]></title><link>https://blog.youkuaiyun.com/Fatherxom/article/details/165577276</link><guid>https://blog.youkuaiyun.com/Fatherxom/article/details/165577276</guid><author>Fatherxom</author><pubDate>Wed, 16 Sep 2026 14:59:16 +0800</pubDate><description><![CDATA[你可以把GPIO理解成单片机的“手指”：想控制外面的设备（比如点亮LED、让蜂鸣器响）就通过它输出信号，想知道外面的状态（比如有没有按按键、传感器有没有触发）就通过它读取信号，是嵌入式开发最基础也最常用的功能。我们使用的STM32F103C8T6芯片共有4组16个GPIO引脚（PA0~PA15、PB0~PB15等），每个引脚的电平只有两种状态：高电平（1）：3.3V低电平（0）：0V。]]></description><category></category></item><item><title><![CDATA[ Framebuffer应用编程]]></title><link>https://blog.youkuaiyun.com/Fatherxom/article/details/163345126</link><guid>https://blog.youkuaiyun.com/Fatherxom/article/details/163345126</guid><author>Fatherxom</author><pubDate>Thu, 30 Jul 2026 22:49:12 +0800</pubDate><description><![CDATA[在Linux世界里，一切皆文件。如果你想在Linux系统（尤其是嵌入式设备）上直接控制LCD屏幕，画个线条、显示个图片，该怎么做？答案就是——。简单来说，Framebuffer就是内核在内存中划出的一块“画板”。你不需要去管底层复杂的硬件时序，只需要往这块内存里写颜色数据，LCD控制器就会自动把数据搬到屏幕上显示出来。]]></description><category></category></item><item><title><![CDATA[Linux串口应用编程——GPS]]></title><link>https://blog.youkuaiyun.com/Fatherxom/article/details/163283396</link><guid>https://blog.youkuaiyun.com/Fatherxom/article/details/163283396</guid><author>Fatherxom</author><pubDate>Tue, 28 Jul 2026 23:49:46 +0800</pubDate><description><![CDATA[想象一下，你的电脑要通过一根线和一个陌生的硬件（GPS模块）对话，它们必须先约定好“暗号”，比如说话的语速（波特率）、数据的格式等等。我们今天实现读取 GPS 模块的数据。我将其分成了四个部分来讲解，组合起来就是整个程序。]]></description><category></category></item><item><title><![CDATA[文件IO的介绍]]></title><link>https://blog.youkuaiyun.com/Fatherxom/article/details/163222075</link><guid>https://blog.youkuaiyun.com/Fatherxom/article/details/163222075</guid><author>Fatherxom</author><pubDate>Sun, 26 Jul 2026 23:39:10 +0800</pubDate><description><![CDATA[和。两者的区别和使用场景各有不同，我们分别来看。]]></description><category></category></item><item><title><![CDATA[Makefile]]></title><link>https://blog.youkuaiyun.com/Fatherxom/article/details/162832302</link><guid>https://blog.youkuaiyun.com/Fatherxom/article/details/162832302</guid><author>Fatherxom</author><pubDate>Tue, 14 Jul 2026 08:00:00 +0800</pubDate><description><![CDATA[使用keil, mdk,avr等工具开发程序时点击鼠标就可以编译了，它的内部机制是什么？它怎么组织管理程 序？怎么决定编译哪一个文件？答：实际上windows工具管理程序的内部机制，也是Makefile，我们在linux下来开发裸板程序的时候， 使用Makefile组织管理这些程序，本节我们来讲解Makefile最基本的规则。Makefile要做什么事情呢？组织管理程序，组织管理文件.makefie最基本的语法是规则，规则：当“依赖”比“目标”新，执行它们下面的命令。]]></description><category></category></item><item><title><![CDATA[Linux目录，文件夹及文件相关命令]]></title><link>https://blog.youkuaiyun.com/Fatherxom/article/details/162826116</link><guid>https://blog.youkuaiyun.com/Fatherxom/article/details/162826116</guid><author>Fatherxom</author><pubDate>Mon, 13 Jul 2026 09:43:37 +0800</pubDate><description><![CDATA[1.命令（command）：表⽰要执⾏的具体命令或程序。命令可以是系统⾃带的内置命令，也可以是可执⾏ 程序或脚本⽂件。2.选项（options）：表⽰对命令的配置或修改。选项通常以短格式（单个字⺟前缀，如 （完整的单词前缀，如 -a ）或⻓格式--all ）提供。选项可以⽤来控制命令的⾏为、修改默认设置或提供额外的功 能。3.参数（arguments）：⽤于命令的输⼊或操作对象。参数是命令的操作数，可以是⽂件、⽬录、⽂本、数 字等。命令的参数通常紧跟在选项之后。]]></description><category></category></item><item><title><![CDATA[自定义类型：结构体]]></title><link>https://blog.youkuaiyun.com/Fatherxom/article/details/156951985</link><guid>https://blog.youkuaiyun.com/Fatherxom/article/details/156951985</guid><author>Fatherxom</author><pubDate>Wed, 14 Jan 2026 20:01:21 +0800</pubDate><description><![CDATA[结构是⼀些值的集合，这些值称为成员变量。结构的每个成员可以是不同类型的变量。结构体就像我们定义一个变量使用int，char，一样的作用。]]></description><category></category></item><item><title><![CDATA[数据在内存中的存储]]></title><link>https://blog.youkuaiyun.com/Fatherxom/article/details/156909746</link><guid>https://blog.youkuaiyun.com/Fatherxom/article/details/156909746</guid><author>Fatherxom</author><pubDate>Tue, 13 Jan 2026 18:03:55 +0800</pubDate><description><![CDATA[其实超过⼀个字节的数据在内存中存储的时候，就有存储顺序的问题，按照不同的存储顺序，我们分 为⼤端字节序存储和⼩端字节序存储，下⾯是具体的概念：⼤端（存储）模式： 是 指数据的低位字节内容保存在内存的⾼地址处，⽽数据的⾼位字节内容，保存在内存的低地址处。⼩端（存储）模式： 是 指数据的低位字节内容保存在内存的低地址处，⽽数据的⾼位字节内容，保存在内存的⾼地址处。上述概念需要记住，⽅便分辨⼤⼩端。]]></description><category></category></item><item><title><![CDATA[C语言内存函数]]></title><link>https://blog.youkuaiyun.com/Fatherxom/article/details/156243342</link><guid>https://blog.youkuaiyun.com/Fatherxom/article/details/156243342</guid><author>Fatherxom</author><pubDate>Wed, 24 Dec 2025 23:06:20 +0800</pubDate><description><![CDATA[• 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。• 如果source和destination有任何的重叠，复制的结果都是未定义的。• 这个函数在遇到 '\0' 的时候并不会停下来。]]></description><category></category></item><item><title><![CDATA[字符函数和字符串函数]]></title><link>https://blog.youkuaiyun.com/Fatherxom/article/details/156206639</link><guid>https://blog.youkuaiyun.com/Fatherxom/article/details/156206639</guid><author>Fatherxom</author><pubDate>Tue, 23 Dec 2025 23:26:59 +0800</pubDate><description><![CDATA[C语⾔中有⼀系列的函数是专⻔做字符分类的，也就是⼀个字符是属于什么类型的字符的。这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h这些函数的使⽤⽅法⾮常类似，我们就讲解⼀个函数的事情，其他的⾮常类似：islower 是能够判断参数部分的 c 是否是⼩写字⺟的。通过返回值来说明是否是⼩写字⺟，如果是⼩写字⺟就返回⾮0的整数，如果不是⼩写字⺟，则返回 0。据此我们做个练习。]]></description><category></category></item><item><title><![CDATA[深入理解指针2]]></title><link>https://blog.youkuaiyun.com/Fatherxom/article/details/155863968</link><guid>https://blog.youkuaiyun.com/Fatherxom/article/details/155863968</guid><author>Fatherxom</author><pubDate>Fri, 12 Dec 2025 23:14:21 +0800</pubDate><description><![CDATA[之前我们学习了指针数组，指针数组是⼀种数组，数组中存放的是地址（指针）。数组指针变量是指针变量？还是数组？答案是：指针变量。我们已经熟悉：• 整形指针变量： int * pint;存放的是整形变量的地址，能够指向整形数据的指针。• 浮点型指针变量： float * pf;存放浮点型变量的地址，能够指向浮点型数据的指针。那数组指针变量应该是：存放的应该是数组的地址，能够指向数组的指针变量。]]></description><category></category></item><item><title><![CDATA[深入理解指针1]]></title><link>https://blog.youkuaiyun.com/Fatherxom/article/details/155134112</link><guid>https://blog.youkuaiyun.com/Fatherxom/article/details/155134112</guid><author>Fatherxom</author><pubDate>Sat, 22 Nov 2025 22:00:37 +0800</pubDate><description><![CDATA[如果你想要去一个学校找你的朋友，他会告诉你他在哪个宿舍，告诉你宿舍的门牌号，这样，你就可以快速找到你的朋友。计算机中同样如此，一个内存单元就是一字节，一字节有8个比特位，就像是一个宿舍里住八个人。那这个宿舍的门牌号，我们就叫做，也称为。]]></description><category></category></item><item><title><![CDATA[操作符详解]]></title><link>https://blog.youkuaiyun.com/Fatherxom/article/details/154917098</link><guid>https://blog.youkuaiyun.com/Fatherxom/article/details/154917098</guid><author>Fatherxom</author><pubDate>Sun, 16 Nov 2025 20:46:36 +0800</pubDate><description><![CDATA[2. 算术右移：左边⽤原该值的符号位填充，右边丢弃。二：其余由于我在写代码的时候都加上了注释就不多做文字解释了，看图。右移：1. 逻辑右移：左边⽤0填充，右边丢弃。一：左移操作符与右移操作符。左移：左边抛弃、右边补0。]]></description><category></category></item><item><title><![CDATA[函数的递归]]></title><link>https://blog.youkuaiyun.com/Fatherxom/article/details/154779686</link><guid>https://blog.youkuaiyun.com/Fatherxom/article/details/154779686</guid><author>Fatherxom</author><pubDate>Thu, 13 Nov 2025 11:30:54 +0800</pubDate><description><![CDATA[接下来的内容文字描述太过繁琐，我主要通过图片向大家展示，大家只需要慢慢来理解，一条一条捋顺，也可以大事化小这个思想，主要记住一个思想----代入下一个值后再拆分。通过上述两个例子，我们不难发现递归的好处，但是要记住，递归是非常占内存的，大量的数据处理会导致栈溢出，比如第一个代码就不建议使用递归，接下来我们用一个例子来展示。函数的递归，其实是一种思想，简单说就是函数调用自己，递就是递推，归就是回归，而递归，就是把一个大的问题细化为多个小问题，即大事化小。• 每次递归调⽤之后越来越接近这个限制条件。]]></description><category></category></item><item><title><![CDATA[ static 和extern的意义与使用]]></title><link>https://blog.youkuaiyun.com/Fatherxom/article/details/154777060</link><guid>https://blog.youkuaiyun.com/Fatherxom/article/details/154777060</guid><author>Fatherxom</author><pubDate>Thu, 13 Nov 2025 10:59:08 +0800</pubDate><description><![CDATA[其实 static 修饰函数和 static 修饰全局变量是⼀模⼀样的，⼀个函数在整个⼯程都可以使⽤， 被static修饰后，只能在本⽂件内部使⽤，其他⽂件⽆法正常的链接使⽤了。但是全局变量被 static 修饰之后，外部链接属性就变成了内部链接属性，只能在⾃⼰所在的源 ⽂件内部使⽤了，其他源⽂件，即使声明了，也是⽆法正常使⽤的。如下图，图一中每次i进入test函数，都会重新创建变量i=0，然后i++打印出来，i的生命周期就在test函数中，所以每次打印都为1.对于全局变量来说：它的生命周期就是整个程序。]]></description><category></category></item><item><title><![CDATA[函数与数组结合--扫雷游戏]]></title><link>https://blog.youkuaiyun.com/Fatherxom/article/details/154503238</link><guid>https://blog.youkuaiyun.com/Fatherxom/article/details/154503238</guid><author>Fatherxom</author><pubDate>Thu, 06 Nov 2025 23:36:09 +0800</pubDate><description><![CDATA[由于9*9的二维数组设计会导致边界难以正确算出检测点附近雷的数量，故用11*11帮助，相较于9*9多余部分不计。test.c----游戏的测试。game.c函数的实现。saolei.h声明。]]></description><category></category></item></channel></rss>