- 博客(139)
- 问答 (1)
- 收藏
- 关注
原创 PN学堂GD32教程第21篇——Wifi物联网技术
本文介绍了基于GD32F30x开发板使用ESP8266 WiFi模组的AT指令驱动开发,采用空闲中断+DMA模式实现串口透传,确保数据高效接收。通过状态机机制管理模组初始化、Wi-Fi连接及MQTT通信流程,避免阻塞,提升系统稳定性。关键步骤包括GPIO与串口配置、DMA数据搬运、中断处理及非阻塞式AT命令执行,最终实现自动重连与故障恢复。
2026-10-30 22:19:14
183
原创 PN学堂GD32教程第17篇——EXMC与SRAM
本文系统阐述了SRAM与DRAM的工作原理及应用差异,重点介绍GD32F303ZET6单片机通过EXMC外设实现外部SRAM(IS62WV51216BLL)的映射与控制。SRAM具备高速、低功耗优势,适用于缓存;而DRAM容量大但需刷新。基于Bank0 Region3,配置地址总线、数据总线及控制信号,设置16位宽异步读写时序,完成SRAM初始化。通过静态变量定位至外部SRAM空间,并在CMake工程中修改链接脚本实现内存分区,确保代码与数据正确加载至外扩SRAM,验证了数据读写功能,实现了高效外存管理。
2026-10-26 21:37:23
177
原创 PN学堂GD32教程第16篇——Fatfs
本文介绍了FatFs文件系统的移植与应用,涵盖在GD32微控制器上基于NorFlash和SD卡的文件系统部署。通过配置ffconf.h、实现diskio.c驱动接口,完成对NorFlash和SD卡的底层访问。重点讲解了disk_initialize、disk_read/write、disk_ioctl等函数的实现,并结合RTC提供时间戳功能。最终实现温湿度数据带时间记录的存储与读取,支持双卷(NorFlash/SD卡)兼容及SD卡热插拔检测,提升系统实用性与可靠性。
2026-10-21 18:41:39
185
原创 PN学堂GD32课程第15篇——HardFault异常
Cortex-M 内核里这堆 0xE000E_xxx 的地址都是系统控制块(SCB)的寄存器,不属于任何片上外设,是 ARM 内核自带的,这里需要手动打开方便定位除0的问题。注意,ARM单片机一般使用16 bit的thumb指令集减小镜像文件大小,因此每条代码指令1都占用2个bytes的大小,所以PC指针逐步调试时的步长一定是2。
2026-10-20 18:39:38
131
原创 PN学堂GD32教程第14篇——Arm单片机启动流程
ARM单片机上电后,复位向量从0x00000000读取,通过BOOT0/BOOT1引脚选择映射MainFlash、SystemMemory或SRAM启动。进入Reset_Handler后,执行SystemInit初始化时钟,调用闭源的_main函数,最终跳转至用户main函数。栈指针SP动态管理函数调用栈,实现栈空间复用。通过Ymodem协议经RS485串口实现OTA升级,BootLoader接收并校验数据包,擦除并写入Flash,最后跳转至App运行。关键点包括地址映射、中断关闭与恢复、栈管理。
2026-10-15 22:04:21
313
原创 PN学堂GD32教程第12/13篇——SPI与Nor Flash
本文系统介绍了GD25Q128 NorFlash的工作原理与驱动实现。基于SPI接口,详细解析了其存储结构(块/扇区/页)、地址映射及读写擦除机制,强调“先擦后写”原则及最小擦除单元为4KB。通过软件模拟与硬件SPI两种方式实现驱动,涵盖芯片识别、状态查询、页编程、扇区擦除等核心操作,并给出完整测试用例。最后对比内部Flash特性,说明其在参数保存场景下的应用,突出其高可靠性与易用性。
2026-10-10 17:34:31
233
原创 PN学堂GD32教程第11篇——I2C与EEPROM
本文基于GD32平台,通过软件模拟与硬件I2C两种方式驱动AT24C02 EEPROM,实现读写多字节数据。重点讲解了I2C起始/停止、应答机制及数据收发时序,并结合实际应用,设计了断电保存用户参数的系统方案,采用双Bank冗余存储与CRC校验确保数据可靠性,最终实现按键修改Modbus从站地址并持久化存储的功能。
2026-10-01 10:00:28
69
原创 如何移植SEGGER_RTT进行JLINK打印
本文介绍了在嵌入式开发中使用J-Link配合SEGGER RTT实现串口日志打印的完整流程:首先安装J-Link驱动并配置环境变量;解压Samples中的RTT源码,将核心文件(SEGGER_RTT.c、SEGGER_RTT_printf.c)及头文件引入工程;通过封装app_log.h实现分级日志输出(错误、警告、信息、调试),支持颜色标记与文件行号显示;最后通过SWD接口实时查看日志,提升调试效率。
2026-09-24 16:08:50
164
原创 汇顶模拟前端GH3220使用备忘录
SDK比较冗杂,如果不能获取原厂支持的话,建议还是使用KEIL开发驱动,.lib进行链接相对更友好一些。优先讲解一下驱动管脚的修改位置:①在里面找到这个初始化函数入口int Gh3x2xDemoInit(void):②往下翻找到这个hal层SPI注册函数;③在gh_demo_user.c里面gh_spi_params这个结构体;④跳转再跳转;⑤找到这个配置IO的头文件。
2026-09-09 09:32:22
235
原创 VSCODE中的keil插件使用
本文针对国产MCU开发中GCC兼容性问题(如蓝牙合封芯片静态库版本冲突)导致开发者被迫回归Keil的情况,提出基于VSCode的小团队协作方案。核心方案是安装KeiluVisionAssistant插件(需配置Keil路径)和微软C语言插件,通过直接导入Keil工程实现开发。特别提醒:使用Git协作时需保持团队成员工程路径完全一致,以确保兼容性。该方案在保留Keil工具链优势的同时,提供了更现代的协作开发环境。
2026-07-31 11:17:23
290
原创 RTC授时时间戳转换工具
开发了一个用于蓝牙MCU时间戳调试的C语言工具,将本地时间转换为小端格式的UNIX时间戳HEX值。该工具包含闰年判断、月份天数计算等功能,最终输出6字节的HEX数组(4字节时间戳+2字节时区偏移),适用于需要小端HEX时间戳的蓝牙服务端调试场景。可直接编译为exe使用,解决了常规UNIX时间戳工具在此类调试中的不适用问题。
2026-06-15 14:26:18
117
原创 Vscode开发/调试ARM单片机最新教程
本文介绍了基于Arm GNU工具链的GR5525单片机开发环境配置方法。主要内容包括:1)下载Arm GNU工具链并配置环境变量;2)检查CMake、Ninja、Clangd等构建工具的版本;3)VSCode插件安装与路径配置;4)提供调试配置文件模板和JLink GDB服务器启动命令。文章强调环境配置要点,特别指出需要修改Clangd和Cortex-Debug插件的绝对路径,并给出了完整的调试配置示例,帮助开发者快速搭建GR5525开发环境。
2026-05-21 17:29:19
537
原创 GCC+Clangd+CMake+Ninja环境搭建最新教程
最近在一台全新电脑上搭建VScode的跨平台C语言开发环境遇到了一些问题,因此正本溯源重新写一篇笔记记录全部搭建过程。对了这篇笔记主要针对Windows平台,Linux和尊贵的Mac用户直接用命令行就能下,还不用配置环境变量。 首先测试阶段,我们需要编译能在X86_64上运行的exe,该方案依赖Windows Kits,可以通过下载Visual Studio2026来获取。勾选下面这个使用C++的桌面开发就可以了。嵌入式开发同行推荐把这个也选上:安装完成之后重启电脑,可以看到Windows Kit
2026-05-08 11:52:27
300
原创 PN学堂GD32教程第9篇——ADC
本文介绍了GD32F303微控制器的ADC系统工作原理及实现方法。主要内容包括:1. ADC硬件结构分析,支持12/10/8/6位分辨率,16路外部输入通道,支持规则组和注入组转换模式;2. 单通道ADC实现,通过PC2采集可调电阻电压,解决代码配置和printf浮点支持问题;3. 多通道ADC配合DMA实现数据采集;4. 硬件/软件滤波方法,包括过采样单元和快速排序均值滤波;5. 二分查找算法在ADC数据处理中的应用;6. 热敏/湿敏电阻测量实现,包括电路分析、温度补偿算法和任务框架搭建。文中提供了详细的
2026-04-10 18:50:12
170
原创 MCU开发常见软件BUG总结(持续更新)
摘要:本文总结了嵌入式开发中的常见错误及解决方案。数据类型选择不当会导致数值溢出,如uint8_t存储年份仅能到255年;函数命名不规范可能引发中断失效;不同编译器差异需注意标准兼容性。指针使用不当易造成非法内存访问,特别是裸机调度架构中的函数指针需谨慎处理。堆空间管理建议避免动态分配,若必须使用malloc需初始化并检查内存。通过正确和错误的代码示例对比,展示了内存操作的最佳实践,强调开发中需严格遵循规范以避免系统崩溃或不可预测行为。
2026-04-09 17:38:32
333
原创 PN学堂GD32教程第8篇——RTC
本文介绍了RTC硬件结构及时间转换实现方法,重点分析了GD32F303系列RTC外设的特点和Unix时间戳转换函数。详细讲解了指针函数中内存分配注意事项,通过对比malloc和gmtime函数的内存分配方式说明差异。文章还阐述了RTC和BKP硬件结构、初始化配置流程,以及独立看门狗定时器的工作原理和配置步骤。最后指出了开发过程中遇到的类型定义错误问题,强调调试注意事项。
2026-04-07 13:18:49
140
原创 PN学堂GD32教程第7篇——TIM
本文介绍了GD32单片机定时器的应用开发,主要包括:1.定时器基础功能(定时计数、PWM输出、输入捕获)及14个定时器资源;2.使用PWM实现呼吸灯,涉及GPIO配置和CHxCV寄存器;3.输入捕获测量PWM周期/脉宽的方法和配置流程;4.NEC红外遥控协议解析(38kHz载波、32bit数据帧)及驱动代码实现,包含引导码判断、数据位解析和反码校验;5.PWM输入模式测量原理,通过主从通道配合(CH0捕获周期、CH1捕获脉宽)实现硬件级精确测量。文中提供了关键代码片段和配置要点,并提示需注意API正确使用。
2026-03-30 17:28:40
93
原创 PN学堂GD32教程第6篇——裸机程序调度
本文介绍了裸机程序任务调度的几种方案,包括轮询调度和时间片调度,并提供了流程示意框图。重点讲解了优化时间片调度框架的实现方法,强调在main函数中避免直接调用GD官方API,推荐使用函数指针进行跨层调用。实验需要调用四个初始化函数,代码位于Unit5串口单元仓库的TaskScheduling分支。为节省仓库资源,复用Unit5的分支进行操作。
2026-03-27 18:55:29
59
原创 PN学堂GD32教程第5篇——UART
本文介绍了串口通信的基础知识及在GD32F303单片机上的实现方法。主要内容包括:1.串口通信分类及数据帧结构,区分同步/异步通信;2.硬件结构及关键寄存器配置;3.printf函数重定向实现串口打印;4.四种串口交互场景及中断接收实现;5.函数指针实现驱动与业务解耦;6.环形队列解决数据接收过快问题,提供完整队列实现代码;7.空闲中断与DMA结合的高效接收方案。文章通过实际代码示例详细说明了各功能模块的实现方法,并分享了调试过程中遇到的典型错误及解决方案。
2026-03-16 11:14:05
86
原创 PN学堂GD32教程第4篇——Systick
本文介绍了基于SysTick中断和状态机实现按键扫描的方法。首先通过SysTick定时器获取系统运行时间,重点讲解了24位递减计数器和重装载寄存器的工作原理。然后详细阐述了基于状态机和定时器的按键扫描实现方案,包括API接口定义和状态机设计。特别强调了中断向量表中句柄名称必须完全一致的重要性。最后通过实例分析了volatile关键字的作用,说明在中断服务函数中修改全局变量时必须使用volatile修饰,以确保变量值的实时更新。文中提供了完整的代码仓库地址供参考。
2026-03-12 18:30:33
72
原创 嵌入式C语言八股
本文讨论了C语言中的两个重要问题:内存安全和字节序判断。首先分析了一个存在内存分配错误的程序,指出其因值传递导致的内存泄漏问题,并给出了使用二级指针的正确修改方案。其次介绍了一种简单高效的字节序判断方法,通过将整型指针强制转换为字符指针来读取最低地址字节,根据该字节值判断处理器是小端序还是大端序。这两个示例展示了C语言中指针操作的关键技巧和常见问题的解决方案。
2026-03-10 10:45:33
75
原创 Linux应用层开发笔记第1篇
本文介绍了Linux应用层编程基础,重点分析了POSIX标准的跨平台兼容性作用,包含系统调用、Shell工具和程序接口等规范。针对文件IO操作,文章探讨了fprintf/fgetc配合使用的注意事项,并通过单片机开发实例对比,揭示了printf函数的层次化实现机制:上层格式化处理调用底层fputc进行字符输出,重写这些底层函数可改变输入输出渠道。
2026-03-05 17:19:25
142
原创 PN学堂GD32教程第3篇——EXTI
本文介绍了GD32单片机EXTI中断系统的关键知识点:1. 中断硬件结构分为NVIC控制器和EXTI模块,GPIO通过EXTI连接到NVIC;2. EXTI支持三种触发方式,同一时刻仅一个GPIO可连接EXTI线;3. 详细讲解了中断优先级的两种类型(抢占优先级和响应优先级)及其作用机制;4. 通过按键控制LED的实例代码,演示了中断服务函数的编写规范,包括标志位清除的必要性;5. 实验验证了不同抢占优先级的中断响应特性,高优先级中断可打断低优先级中断执行。文章包含完整的中断初始化配置流程和典型错误处理方式
2026-03-03 19:22:46
81
原创 Rust学习笔记第4篇
所有权是Rust最独特的特性,它让Rust无需GC(Garbage Collector)就可以保证内存安全。栈内存 vs 堆内存。
2026-03-03 17:15:09
87
原创 Rust学习笔记第3篇
本文介绍了Rust编程语言的基本概念:1)变量默认不可变,需用mut声明可变变量;2)数据类型包括标量类型(整数、浮点、布尔、字符)和复合类型(元组、数组);3)函数定义与调用方式;4)控制流结构(if/else条件判断和三种循环方式)。重点讲解了变量遮蔽(Shadowing)、元组结构、数组访问及类型安全机制,同时强调了Rust基于表达式的特性。这些核心概念构成了Rust编程的基础知识体系。
2026-02-28 17:32:00
150
原创 Rust学习笔记第2篇
本文介绍了使用Rust实现猜数游戏的过程。首先通过标准库的io模块获取用户输入,注意Rust变量默认不可变,需使用mut关键字声明可变变量。接着使用rand库生成1-100的随机数作为神秘数字。最后通过比较用户输入与神秘数字,利用Ordering枚举类型判断结果并输出提示信息。代码展示了Rust的字符串处理、随机数生成、模式匹配等特性,以及shadow机制的类型转换功能。整个游戏实现体现了Rust的所有权、引用和类型安全等核心概念。
2026-02-25 19:25:21
117
原创 Rust学习笔记第1篇
摘要:Rust编程入门指南介绍了如何编写第一个HelloWorld程序(文件后缀.rs,使用println!宏),通过rustc编译运行。重点讲解了Cargo工具的使用:作为Rust的构建系统和包管理器(类似CMake+Ninja),提供项目创建(cargo new)、构建(cargo build)、运行(cargo run)等功能。特别说明Cargo.toml是核心配置文件,cargo check可快速语法检查,release构建(cargo build --release)会优化代码但耗时更长。建议开发
2026-02-25 16:53:46
338
原创 Linux从入门到进阶 第四章
本文介绍了Linux系统的实用操作技巧。主要内容包括:常用快捷键(如Ctrl+C强制停止、Ctrl+D退出);命令历史管理(history命令);软件安装方式(yum/apt命令,不同系统的安装包格式);系统服务控制(systemctl命令);软链接创建(ln命令);日期时间管理(date命令及时区设置);IP地址与主机名配置。文章还对比了Windows、iOS和Android系统的软件安装包格式差异。
2026-02-13 20:29:19
130
原创 Linux从入门到进阶 第三章
本文介绍了Linux系统中用户权限管理的基础知识。主要内容包括:root用户与普通用户的权限区别,sudo命令的配置使用;用户和用户组的概念及管理命令(如useradd、usermod等);通过ls -l查看文件权限信息,理解rwx权限表示;chmod和chown命令的基本用法,用于修改文件权限和所有者。文章还提供了查看系统用户/用户组、创建用户等实际操作示例,为后续深入学习Linux权限控制打下基础。
2026-02-09 17:08:26
86
原创 Linux应用编程介绍
摘要:本文介绍了在VSCode上搭建Linux C应用开发环境的工具链配置,包括远程和本地插件设置。重点讲解了Linux用户态与内核态的区别:用户态程序通过系统调用访问内核服务,具有隔离机制保障系统稳定性。文章还对比了应用程序、驱动程序和单片机程序在编译和编写方法上的差异,并提供了调试优化的gcc编译命令示例。
2026-02-06 20:27:10
80
原创 Python从入门到精通 第一章
没有IDE的情况下可以直接用终端工具编程,命令是python,退出用exit()。不过这种方式只能一行一行运行,按一下回车运行一次。
2026-02-05 16:58:31
99
原创 Linux从入门到进阶 第二章
本文介绍了Linux系统的基本目录结构和常用命令操作。首先对比了Linux与Windows路径表示方式的差异,重点讲解了根目录、家目录等概念。随后详细说明了ls命令及其常用选项(-a、-l、-h)的使用方法,以及cd、pwd等目录操作命令。文章还介绍了相对路径与绝对路径的区别,mkdir创建目录、touch创建文件等基本操作命令,以及文件查看命令cat和more。最后讲解了文件操作命令cp、mv、rm,以及查找命令which和find的使用方法。全文以实际操作示例为主,帮助读者快速掌握Linux基础命令的使
2026-01-27 19:50:26
259
原创 Linux从入门到进阶第一章
本文简要介绍了操作系统的基础知识,重点讲解了Linux内核概念和发行版,以及虚拟机的应用。详细说明了在Windows 11系统中开启WSL(Windows Subsystem for Linux)的具体步骤:通过设置搜索可选功能,进入Windows功能选项,勾选虚拟机平台后重启系统。内容涵盖操作系统原理和实用技术操作,为后续学习打下基础。
2026-01-27 17:35:26
279
原创 基于VScode搭建GD32开发环境
本文介绍了搭建国产GD32F303ZET6开发板的现代化开发环境流程。使用工具链包括CMake、Ninja、LLVM/Clang、J-Link和arm-none-eabi工具链,通过VScode进行开发调试。重点解决了从Keil迁移到GCC时的编译兼容性问题,以及链接脚本配置错误问题。文章还详细介绍了VScode的两种配置方式(用户设置和工作区设置),并提供了GD32官方Eclipse工具获取例程的方法。最后分享了实际工程案例,提醒注意路径敏感性和GDB版本兼容性问题。
2026-01-17 21:41:31
1875
原创 常见终端工具输出中文乱码的解决方案
本文介绍了解决PowerShell和GitBash终端乱码问题的方法。对于PowerShell,可通过修改配置文件将输出编码设为UTF-8;对于GitBash,建议使用PowerShell运行Windows程序。文章还提供了在VSCode中观察程序运行效果的替代方案:直接在exe目录打开Windows终端运行程序,调试时使用VSCode内置的PowerShell窗口查看输出。
2026-01-17 14:06:24
538
原创 基于VScode的C/C++环境搭建
本文介绍了在VSCode中搭建C/C++开发环境的方法。相比臃肿的Visual Studio,推荐使用轻量级的VSCode配合MinGW编译器。详细讲解了单文件和多文件的编译调试方法,包括gcc命令使用和CMake项目管理。重点说明了CMakeLists.txt编写、调试配置(launch.json)以及Ninja构建工具的使用技巧。还介绍了基于Clangd的语法检查方案,对比了GDB和LLDB调试器的差异。文章为初学者提供了从简单到复杂的完整开发环境配置指南,适合不同规模项目的需求。
2026-01-15 14:09:33
560
原创 密码学入门基础
哈希是一种将任意长度数据映射为固定长度值的算法,具有不可逆性、高敏感性和确定性等特点。典型应用包括密码存储、文件校验、哈希表实现和区块链技术。哈希表通过键值对机制实现快速数据存取,使用哈希函数计算存储位置。当不同输入产生相同哈希值时会出现冲突,常用解决方法包括链表法和线性探测法。MD5和SHA是常用的哈希算法,可将数据转换为固定长度的摘要值。
2026-01-12 19:32:57
487
基于STM32F411调试AM2320(HAL库)
2023-07-30
帮我看看这道题怎么做
2021-08-24
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅