<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>SkyCity&apos;s Blog</title><description>与你一起发现更大的世界</description><link>https://blog.skycity11.xyz/</link><language>zh</language><item><title>联考 vs 高考：2027 届的决策框架</title><link>https://blog.skycity11.xyz/posts/2026-04-19-hmt-vs-gaokao-framework/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/2026-04-19-hmt-vs-gaokao-framework/</guid><description>在&quot;专攻联考 / 两条腿走路 / 只走高考&quot;之间如何选</description><pubDate>Sun, 19 Apr 2026 02:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;这是「港澳台联考」专题的第一篇导读，目的是把后续所有素材要回答的问题先摆出来。具体数据、院校名单、分数线会以独立文章形式收录在对应分类下，本文只给&lt;strong&gt;思路框架&lt;/strong&gt;，方便在信息逐步补齐的过程中有一个稳定的决策参照。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;一、这个选择到底在选什么&lt;/h2&gt;
&lt;p&gt;港澳台联考（全称&quot;&lt;strong&gt;中华人民共和国普通高等学校联合招收华侨、港澳台地区学生考试&lt;/strong&gt;&quot;）和普通高考是两条&lt;strong&gt;并行&lt;/strong&gt;的升学路径，区别不在于难度高低，而在于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;考试范围与难度分布&lt;/strong&gt;：联考大多数科目比普通高考简单，但语文、史地政等科目的考法和重点与内地不同&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可报考院校池&lt;/strong&gt;：联考有专门的院校名单（三百余所，覆盖多数 985/211），但个别热门专业不招联考生&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;录取分数线机制&lt;/strong&gt;：联考有独立分数线，与高考分数不直接可比&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;考试时间与节奏&lt;/strong&gt;：联考通常在 5 月举行，早于高考约一个月&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以核心问题不是&quot;哪条路更容易&quot;，而是 &lt;strong&gt;考生的身份条件、目标院校/专业、备考状态，更适配哪条赛道&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;二、报考身份是硬门槛（先过这一关）&lt;/h2&gt;
&lt;p&gt;联考&lt;strong&gt;必须&lt;/strong&gt;具备港澳台居民或华侨身份之一才能报名。具体身份认定规则每年由全国联招办发布，细节条款很关键（例如在境外居留时间要求、户籍限制、是否允许&quot;双轨&quot;等）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;待补充&lt;/strong&gt;：2027 届报考资格的具体条款、常见踩坑点。详见 &lt;a href=&quot;/lianKao/&quot;&gt;政策&lt;/a&gt; 分类下的专文。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;如果身份资格都不满足，下面的讨论就不成立，只能走高考。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;三、三种路径及其适用场景&lt;/h2&gt;
&lt;h3&gt;路径 A：专攻联考&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;适合&lt;/strong&gt;：身份明确、目标院校全部在联招名单内、并且不打算冲击那些&quot;不招联考生&quot;的特殊专业。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;优势&lt;/strong&gt;：考纲相对可控，竞争池小，相同分数能进的内地院校档次通常更高。
&lt;strong&gt;风险&lt;/strong&gt;：一旦联考发挥失常，&lt;strong&gt;没有备胎&lt;/strong&gt;——高考这条路基本上来不及补。&lt;/p&gt;
&lt;h3&gt;路径 B：两条腿走路（联考 + 高考都考）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;适合&lt;/strong&gt;：身份条件满足、对目标院校有弹性、心理承受和时间管理能力强的考生。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;优势&lt;/strong&gt;：一次备考期覆盖两次考试机会，风险对冲。
&lt;strong&gt;风险&lt;/strong&gt;：两套考纲的&lt;strong&gt;重叠度并不像想象中高&lt;/strong&gt;——语文、政治、历史科目差异尤其明显。如果没有清晰的时间分配方案，很容易&quot;两边都没练到位&quot;。关键在于评估&lt;strong&gt;边际精力投入的产出&lt;/strong&gt;，而不是&quot;多考一场总归有备无患&quot;。&lt;/p&gt;
&lt;h3&gt;路径 C：只走高考&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;适合&lt;/strong&gt;：身份条件不清晰、或目标院校专业大量在联考之外（例如某些军校、公安类、个别艺术类特殊招生）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;优势&lt;/strong&gt;：赛道单一、信息最透明、备考资源最成熟。
&lt;strong&gt;风险&lt;/strong&gt;：竞争激烈，与几百万考生同池。&lt;/p&gt;
&lt;h2&gt;四、做决策前需要收齐的信息&lt;/h2&gt;
&lt;p&gt;这是本专题后续要逐项填充的清单：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;需要确认&lt;/th&gt;
&lt;th&gt;对应分类&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2027 届报考资格的最新条款&lt;/td&gt;
&lt;td&gt;政策&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当年联考招生院校与专业目录&lt;/td&gt;
&lt;td&gt;院校&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;目标院校近 3 年联考录取分数线、一本线&lt;/td&gt;
&lt;td&gt;分数线&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;考纲差异（与高考逐科对比）&lt;/td&gt;
&lt;td&gt;政策 / 真题&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;两条赛道的题型与难度&lt;/td&gt;
&lt;td&gt;真题&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;走过两种路径的过来人怎么评价&lt;/td&gt;
&lt;td&gt;访谈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;兼顾两场考试时如何排课、分配时间&lt;/td&gt;
&lt;td&gt;备考经验&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;五、2027 届当下（2026 年 4 月）该做什么&lt;/h2&gt;
&lt;p&gt;距离考试还有约 &lt;strong&gt;13 个月&lt;/strong&gt;。这个时间窗口建议划分为：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;2026 Q2（现在 — 6 月）&lt;/strong&gt;：信息收集，确定走哪条路径（路径 A/B/C 之一）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026 Q3（7 — 9 月）&lt;/strong&gt;：按选定路径制订备考计划，开始按考纲系统复习&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026 Q4（10 — 12 月）&lt;/strong&gt;：联考报名窗口；针对性刷题与模拟&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2027 Q1（1 — 4 月）&lt;/strong&gt;：冲刺；若走路径 B，重新评估是否减负为单赛道&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2027 年 5 — 6 月&lt;/strong&gt;：应考&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;路径决策应尽量在 &lt;strong&gt;2026 年 9 月前&lt;/strong&gt; 完成——此后再变轨代价会快速上升。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;六、本专题的打开方式&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;在 &lt;a href=&quot;/lianKao/&quot;&gt;港澳台联考专题页&lt;/a&gt; 按&quot;政策 / 院校 / 分数线 / 真题 / 备考经验 / 访谈&quot;六个分类浏览&lt;/li&gt;
&lt;li&gt;所有新素材都会打上 &lt;code&gt;港澳台联考&lt;/code&gt; 主标签 + 子类标签，自动出现在对应卡片中&lt;/li&gt;
&lt;li&gt;本篇会随着信息的补齐持续修订，把&quot;待补充&quot;的地方换成有据可查的结论&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;本文是思路框架，不作为权威政策解读。任何具体数据以教育部、全国联招办当年发布的官方文件为准。欢迎通过博客联系方式提供素材或指出错漏。&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>港澳台联考</category><category>备考经验</category></item><item><title>微信小程序开发前期准备清单</title><link>https://blog.skycity11.xyz/posts/2026-04-05-wechat-miniprogram-prep/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/2026-04-05-wechat-miniprogram-prep/</guid><description>从账号注册到云服务开通，个人开发者避坑指南</description><pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;整理自视频：&lt;a href=&quot;https://b23.tv/zLyWLqp&quot;&gt;【AI编程】我用Claude开发了一个偏头痛小程序，从零到上线全流程保姆级教程！&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;一、账号注册&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;准备一个邮箱&lt;/strong&gt;（每个邮箱只能注册一个小程序，注册前确认该邮箱未被使用过）&lt;/li&gt;
&lt;li&gt;前往 &lt;a href=&quot;https://mp.weixin.qq.com&quot;&gt;微信公众平台&lt;/a&gt; → 立即注册 → 选择「小程序」&lt;/li&gt;
&lt;li&gt;用邮箱注册账号，验证后设置密码&lt;/li&gt;
&lt;li&gt;填写主体信息：
&lt;ul&gt;
&lt;li&gt;国家：大陆&lt;/li&gt;
&lt;li&gt;主体类型：个人（需要身份证、姓名）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;注册成功后会显示提交成功提示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.skycity11.xyz/img/in-post/post-wechat-miniprogram-prep/07_%E6%B3%A8%E5%86%8C%E4%BF%A1%E6%81%AF%E6%8F%90%E4%BA%A4%E6%88%90%E5%8A%9F_5min.png&quot; alt=&quot;注册信息提交成功&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;二、小程序基本信息填写&lt;/h2&gt;
&lt;p&gt;注册成功后，进入小程序管理后台填写：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;名称&lt;/strong&gt;：小程序名称（备案时建议名称笼统一些，避免过于具体）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;简称&lt;/strong&gt;：较短的名称&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;头像&lt;/strong&gt;：准备好小程序头像图片&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;介绍&lt;/strong&gt;：小程序功能描述&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;类目&lt;/strong&gt;：根据实际功能选择（如「工具」→「记录类」），类目选择直接影响审核通过率&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;填写小程序基本信息页面如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.skycity11.xyz/img/in-post/post-wechat-miniprogram-prep/03_%E5%A1%AB%E5%86%99%E5%B0%8F%E7%A8%8B%E5%BA%8F%E4%BF%A1%E6%81%AF_6min.png&quot; alt=&quot;填写小程序信息&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择服务类目时会弹出类目选择框：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.skycity11.xyz/img/in-post/post-wechat-miniprogram-prep/08_%E6%B7%BB%E5%8A%A0%E7%B1%BB%E7%9B%AE_7min.png&quot; alt=&quot;添加类目&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;三、合规性准备（个人开发者必看）&lt;/h2&gt;
&lt;p&gt;个人开发者资质有限，上线前需提前规避以下风险：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;注意事项&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;类目选择&lt;/td&gt;
&lt;td&gt;选「工具/记录」类，避免选医疗、金融等需资质认证的类目&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;避免专业词汇&lt;/td&gt;
&lt;td&gt;不出现「诊断、治疗、医疗建议」等词汇，否则审核大概率不通过&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;明确工具属性&lt;/td&gt;
&lt;td&gt;描述时强调是「记录工具」，不是医疗产品&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;个人信息保护&lt;/td&gt;
&lt;td&gt;遵守个人信息保护法，用户数据不得滥用&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;视频中对合规性注意事项的说明（含头像规格要求）：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.skycity11.xyz/img/in-post/post-wechat-miniprogram-prep/02_%E5%9F%BA%E6%9C%AC%E4%BF%A1%E6%81%AF%E4%B8%8E%E5%90%88%E8%A7%84_3min.png&quot; alt=&quot;合规性注意事项&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;四、小程序备案&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ 这是上线最关键的前提条件，个人开发者容易忽略&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;和域名备案一样，小程序、App、网站上线前都需要备案&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;没有备案就无法提交审核，也无法发布上线&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;备案流程：在微信公众平台 → 设置 → 基本设置 → 小程序备案&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;建议在开始开发之前就启动备案流程，因为备案审核本身需要时间。&lt;/p&gt;
&lt;p&gt;微信公众平台小程序发布流程中，备案是必须完成的步骤之一：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.skycity11.xyz/img/in-post/post-wechat-miniprogram-prep/04_%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%8F%91%E5%B8%83%E6%B5%81%E7%A8%8B_%E5%A4%87%E6%A1%88_7.5min.png&quot; alt=&quot;小程序发布流程与备案&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;五、开发工具准备&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;工具&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;th&gt;获取方式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;微信开发者工具&lt;/td&gt;
&lt;td&gt;小程序本地开发、调试、上传&lt;/td&gt;
&lt;td&gt;微信官方下载&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;APPID&lt;/td&gt;
&lt;td&gt;开发时绑定小程序身份&lt;/td&gt;
&lt;td&gt;微信公众平台 → 开发管理 → 开发设置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;云环境 ID&lt;/td&gt;
&lt;td&gt;使用微信云开发时需要&lt;/td&gt;
&lt;td&gt;微信公众平台 → 云服务 → 云开发&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;在微信开发者工具中创建项目时需要填入 APPID，并选择后端服务类型：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.skycity11.xyz/img/in-post/post-wechat-miniprogram-prep/09_%E5%BE%AE%E4%BF%A1%E5%BC%80%E5%8F%91%E8%80%85%E5%B7%A5%E5%85%B7_APPID_9.55min.png&quot; alt=&quot;微信开发者工具创建项目&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;六、云服务开通（如使用微信云开发）&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;进入微信公众平台 → 开发与服务 → 云服务 → 云开发&lt;/li&gt;
&lt;li&gt;点击开通，用微信扫码授权&lt;/li&gt;
&lt;li&gt;创建云环境，&lt;strong&gt;记录云环境 ID&lt;/strong&gt;（开发和部署时都会用到）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;微信公众平台云开发开通页面：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.skycity11.xyz/img/in-post/post-wechat-miniprogram-prep/06_%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%BC%80%E9%80%9A_8min.png&quot; alt=&quot;云服务开通&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;七、开发前资料准备&lt;/h2&gt;
&lt;p&gt;在正式写代码前，建议提前准备好：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;需求文档&lt;/strong&gt;：明确功能模块、页面结构、数据字段（Claude Code 会直接读取这份文档生成代码）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设计规范&lt;/strong&gt;：如有 UI 要求，提前确定风格（如果没有，可以让 AI 自由发挥后再迭代）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;图标/图片资源&lt;/strong&gt;：优先使用开源图标（如 iconfont），避免引用不存在的本地资源导致报错&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;准备好资料后，在 Claude Code 中使用 &lt;code&gt;/init&lt;/code&gt; 命令初始化项目，生成 CLAUDE.md 和技术文档：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.skycity11.xyz/img/in-post/post-wechat-miniprogram-prep/05_%E4%BA%91%E5%BC%80%E5%8F%91%E9%85%8D%E7%BD%AE%E4%B8%8E%E9%A1%B9%E7%9B%AE%E5%88%9D%E5%A7%8B%E5%8C%96_9min.png&quot; alt=&quot;Claude Code项目初始化&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;总结：上线前检查清单&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;□ 邮箱注册账号完成
□ 主体信息（身份证）登记完成
□ 小程序名称/头像/介绍填写完成
□ 类目选择合规
□ 小程序备案已提交（或进行中）
□ APPID 已记录
□ 云环境已开通，云环境 ID 已记录
□ 微信开发者工具已安装
□ 需求文档已准备
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>technique</category><category>AI</category><category>微信小程序</category><category>Claude Code</category><category>教程</category></item><item><title>Vibe Coding 时代：当编程变成了\&quot;说话\&quot;</title><link>https://blog.skycity11.xyz/posts/2026-04-04-vibe-coding-era/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/2026-04-04-vibe-coding-era/</guid><pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;2023 年以前，&quot;会不会写代码&quot;是程序员的核心竞争力。2026 年，这个问题正在慢慢变成：&quot;你会不会跟 AI 说清楚你想要什么？&quot;&lt;/p&gt;
&lt;p&gt;这就是 Vibe Coding 时代。&lt;/p&gt;
&lt;h2&gt;什么是 Vibe Coding？&lt;/h2&gt;
&lt;p&gt;Vibe Coding 这个词最早由 Andrej Karpathy 在 2025 年初提出。他的原话大意是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;我现在写代码几乎不看代码本身了。我只是描述我想要什么，然后接受 AI 给我的结果。&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;听起来有点玄乎，但其实非常写实。你打开 Cursor 或者 Claude Code，用自然语言描述需求，AI 帮你写代码，你读都不读直接跑，出错了就把报错扔回给 AI，让它自己修——如此循环。&lt;/p&gt;
&lt;p&gt;整个过程中，你最核心的工作是&lt;strong&gt;描述清楚你想要什么&lt;/strong&gt;，而不是手写每一行逻辑。&lt;/p&gt;
&lt;h2&gt;这意味着什么？&lt;/h2&gt;
&lt;h3&gt;1. 门槛降低了，上限没有降低&lt;/h3&gt;
&lt;p&gt;Vibe Coding 让更多人能&quot;写&quot;出能运行的代码，但要做出真正好的产品，还是需要理解系统、架构、性能、安全……这些东西 AI 不会主动替你考虑，你必须有足够的判断力去审查它给你的东西。&lt;/p&gt;
&lt;p&gt;换句话说：&lt;strong&gt;入门变容易了，精通依然很难。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;2. 调试能力比编码能力更重要&lt;/h3&gt;
&lt;p&gt;以前你写代码，出了 bug 你知道大概在哪儿。现在 AI 生成的代码你不一定读得懂，但你依然需要知道如何定位问题。&lt;/p&gt;
&lt;p&gt;&quot;看报错、定位问题、描述给 AI&quot;——这个循环里，&lt;strong&gt;对系统行为的直觉&lt;/strong&gt;是无法被 AI 替代的。&lt;/p&gt;
&lt;h3&gt;3. 语言表达成了新的技术栈&lt;/h3&gt;
&lt;p&gt;能不能把需求说清楚，能不能给 AI 足够的上下文，能不能识别 AI 输出的问题——这些软技能正在变成硬技能。&lt;/p&gt;
&lt;p&gt;一个会写 Prompt 的人，和一个不会的人，产出效率可能差 10 倍。&lt;/p&gt;
&lt;h2&gt;我自己是怎么用的？&lt;/h2&gt;
&lt;p&gt;老实说，我现在写代码的方式已经变了很多。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;探索型任务&lt;/strong&gt;：完全交给 AI，让它先跑出一个能用的版本，我再在上面改。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核心逻辑&lt;/strong&gt;：还是自己写，或者和 AI 一起写，但每一行我都会看一遍。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置/样板代码&lt;/strong&gt;：全交给 AI，这类代码本来就无聊，AI 做得比我好。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我发现一个有趣的事：&lt;strong&gt;AI 越来越擅长的，恰好是我最不喜欢写的部分&lt;/strong&gt;。这让我有更多时间去想那些真正有趣的问题。&lt;/p&gt;
&lt;h2&gt;会不会有人因此失业？&lt;/h2&gt;
&lt;p&gt;这是个老生常谈的话题，但我的看法是：&lt;strong&gt;短期内不会大规模替代，长期内会重新定义岗位&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;就像电子表格没有消灭会计师，但改变了会计师做什么——AI 编程工具不会消灭程序员，但会改变程序员花时间在哪里。&lt;/p&gt;
&lt;p&gt;那些能利用 AI 杠杆的人，会比以前更有生产力。那些拒绝改变的人，会越来越难竞争。&lt;/p&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;Vibe Coding 不是编程的终点，是编程的一次形态变化。&lt;/p&gt;
&lt;p&gt;代码本身从来都不是目的，解决问题才是。如果 AI 能帮我更快地解决问题，那我乐意接受这种变化。&lt;/p&gt;
&lt;p&gt;你现在是怎么用 AI 写代码的？欢迎在评论区聊聊。&lt;/p&gt;
</content:encoded><category>technique</category><category>AI</category><category>Vibe Coding</category><category>编程</category><category>LLM</category></item><item><title>OpenClaw 本地模型电脑配置清单</title><link>https://blog.skycity11.xyz/posts/2026-04-02-openclaw-hardware-guide/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/2026-04-02-openclaw-hardware-guide/</guid><pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;OpenClaw 是一套以 AI Agent 为核心用户的本地运行框架，可以接入本地大语言模型或云端模型。本文整理了在本地跑模型时推荐的硬件配置，供参考。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1 最低配置（能跑，但别指望太快）&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;配置项&lt;/th&gt;
&lt;th&gt;最低要求&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;x86_64 或 ARM64 现代处理器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;内存&lt;/td&gt;
&lt;td&gt;16 GB RAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU&lt;/td&gt;
&lt;td&gt;4 GB VRAM（NVIDIA / AMD）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;存储&lt;/td&gt;
&lt;td&gt;50 GB 可用空间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系统&lt;/td&gt;
&lt;td&gt;macOS / Linux / Windows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;运行时&lt;/td&gt;
&lt;td&gt;Node.js 20+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;如果只跑 gateway 模式（转发到云端），10 GB 存储 + 4 GB RAM 即可，不需要 GPU。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;2 推荐配置（日常使用 3B–7B 模型）&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;配置项&lt;/th&gt;
&lt;th&gt;推荐参数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;8 核以上（CPU 不是瓶颈，够用即可）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;内存&lt;/td&gt;
&lt;td&gt;32 GB RAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU&lt;/td&gt;
&lt;td&gt;8 GB VRAM（如 RTX 3060 / RTX 4060）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;存储&lt;/td&gt;
&lt;td&gt;100 GB SSD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;网络&lt;/td&gt;
&lt;td&gt;稳定连接（模型下载用）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;16 GB RAM&lt;/strong&gt;：可跑 3B 参数量级模型&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;32 GB RAM&lt;/strong&gt;：可跑 7B 参数量级模型，体验流畅&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;3 高性能配置（跑 27B+ 大模型）&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;配置项&lt;/th&gt;
&lt;th&gt;高性能参数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;16 核以上&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;内存&lt;/td&gt;
&lt;td&gt;64 GB+ RAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU&lt;/td&gt;
&lt;td&gt;NVIDIA RTX 4090（24 GB VRAM）或同级&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;存储&lt;/td&gt;
&lt;td&gt;500 GB NVMe SSD&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Apple Silicon 方案&lt;/h3&gt;
&lt;p&gt;苹果 M 系列芯片的统一内存架构（Unified Memory）在本地模型推理上性价比很高，且内存带宽直接决定 token 生成速度：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;芯片&lt;/th&gt;
&lt;th&gt;统一内存上限&lt;/th&gt;
&lt;th&gt;内存带宽&lt;/th&gt;
&lt;th&gt;适合模型规模&lt;/th&gt;
&lt;th&gt;代表机型&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;M4&lt;/td&gt;
&lt;td&gt;32 GB&lt;/td&gt;
&lt;td&gt;120 GB/s&lt;/td&gt;
&lt;td&gt;7B–13B&lt;/td&gt;
&lt;td&gt;MacBook Air, Mac mini&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M4 Pro&lt;/td&gt;
&lt;td&gt;64 GB&lt;/td&gt;
&lt;td&gt;273 GB/s&lt;/td&gt;
&lt;td&gt;13B–32B&lt;/td&gt;
&lt;td&gt;MacBook Pro 14/16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M4 Max&lt;/td&gt;
&lt;td&gt;128 GB&lt;/td&gt;
&lt;td&gt;546 GB/s&lt;/td&gt;
&lt;td&gt;32B–70B&lt;/td&gt;
&lt;td&gt;MacBook Pro 16, Mac Studio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M5&lt;/td&gt;
&lt;td&gt;32 GB&lt;/td&gt;
&lt;td&gt;154 GB/s&lt;/td&gt;
&lt;td&gt;7B–13B&lt;/td&gt;
&lt;td&gt;MacBook Air（2025）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M5 Pro&lt;/td&gt;
&lt;td&gt;64 GB&lt;/td&gt;
&lt;td&gt;307 GB/s&lt;/td&gt;
&lt;td&gt;13B–32B&lt;/td&gt;
&lt;td&gt;MacBook Pro 14/16（2026）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M5 Max&lt;/td&gt;
&lt;td&gt;128 GB&lt;/td&gt;
&lt;td&gt;614 GB/s&lt;/td&gt;
&lt;td&gt;32B–70B&lt;/td&gt;
&lt;td&gt;MacBook Pro 16（2026）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;参考推理速度（Ollama，4-bit 量化）：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;M4 Pro 64GB 跑 DeepSeek R1 32B：约 11–14 tok/s&lt;/li&gt;
&lt;li&gt;M4 Max：约 81 tok/s（通用小模型）&lt;/li&gt;
&lt;li&gt;M5 系列相比 M4 整体快约 20–27%&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：token 生成速度由内存带宽决定，而非 CPU 频率。M5 Max 的 614 GB/s 带宽是目前消费级设备中最高的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;推荐甜蜜点&lt;/strong&gt;：M5 Pro（64 GB）是 2026 年当前性价比最高的本地模型方案，可流畅运行 32B 量级模型。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;4 本地模型运行时&lt;/h2&gt;
&lt;p&gt;OpenClaw 官方推荐搭配 &lt;strong&gt;Ollama&lt;/strong&gt; 作为本地模型的运行后端（2026年3月起成为官方支持的 provider）。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 安装 Ollama
brew install ollama  # macOS

# 拉取模型（以 Qwen 为例）
ollama pull qwen2.5:7b

# 启动 OpenClaw 并指向 Ollama
# 在 OpenClaw 配置中设置 provider 为 ollama
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;推荐模型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Qwen2.5 7B&lt;/strong&gt; — 中文支持好，7B 体量，32 GB 内存可流畅运行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qwen3.5 27B&lt;/strong&gt; — 性能接近 GPT-4o Mini，需 64 GB+ 内存&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Llama 3.1 8B&lt;/strong&gt; — 英文任务推荐&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;5 存储空间估算&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型规模&lt;/th&gt;
&lt;th&gt;大约占用磁盘空间&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;3B&lt;/td&gt;
&lt;td&gt;~2 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7B&lt;/td&gt;
&lt;td&gt;~4–5 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13B&lt;/td&gt;
&lt;td&gt;~8 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;27B&lt;/td&gt;
&lt;td&gt;~16 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;70B&lt;/td&gt;
&lt;td&gt;~40 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;6 总结&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;场景&lt;/th&gt;
&lt;th&gt;推荐方案&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;轻量体验&lt;/td&gt;
&lt;td&gt;16 GB RAM + 任意独显 4 GB VRAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;日常开发&lt;/td&gt;
&lt;td&gt;32 GB RAM + RTX 4060 / Apple M5 Pro 64GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;高强度生产&lt;/td&gt;
&lt;td&gt;64 GB RAM + RTX 4090 / M5 Max 128GB Mac Studio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;低功耗部署&lt;/td&gt;
&lt;td&gt;Jetson Orin Nano&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;数据隐私是本地部署最大的优势——所有推理都在本机完成，不走网络。如果对数据安全有要求，本地跑模型是目前最稳妥的方案。&lt;/p&gt;
</content:encoded><category>technique</category><category>AI</category><category>LLM</category><category>OpenClaw</category><category>本地模型</category><category>硬件</category></item><item><title>STM32学习随手记录</title><link>https://blog.skycity11.xyz/posts/2025-08-16-anguage-stm32-c/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/2025-08-16-anguage-stm32-c/</guid><pubDate>Sat, 16 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;STM32回顾性学习，只记要点&lt;/p&gt;
&lt;h2&gt;1 Keil设置&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Configuration（帮叟）
&lt;ol&gt;
&lt;li&gt;Editor-&amp;gt;Encoding-&amp;gt;Encode in UTF-8 without signature 支持中文&lt;/li&gt;
&lt;li&gt;Editor-&amp;gt;C/C++ Files-&amp;gt;Tab size-&amp;gt;4 更改缩进为4&lt;/li&gt;
&lt;li&gt;Color &amp;amp; Fonts-&amp;gt; C/C++ Editor files-&amp;gt; Text -&amp;gt; Font-&amp;gt;14 调整字体大小&lt;/li&gt;
&lt;li&gt;Text Completion -&amp;gt; Symbols after 3 Characters 选中 自动补全设置（需重启软件）&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Options for Target（魔术棒）
&lt;ol&gt;
&lt;li&gt;C/C++-&amp;gt; Include Paths 声明所有包含头文件的文件夹&lt;/li&gt;
&lt;li&gt;C/C++-&amp;gt; Define内定义USE_STDPERIPH_DRIVER 使用标准外设编译，这是使用库函数的条件编译&lt;/li&gt;
&lt;li&gt;Debug 下拉列表选择对应调试器&lt;/li&gt;
&lt;li&gt;Debug 调试器旁边Settings Flash Download里勾选Reset and Run&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;2 STM32内部电路结构&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/87c0f39c51fa6e2f03d5a623635c74c71777db1dce7b17fa6d61abc73195c688.png&quot; alt=&quot;图 0&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;3 STM32编程&lt;/h2&gt;
&lt;h3&gt;3.1 方式：&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;  1. 直接调用寄存器（需查阅STM32文档）
  2. 库函数
  3. HAL
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.2 库函数&lt;/h3&gt;
&lt;h4&gt;3.2.1 GPIO配置&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;#include &quot;stm32f10x.h&quot;                  // Device header

int main(void)
{
	//使用库函数将位于GPIOC的Pin13对应的LED点亮（0亮1灭）
	//1. 打开clk使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); 	//打开GPIOC的clk使能
	//2. 定义GPIO结构体
	GPIO_InitTypeDef GPIO_InitStrcture;					//定义一个名为GPIO_InitStrcture的结构体，并在下面描述结构体的内容
	GPIO_InitStrcture.GPIO_Mode = GPIO_Mode_Out_PP; 	//通用推挽输出
	GPIO_InitStrcture.GPIO_Pin = GPIO_Pin_13; 			//将控制目标定为Pin13（跳转：点击Class为member的GPIO_Pin）
	GPIO_InitStrcture.GPIO_Speed = GPIO_Speed_50MHz;	//将Pin13速度定位50MHz
	//3. 初始化GPIO
	GPIO_Init(GPIOC, &amp;amp;GPIO_InitStrcture); 				//初始化GPIOC
	//4. GPIO设置为高/低电平
	GPIO_SetBits(GPIOC, GPIO_Pin_13);
//	GPIO_ResetBits(GPIOC, GPIO_Pin_13);
	while (1)
	{
		
	}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3.2.2 寄存器输出模式&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/2c7f31407fb659852c99794bdb36cf6a109a5301a0faf34c0028e22e1b30f4b3.png&quot; alt=&quot;图 1
1&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;推挽
&lt;ol&gt;
&lt;li&gt;P-MOS/N-MOS都导通。高电平：1，低电平：0&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;开漏
&lt;ol&gt;
&lt;li&gt;P-MOS关闭，N-MOS导通。高电平：高阻（浮空），低电平：0&lt;/li&gt;
&lt;li&gt;可外接5V上拉电阻，将高电平输出为5V&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;关闭
&lt;ol&gt;
&lt;li&gt;P-MOS/N-MOS都关闭。电平由外部电路控制45&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;


















—————————————————————————————————————

Ongoing

—————————————————————————————————————

[首页](https://blog.skycity11.xyz)&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>technique</category><category>STM32</category><category>手记</category></item><item><title>SolidWork电脑配置清单</title><link>https://blog.skycity11.xyz/posts/2025-08-14-solidwork-pc/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/2025-08-14-solidwork-pc/</guid><pubDate>Thu, 14 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;SolidWorks 2025 电脑配置推荐（顶配/中配/性价比）&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;价格为AI生成，非市场价，仅供参考&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;组件&lt;/th&gt;
&lt;th&gt;顶配型号（极致性能）&lt;/th&gt;
&lt;th&gt;价格（约）&lt;/th&gt;
&lt;th&gt;中配型号（均衡性能）&lt;/th&gt;
&lt;th&gt;价格（约）&lt;/th&gt;
&lt;th&gt;性价比型号（预算优化）&lt;/th&gt;
&lt;th&gt;价格（约）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CPU&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AMD Ryzen 9 9950X3D（16核32线程，5.7GHz）&lt;/td&gt;
&lt;td&gt;¥5,500&lt;/td&gt;
&lt;td&gt;Intel i9-14900KS（6.0GHz单核）&lt;/td&gt;
&lt;td&gt;¥4,500&lt;/td&gt;
&lt;td&gt;AMD Ryzen 7 7800X3D（8核16线程）&lt;/td&gt;
&lt;td&gt;¥2,800&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;主板&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;技嘉 X870 Aorus ELITE WIFI7 ICE&lt;/td&gt;
&lt;td&gt;¥4,500&lt;/td&gt;
&lt;td&gt;华硕 ROG STRIX Z790-F&lt;/td&gt;
&lt;td&gt;¥3,500&lt;/td&gt;
&lt;td&gt;微星 B650M Gaming Plus WiFi&lt;/td&gt;
&lt;td&gt;¥1,200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;显卡&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;NVIDIA RTX 5090D（32GB GDDR7）&lt;/td&gt;
&lt;td&gt;¥38,000&lt;/td&gt;
&lt;td&gt;NVIDIA RTX 5000 Ada（32GB GDDR6）&lt;/td&gt;
&lt;td&gt;¥35,000&lt;/td&gt;
&lt;td&gt;NVIDIA RTX A4000（16GB GDDR6）&lt;/td&gt;
&lt;td&gt;¥8,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;内存&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;128GB DDR5-7200（芝奇 Trident Z5 RGB）&lt;/td&gt;
&lt;td&gt;¥6,000&lt;/td&gt;
&lt;td&gt;64GB DDR5-6400（金士顿 Fury）&lt;/td&gt;
&lt;td&gt;¥3,000&lt;/td&gt;
&lt;td&gt;32GB DDR5-6000（光威/金百达）&lt;/td&gt;
&lt;td&gt;¥1,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;存储&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2TB PCIe 5.0 NVMe + 16TB HDD&lt;/td&gt;
&lt;td&gt;¥4,300&lt;/td&gt;
&lt;td&gt;1TB PCIe 4.0 NVMe + 8TB HDD&lt;/td&gt;
&lt;td&gt;¥2,500&lt;/td&gt;
&lt;td&gt;1TB PCIe 3.0 NVMe&lt;/td&gt;
&lt;td&gt;¥500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;电源&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;海韵 PRIME TX-1600W 钛金&lt;/td&gt;
&lt;td&gt;¥3,500&lt;/td&gt;
&lt;td&gt;海韵 PRIME TX-1000W 金牌&lt;/td&gt;
&lt;td&gt;¥2,000&lt;/td&gt;
&lt;td&gt;长城/航嘉 750W 非模组&lt;/td&gt;
&lt;td&gt;¥400&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;散热&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;恩杰 Kraken Z73 360mm + 联力积木风扇×6&lt;/td&gt;
&lt;td&gt;¥2,500&lt;/td&gt;
&lt;td&gt;超频三银翼 DT360 ARGB&lt;/td&gt;
&lt;td&gt;¥1,200&lt;/td&gt;
&lt;td&gt;利民六铜管双塔风冷&lt;/td&gt;
&lt;td&gt;¥200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;机箱&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;联力 O11D EVO XL 全塔&lt;/td&gt;
&lt;td&gt;¥1,800&lt;/td&gt;
&lt;td&gt;微星 MPG VELOX 300 Airflow&lt;/td&gt;
&lt;td&gt;¥1,200&lt;/td&gt;
&lt;td&gt;先马/航嘉中塔机箱&lt;/td&gt;
&lt;td&gt;¥300&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;显示器&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;戴尔 UltraSharp U3224KB（6K 32英寸）&lt;/td&gt;
&lt;td&gt;¥12,000&lt;/td&gt;
&lt;td&gt;LG 32UN880（4K 32英寸）&lt;/td&gt;
&lt;td&gt;¥6,000&lt;/td&gt;
&lt;td&gt;AOC Q27P10（2K 27英寸）&lt;/td&gt;
&lt;td&gt;¥1,500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;键鼠&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;罗技 MX Keys S + MX Master 3S&lt;/td&gt;
&lt;td&gt;¥1,500&lt;/td&gt;
&lt;td&gt;罗技 MX Keys + MX Master 3&lt;/td&gt;
&lt;td&gt;¥1,000&lt;/td&gt;
&lt;td&gt;雷蛇/罗技入门键鼠套装&lt;/td&gt;
&lt;td&gt;¥300&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;总价&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;¥80,000~90,000&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;¥55,000~65,000&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;¥15,000~20,000&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;关键配置说明&lt;/h2&gt;
&lt;h3&gt;CPU选择&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;顶配&lt;/strong&gt;：AMD 9950X3D（16核，3D V-Cache优化仿真性能）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中配&lt;/strong&gt;：Intel i9-14900KS（高频单核，适合建模）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性价比&lt;/strong&gt;：AMD 7800X3D（8核，兼顾游戏与轻量设计）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;strong&gt;重要性&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;SolidWorks 的渲染（尤其是 PhotoView 360 或 KeyShot）主要依赖 CPU的多核性能。仿真计算（如Simulation）也重度依赖CPU。&lt;/li&gt;
&lt;li&gt;如果是实时建模和交互，单核性能也很重要，但渲染阶段多核优势更明显。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;显卡选择&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;顶配&lt;/strong&gt;：RTX 5090D（32GB GDDR7，DLSS 4.0）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中配&lt;/strong&gt;：RTX 5000 Ada（32GB GDDR6，SolidWorks认证）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性价比&lt;/strong&gt;：RTX A4000（16GB GDDR6，入门工作站卡）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;显卡说明&lt;/h4&gt;
&lt;h4&gt;&lt;strong&gt;重要性&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;建模/交互：依赖显卡的实时视图性能（OpenGL驱动优化）。&lt;/li&gt;
&lt;li&gt;渲染：如果使用 GPU渲染器（如 SolidWorks Visualize），则需要高性能显卡；但默认的 PhotoView 360 仅用CPU。
渲染：如果使用 GPU渲染器（如 SolidWorks Visualize），则需要高性能显卡；但默认的 PhotoView 360 仅用CPU。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;strong&gt;类型&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;专业显卡（如RTX Ada）在复杂装配体和抗锯齿表现更好，但价格高
&lt;ul&gt;
&lt;li&gt;NVIDIA RTX Ada 6000 或 RTX 5000 Ada（针对SolidWorks优化，驱动稳定）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;游戏显卡（如5090D）性价比更高，适合预算有限且兼顾其他用途（如游戏）。
&lt;ul&gt;
&lt;li&gt;RTX 4090/5090（未来）也能用，但可能因驱动优化不足导致性能损失（约 10~30%）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;内存（RAM）&lt;/h3&gt;
&lt;h4&gt;&lt;strong&gt;重要性&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;大型装配体或高分辨率渲染需要大内存，否则会频繁卡顿。&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;推荐配置&lt;/strong&gt;&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;需求级别&lt;/th&gt;
&lt;th&gt;容量&lt;/th&gt;
&lt;th&gt;适用场景&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;基础需求&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;32GB DDR5&lt;/td&gt;
&lt;td&gt;中等复杂模型、一般渲染任务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;高级需求&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;64GB~128GB DDR5&lt;/td&gt;
&lt;td&gt;超大型装配体、多任务并行渲染&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;&lt;strong&gt;存储（SSD）&lt;/strong&gt;&lt;/h3&gt;
&lt;h4&gt;&lt;strong&gt;重要性&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;加快场景加载和缓存读写速度，显著提升工作流效率。&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;推荐配置&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;主存储&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;1TB~2TB NVMe SSD（如 &lt;strong&gt;三星 990 Pro&lt;/strong&gt;，读取7,450 MB/s，写入6,900 MB/s）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;备份存储&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;大容量机械硬盘（如 &lt;strong&gt;希捷 IronWolf 8TB+&lt;/strong&gt;，适合长期存档）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;适用场景&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;顶配&lt;/strong&gt;：超大型装配体、实时渲染、流体/结构仿真&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中配&lt;/strong&gt;：中型装配体、常规建模+轻量仿真&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性价比&lt;/strong&gt;：零件设计、学生/个人学习&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;购买建议&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;专业工作站优先选择&lt;strong&gt;顶配&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;中小企业/工作室推荐&lt;strong&gt;中配&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;个人/学生选择&lt;strong&gt;性价比&lt;/strong&gt;方案&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;完整认证列表参考：&lt;a href=&quot;https://www.solidworks.com/support/hardware-certification&quot;&gt;SOLIDWORKS 2025官网&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;TIPS&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;优先顺序：CPU多核 &amp;gt; 大内存 &amp;gt; 专业显卡（或高端游戏显卡） &amp;gt; 高速存储&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.skycity11.xyz&quot;&gt;首页&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>technique</category><category>SolidWork</category><category>电脑配置清单</category></item><item><title>I2C学习随手记录</title><link>https://blog.skycity11.xyz/posts/2025-08-10-i2c-learning-copy/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/2025-08-10-i2c-learning-copy/</guid><pubDate>Sun, 10 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I2C回顾性学习，只记要点&lt;/p&gt;
&lt;h2&gt;1 原理分析&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;I2C（Inter IC Bus）是由Philips公司开发的一种通用数据总线&lt;/li&gt;
&lt;li&gt;两根通信线：SCL（Serial Clock串行时钟线）、SDA（Serial Data串行数据线）&lt;/li&gt;
&lt;li&gt;SCL和SDA均要配置开漏输出模式
&lt;ol&gt;
&lt;li&gt;SDA配置为开漏输出目的：因为SDA半双工，主从机都可以输出，为了防止主从对SDA线输出不同电平，导致避免短路，所以采取禁止所有设备输出强上拉的高电平（对单片机来说是推挽模式），采用外置若上拉电阻加开漏输出的电路结构
&lt;ol&gt;
&lt;li&gt;强上拉：PMOS/NMOS或者开关连接VCC/GND&lt;/li&gt;
&lt;li&gt;弱上拉：用电阻连接至VCC/GND&lt;/li&gt;
&lt;li&gt;开漏模式+弱上拉情况下，只有每个设备都输出高电平，才是高电平，但凡有一个设备输出低电平，就是低电平&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;SCL配置为开漏输出目的：出于多主机模式下时钟同步和总线仲裁考虑&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;SCL和SDA各添加一个上拉电阻，阻值一般为4.7KΩ左右&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/31c264aa21a1b82083fa492daf8ff12959e8f4c1e56e9eca53ad85a20307a7a2.png&quot; alt=&quot;图 0&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/ed774236912735eb7804ee1cb98a1b2f46854510a94b4612d230ff1aa914ddca.png&quot; alt=&quot;图 1&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;2 STM32软件I2C&lt;/h2&gt;
&lt;h3&gt;2.1 时序逻辑&lt;/h3&gt;
&lt;p&gt;开始/结束：SCL高电平期间，变换SDA
接受/发送数据：SCL低电平时，放置SDA，SCL高电平时读走&lt;/p&gt;
&lt;h3&gt;2.1 时序基本单元&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;起始条件：SCL高电平期间，SDA下降沿&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/201547c3e925793adc35bc079b23b3c09387e9cd15f6bd1b08cb377ab47c7755.png&quot; alt=&quot;图 3&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;终止条件：SCL高电平期间，SDA上升沿&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/d551a4ba6c50f137937a3ce800aeb9badfc64150a6b818ef545339e5c9c1a118.png&quot; alt=&quot;图 4&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;发送一个字节：SCL低电平期间，主机将数据位依次放到SDA线上（高位先行），然后释放SCL，从机将在SCL上升沿时读取数据位，所以SCL高电平期间SDA不允许有数据变化，依次循环上述过程8次，即可发送一个字节
&lt;ul&gt;
&lt;li&gt;简单概括：SCL低电平主机放数据，高电平从机读数据&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/988a805e5dcf45e03d741a8cbb335af051a204a1a5a5cbe8ebfaa66d77ab0983.png&quot; alt=&quot;图 5&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;接收一个字节：SCL低电平期间（实为下降沿时），从机将数据位依次放到SDA线上（高位先行），然后释放SCL，主机将在SCL高电平期间读取数据位，所以SCL高电平期间SDA不允许有数据变化，依次循环上述过程8次，即可接收一个字节（主机在接收之前，需要释放SDA）
&lt;ul&gt;
&lt;li&gt;简单概括：SCL低电平从机放数据，高电平主机读数据&lt;/li&gt;
&lt;li&gt;注意点：主机需要提前释放SDA（置1）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/477d22d284f86112b637f6dda87d9d48cd1fbda9d4b567e7ca1e7ae4e1240e20.png&quot; alt=&quot;图 6&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;发送应答：主机在接收完一个字节之后，在下一个时钟发送一位数据，数据0表示应答，数据1表示非应答
&lt;ul&gt;
&lt;li&gt;概括：主机接受完之后，发送1bit数据&lt;/li&gt;
&lt;li&gt;理解：从机发送完数据以后，等待SDA拉低，从而判断主机接收到了数据，即可再发下一笔数据，否则便释放SDA总线，不干扰主机下一步操作&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/59cd5361cc063290adc1fa390aef7f30a45650f55690c3f91b17c4b107dea25f.png&quot; alt=&quot;图 7&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;接收应答：主机在发送完一个字节之后，在下一个时钟接收一位数据，判断从机是否应答，数据0表示应答，数据1表示非应答（主机在接收之前，需要释放SDA）
&lt;ul&gt;
&lt;li&gt;概括：主机发送完之后，接收1bit数据&lt;/li&gt;
&lt;li&gt;理解：主机发送完数据以后，等待SDA拉低，从而判断从机接收到了数据，若没有接收到应答，主机可以视情况产生停止条件，并提示一些信息&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/7a17e0b0e1075696e0b18d26c3291bbf1704a8efaaf3a492f43f3d0bfae06a17.png&quot; alt=&quot;图 8&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2.2 三种数据帧&lt;/h3&gt;
&lt;h3&gt;2.2.1 指定地址写&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;步骤：
&lt;ol&gt;
&lt;li&gt;起始&lt;/li&gt;
&lt;li&gt;主机写从机设备地址+写标志位（0）
&lt;ol&gt;
&lt;li&gt;从机地址一般为7位&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;主机接收从机应答&lt;/li&gt;
&lt;li&gt;主机写从机内部地址
&lt;ol&gt;
&lt;li&gt;传感器：寄存器地址&lt;/li&gt;
&lt;li&gt;ADC：指令控制字&lt;/li&gt;
&lt;li&gt;Flash：内部RAM地址&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;主机接收从机应答&lt;/li&gt;
&lt;li&gt;主机写数据&lt;/li&gt;
&lt;li&gt;主机接收从机应答&lt;/li&gt;
&lt;li&gt;停止&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;注意：
&lt;ol&gt;
&lt;li&gt;扩展：如果想在一条数据帧连续写入多字节地址，则在7后重复6、7即可，地址会自动+1&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/b9a6632ea0e682b56f3bb53698e74257b5dc97ada49fd71ae63704e572340bfc.png&quot; alt=&quot;图 10&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2.2.1 当前地址读&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;步骤：
&lt;ol&gt;
&lt;li&gt;起始&lt;/li&gt;
&lt;li&gt;主机写从机设备地址+读标志位（1）&lt;/li&gt;
&lt;li&gt;主机接收从机数据&lt;/li&gt;
&lt;li&gt;主机发送从机非应答（SA）（1）&lt;/li&gt;
&lt;li&gt;停止&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;注意：
&lt;ol&gt;
&lt;li&gt;该方式无法指定从机内部地址，只能通过上一笔读写过的地址+1判断，若没有操作过默认为0地址。
&lt;ol&gt;
&lt;li&gt;地址会存入从机内部一个寄存器中，不会因为起始/停止改变地址内容&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;发送非应答SA，表示主机不想再继续接收数据，此时从机会释放SDA&lt;/li&gt;
&lt;li&gt;扩展：如果想在一条数据帧连续读出多字节地址，则将4改为“主机发送从机应答”后重复3、4即可，地址会自动+1，直到不想再接收数据，将4改为“主机发送从机非应答”&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/2bfba56c1f1d7b3a272f1e1b6e4f71c2e9caefc5533aef838085644c11a3eedb.png&quot; alt=&quot;图 11&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2.2.2 指定地址读&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;步骤：
&lt;ol&gt;
&lt;li&gt;起始&lt;/li&gt;
&lt;li&gt;主机写从机设备地址+写标志位（0）&lt;/li&gt;
&lt;li&gt;主机接收从机应答&lt;/li&gt;
&lt;li&gt;主机写从机内部地址&lt;/li&gt;
&lt;li&gt;主机接收从机应答&lt;/li&gt;
&lt;li&gt;restart（Sr）&lt;/li&gt;
&lt;li&gt;主机写从机设备地址+读标志位（1）&lt;/li&gt;
&lt;li&gt;主机接收从机应答&lt;/li&gt;
&lt;li&gt;主机接收从机数据&lt;/li&gt;
&lt;li&gt;主机发送从机非应答位（SA）&lt;/li&gt;
&lt;li&gt;停止&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;注意：
&lt;ol&gt;
&lt;li&gt;相当于主机先写了一个地址但没写数据，然后再发起一个读请求，从机就会由这个地址读取&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/070df6919e69e1fb112d2bee6fbbf35d650bb1fc2d200b5b68c7fb868cc0a1d9.png&quot; alt=&quot;图 12&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;3 STM32硬件I2C&lt;/h2&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;p&gt;Ongoing&lt;/p&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.skycity11.xyz&quot;&gt;首页&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>technique</category><category>I2C</category><category>手记</category></item><item><title>STM32学习随手记录</title><link>https://blog.skycity11.xyz/posts/2025-08-09-stm32-learning/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/2025-08-09-stm32-learning/</guid><pubDate>Sat, 09 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;STM32回顾性学习，只记要点&lt;/p&gt;
&lt;h2&gt;1 Keil设置&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Configuration（帮叟）
&lt;ol&gt;
&lt;li&gt;Editor-&amp;gt;Encoding-&amp;gt;Encode in UTF-8 without signature 支持中文&lt;/li&gt;
&lt;li&gt;Editor-&amp;gt;C/C++ Files-&amp;gt;Tab size-&amp;gt;4 更改缩进为4&lt;/li&gt;
&lt;li&gt;Color &amp;amp; Fonts-&amp;gt; C/C++ Editor files-&amp;gt; Text -&amp;gt; Font-&amp;gt;14 调整字体大小&lt;/li&gt;
&lt;li&gt;Text Completion -&amp;gt; Symbols after 3 Characters 选中 自动补全设置（需重启软件）&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Options for Target（魔术棒）
&lt;ol&gt;
&lt;li&gt;C/C++-&amp;gt; Include Paths 声明所有包含头文件的文件夹&lt;/li&gt;
&lt;li&gt;C/C++-&amp;gt; Define内定义USE_STDPERIPH_DRIVER 使用标准外设编译，这是使用库函数的条件编译&lt;/li&gt;
&lt;li&gt;Debug 下拉列表选择对应调试器&lt;/li&gt;
&lt;li&gt;Debug 调试器旁边Settings Flash Download里勾选Reset and Run&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;2 STM32内部电路结构&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/87c0f39c51fa6e2f03d5a623635c74c71777db1dce7b17fa6d61abc73195c688.png&quot; alt=&quot;图 0&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;3 STM32编程&lt;/h2&gt;
&lt;h3&gt;3.1 方式：&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;  1. 直接调用寄存器（需查阅STM32文档）
  2. 库函数
  3. HAL
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.2 库函数&lt;/h3&gt;
&lt;h4&gt;3.2.1 GPIO配置&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;#include &quot;stm32f10x.h&quot;                  // Device header

int main(void)
{
	//使用库函数将位于GPIOC的Pin13对应的LED点亮（0亮1灭）
	//1. 打开clk使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); 	//打开GPIOC的clk使能
	//2. 定义GPIO结构体
	GPIO_InitTypeDef GPIO_InitStrcture;					//定义一个名为GPIO_InitStrcture的结构体，并在下面描述结构体的内容
	GPIO_InitStrcture.GPIO_Mode = GPIO_Mode_Out_PP; 	//通用推挽输出
	GPIO_InitStrcture.GPIO_Pin = GPIO_Pin_13; 			//将控制目标定为Pin13（跳转：点击Class为member的GPIO_Pin）
	GPIO_InitStrcture.GPIO_Speed = GPIO_Speed_50MHz;	//将Pin13速度定位50MHz
	//3. 初始化GPIO
	GPIO_Init(GPIOC, &amp;amp;GPIO_InitStrcture); 				//初始化GPIOC
	//4. GPIO设置为高/低电平
	GPIO_SetBits(GPIOC, GPIO_Pin_13);
//	GPIO_ResetBits(GPIOC, GPIO_Pin_13);
	while (1)
	{
		
	}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3.2.2 寄存器输出模式&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/2c7f31407fb659852c99794bdb36cf6a109a5301a0faf34c0028e22e1b30f4b3.png&quot; alt=&quot;图 1
1&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;推挽
&lt;ol&gt;
&lt;li&gt;P-MOS/N-MOS都导通。高电平：1，低电平：0&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;开漏
&lt;ol&gt;
&lt;li&gt;P-MOS关闭，N-MOS导通。高电平：高阻（浮空），低电平：0&lt;/li&gt;
&lt;li&gt;可外接5V上拉电阻，将高电平输出为5V&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;关闭
&lt;ol&gt;
&lt;li&gt;P-MOS/N-MOS都关闭。电平由外部电路控制45&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;


















—————————————————————————————————————

Ongoing

—————————————————————————————————————

[首页](https://blog.skycity11.xyz)&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>technique</category><category>STM32</category><category>手记</category></item><item><title>手记-DIY-異議あり！-陀螺仪-音频播放器</title><link>https://blog.skycity11.xyz/posts/2025-08-06-stm32-base-pheonix-mp3/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/2025-08-06-stm32-base-pheonix-mp3/</guid><pubDate>Wed, 06 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;记录制作&quot;異議あり！-陀螺仪-音频播放器&quot;的过程&lt;/p&gt;
&lt;h2&gt;空想阶段&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;start at 2025/5/12&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;想法来源&lt;/h3&gt;
&lt;p&gt;由于最近沉迷《逆转裁判》123系列（又称逆转裁判成步堂传），经常幻想自己在法庭上学成步堂拿手指人并大喊「異議あり！」&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/085166ff8e2a9773e93c2b4c5b9932e292a705d061db87ac26c8cc2266c6c6cf.png&quot; alt=&quot;图 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;加上由于NS上游玩无法切换日语配音，导致其经典台词「異議あり！」只能用中文「异议！」呈现，对此耿耿于怀。又无聊时刷到&lt;a href=&quot;https://www.bilibili.com/video/BV19pGvzqETu/?spm_id_from=333.1391.0.0&amp;amp;vd_source=82e7af664af41b55402c040af5862bde&quot;&gt;b站视频&lt;/a&gt;有up自己DIY了一款实体版「異議あり！」的小型播放器，支持手势操作和播放bgm功能，非常中二，又想起了自己的专业，总该干点老本行了，遂有了自己制作这个播放器的想法。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/370ddbc3b3145fd444a92a14593d6ce6b6098aa05070c34e1dd121b32d2f884d.png&quot; alt=&quot;图 0&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;画饼阶段&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;start at 2025/8/6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;（不要问我为什么拖了这么久）&lt;/p&gt;
&lt;h3&gt;1 目标指定&lt;/h3&gt;
&lt;p&gt;能做出来一个能同时播放游戏的语音及bgm、支持手势操作切换歌曲、支持USB烧录歌曲、能通过按键调节音量、能离线使用&amp;amp;能充电、有外壳的音乐播放器即可，功能实现为主，大小、功耗、外观不追求太多。&lt;/p&gt;
&lt;h3&gt;2 功能划分&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;电路方面
&lt;ol&gt;
&lt;li&gt;主控芯片，应该没啥门槛，能使就行
&lt;ol&gt;
&lt;li&gt;采用STM32F103C8T6（暂定）&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;陀螺仪芯片，用来实现手势操作，通过X轴/Y轴位移手势指令，输入单片机识别，支持I2C控制
&lt;ol&gt;
&lt;li&gt;采用MPU6050（V老师推荐准没错）&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;语音芯片,功能包括语音编码、解码、存储、播放和识别，支持串口控制
&lt;ol&gt;
&lt;li&gt;采用&lt;a href=&quot;https://www.ch2003.com/search.jsp?id=468&amp;amp;q=ch7003&amp;amp;fromTopShoppingCart=false&quot;&gt;CH7003&lt;/a&gt;（网上随便找的），抄一下datasheet
&lt;ol&gt;
&lt;li&gt;带4MB内存&lt;/li&gt;
&lt;li&gt;PWM音频输出，内置0.5W功放，可直接推动8Ω/0.5W喇叭&lt;/li&gt;
&lt;li&gt;支持DAC输出，外界功放&lt;/li&gt;
&lt;li&gt;支持外挂SPI flash，最大128Mbit&lt;/li&gt;
&lt;li&gt;支持USB连接电脑拷贝音频，PC虚拟内置存储介质的U盘功能&lt;/li&gt;
&lt;li&gt;30级音量自由设定&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;DAC及功放模块
&lt;ol&gt;
&lt;li&gt;视情况而定，先用语音芯片内置功放试试效果，不行再加喇叭&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;存储flash模块
&lt;ol&gt;
&lt;li&gt;视情况而定，先看看语音芯片内部够用不，不够再加SPI flash&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;蓄电池以及充电模块
&lt;ol&gt;
&lt;li&gt;没想好具体咋做&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;USB typec电路，实现调试、连接电脑烧录音频音频、充电
&lt;ol&gt;
&lt;li&gt;没想好具体咋做&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;外壳方面
&lt;ol&gt;
&lt;li&gt;3D打印外壳，具体设计待定，先把电路功能做好再去求教Q老师&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3 计划步骤&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;先用现成的（&quot;这不是现成的？&quot;）核心板+面包板+功能芯片分步实现核心功能
&lt;ol&gt;
&lt;li&gt;熟悉核心板相关
&lt;ol&gt;
&lt;li&gt;购买&lt;a href=&quot;https://item.taobao.com/item.htm?ak=27696150&amp;amp;ali_trackid=2%3Amm_2038330052_2851900351_114774900234%3A1754491472028_189881609_0&amp;amp;bxsign=tbkj4UizbkIFcsC-D8vNM3N4MusMQIMS2NgfROIovyxjPIVeegZP8-JDXnAIQ9N0GkbEW5EfnWOyu5q9VHxazJTKKfPrKJLpLftDQ9jX2wRVGk4FE04KUv2HWxuNCZo9vkpnjjleQ6Luy2Jw6SxfbWF3YyQD5qsChRcr3UU0jjE-BnaPsCEYERUIx4FwScGjW7z&amp;amp;id=655451342180&amp;amp;union_lens=lensId%3ATAPI%401701262245%40212c1916_0f45_18c1b21c002_8f11%4001%3Brecoveryid%3A189881609_0%401754491472032&quot;&gt;STM32最小系统板+面包板硬件平台&lt;/a&gt;，套件内容包括：
&lt;ol&gt;
&lt;li&gt;STM32F103C8T6最小系统板（支持直插面包板）&lt;/li&gt;
&lt;li&gt;面包板以及各种线&lt;/li&gt;
&lt;li&gt;OLED显示屏&lt;/li&gt;
&lt;li&gt;MPU6050陀螺仪模块&lt;/li&gt;
&lt;li&gt;以及一些暂时看上去用不到的东西&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;根据&lt;a href=&quot;https://www.bilibili.com/video/BV1th411z7sn?spm_id_from=333.788.videopod.episodes&amp;amp;vd_source=82e7af664af41b55402c040af5862bde&quot;&gt;套件配套视频&lt;/a&gt;捡回尘封的记忆&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;用STM32+MPU6050实现手势操作识别功能
&lt;ol&gt;
&lt;li&gt;核心板套件自带MPU6050套件&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV12o5vzwEPp?spm_id_from=333.788.videopod.episodes&amp;amp;vd_source=82e7af664af41b55402c040af5862bde&amp;amp;p=2&quot;&gt;参考视频&lt;/a&gt;工程代码，实现MPU6050初始化配置&lt;/li&gt;
&lt;li&gt;实现X轴/Y轴位移手势指令识别&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;用STM32+语音芯片实现音频播放、切换、控制功能
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1hsbAesE6F/?spm_id_from=333.337.search-card.all.click&amp;amp;vd_source=82e7af664af41b55402c040af5862bde&quot;&gt;参考视频&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;用USB模块实现调试、连接电脑烧录音频音频功能&lt;/li&gt;
&lt;li&gt;用电池模块实现设备离线、充电功能&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;画原理图、PCB实现以STM32、MPU6050、语音芯片为主体的硬件电路，投稿嘉立创获得板板&lt;/li&gt;
&lt;li&gt;实现外壳设计&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;update at 2025/8/6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;4 实际开干&lt;/h3&gt;
&lt;h4&gt;4.1 MPU6050学习&lt;/h4&gt;
&lt;h5&gt;4.1.1 原理&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;MPU6050是一个6轴姿态传感器，可以测量芯片自身X、Y、Z轴的加速度、角速度参数，通过数据融合，可进一步得到姿态角，常应用于平衡车、飞行器等需要检测自身姿态的场景&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/ef4adfc59dfa2f44c53df58f0485b1af2f3f40e8090499c0e2b805489989a2ad.png&quot; alt=&quot;图 2&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3轴加速度计（Accelerometer）：测量X、Y、Z轴的加速度
&lt;ul&gt;
&lt;li&gt;实际上是一个测力计&lt;/li&gt;
&lt;li&gt;可以理解为坐在车里，车子突然往前开，椅背感觉到力&lt;/li&gt;
&lt;li&gt;静态稳定，动态不稳定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/3aa78a54bd67128e62a8a0a5b4245b3cf0b48fe304fa23a3ddc10a18812cdb5f.png&quot; alt=&quot;图 3&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3轴陀螺仪传感器（Gyroscope）：测量X、Y、Z轴的角速度
&lt;ul&gt;
&lt;li&gt;静态不稳定，动态稳定&lt;/li&gt;
&lt;li&gt;可以理解为游乐场甩椅子，甩起来以后测两个椅子间的距离从而获得角速度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/aa4b62b76a22fc4ec8a7f57a7a943b2b738c952fd524b49aa05e1557ffd32cf1.png&quot; alt=&quot;图 4&quot; /&gt;&lt;/p&gt;
&lt;h5&gt;4.1.2 参数&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;16位ADC采集传感器的模拟信号，量化范围：-32768~32767&lt;/li&gt;
&lt;li&gt;加速度计满量程选择：±2、±4、±8、±16（g）
&lt;ul&gt;
&lt;li&gt;如选择为±2，那么32767对应的就是2g加速度&lt;/li&gt;
&lt;li&gt;量程越小，测量就会更细腻&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;陀螺仪满量程选择： ±250、±500、±1000、±2000（°/sec）
&lt;ul&gt;
&lt;li&gt;运动剧烈，就把量程调高，避免加速度/角速度超出量程&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;可配置的数字低通滤波器
&lt;ul&gt;
&lt;li&gt;如果抖动太厉害，就开启，可以让数据平缓一点&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;可配置的时钟源，可配置的采样分频
&lt;ul&gt;
&lt;li&gt;控制AD采样的快慢&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I2C从机地址：1101000（AD0=0）；1101001（AD0=1）
&lt;ul&gt;
&lt;li&gt;由于I2C读写位的存在，所以0x68(1101000)会左移一位在加上读写位，也就变成了0xD0（读），0xD1（写）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/070df6919e69e1fb112d2bee6fbbf35d650bb1fc2d200b5b68c7fb868cc0a1d9.png&quot; alt=&quot;图 5&quot; /&gt;&lt;/p&gt;
&lt;h5&gt;4.1.3 电路&lt;/h5&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/807cd05ee9ec4f4a6002b445c7d5b483025b2c3a693f82a0741bd08f3a2a5520.png&quot; alt=&quot;图 6&quot; /&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;引脚&lt;/th&gt;
&lt;th&gt;功能&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;XCL、XDA&lt;/td&gt;
&lt;td&gt;主机I2C通信引脚&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AD0&lt;/td&gt;
&lt;td&gt;从机地址最低位&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INT&lt;/td&gt;
&lt;td&gt;中断信号输出&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;SCL、SDA已经接如上拉电阻&lt;/li&gt;
&lt;li&gt;XCL、XDA
&lt;ul&gt;
&lt;li&gt;通常用于外接磁力计或磁力计，MPU6050通过I2C主动访问这些芯片，经过内部DMP进行数据融合和姿态解算&lt;/li&gt;
&lt;li&gt;用于扩展功能，比如引入绕z轴角度（偏航角）（类似于指南针），或者无人机定高时，需要加气压计扩展为10轴，提供一个高度信息的稳定参考&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AD0 已接入下拉电阻，默认为0&lt;/li&gt;
&lt;li&gt;LDO 左上角，扩展5V供电&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;4.1.3 内部框图&lt;/h5&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/709076e96a5622fc680d9662a55bc0f2776f5ae3b65e6abb95ca84fa4de168db.png&quot; alt=&quot;图 7&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Self test
&lt;ul&gt;
&lt;li&gt;功能：自测模块，启动自测后，芯片内部会模拟一个外力施加在传感器上，导致传感器数据比平时大一些&lt;/li&gt;
&lt;li&gt;使用：先开自测，再关自测，把两者数据相减得到自测响应，查阅手册，如果在范围内就没坏&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;update at 2025/8/10&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;4.1 MPU6050调试&lt;/h4&gt;
&lt;h5&gt;4.1.1 思路&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;100ms为间隔测试一次&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;快速移动检测阈值为2g&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// 快速移动检测阈值 (可根据实际情况调整)
#define MOVEMENT_THRESHOLD 2.0f // 2g的加速度变化
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;p&gt;Ongoing&lt;/p&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.skycity11.xyz&quot;&gt;首页&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>technique</category><category>DIY</category><category>STM32</category><category>音乐播放器</category><category>MPU6050</category><category>手记</category></item><item><title>使用MD写网页文章的贴图方法</title><link>https://blog.skycity11.xyz/posts/2025-07-18-how-to-paste-graph/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/2025-07-18-how-to-paste-graph/</guid><pubDate>Fri, 18 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;总结了一些使用MD写网页文章的贴图方法，解决贴图麻烦的问题&lt;/p&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;h2&gt;方法1：引用绝对路径图片&lt;/h2&gt;
&lt;p&gt;将名为&quot;filename&quot;的JPG格式图片存放在img路径下，然后用这种引用方式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![](/img/filename.jpg)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;注：该方法虽稳定但较为繁琐，需先粘贴图片，再填路径&lt;/em&gt;
—————————————————————————————————————&lt;/p&gt;
&lt;h2&gt;方法2：通过vscode + markdown image插件贴图&lt;/h2&gt;
&lt;p&gt;（个人理解）原理是通过插件中的&lt;strong&gt;jsdelivr&lt;/strong&gt;服务，将图片传到github上指定仓的jsdelivr镜像仓，获取该图片的镜像仓链接，也就是&lt;code&gt;https://cdn.jsdelivr.net&lt;/code&gt;开头的链接。取决于该服务器的稳定性。个人目前使用还算稳定。&lt;/p&gt;
&lt;h4&gt;1. github中的设置&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;在github中&lt;strong&gt;新建一个仓库&lt;/strong&gt;，如picture，之后该目录的https地址将会用到，如&lt;code&gt;https://github.com/username/picture&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;在github中&lt;strong&gt;获取个人访问令牌&lt;/strong&gt;，从而vscode中的插件获得访问picture库的权限
&lt;ol&gt;
&lt;li&gt;进入github，点击右上角头像进入settings，左边栏拉到最下找到Developer settings
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/b1ea5b8107a746a50438f1fe527827fad7039aa40c31cb7ef8a9264fc316c2b3.png&quot; alt=&quot;图 3&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/d34c0bb254c3ccb986f4f3402afed09cf6e34bd71e52f6eca7ac8ce879e161ca.png&quot; alt=&quot;图 4&quot; /&gt;&lt;/li&gt;
&lt;li&gt;选择Fine-grained tokens，选择右上角Generate new tokens
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/7ae41e7cf61b37813dcada6c27d13b38b8fcceac88cf4fbf48176c10d35ebfa7.png&quot; alt=&quot;图 5&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/34982037a206d435f197a121cf40674f97e6381b37084828f595bbfc9476ad80.png&quot; alt=&quot;图 6&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Token name任取，Expiration选择custom，最高可达一年
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/03808cbdc18b6b3d0b5aab4b13ea4d8c571cb01536378ebb89d1f8365e875154.png&quot; alt=&quot;图 7&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Repository access选择刚刚建好的仓库
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/e49f078b61f4b9701c38530f573c968a1136d083764973179fe09f8b8a1416ec.png&quot; alt=&quot;图 8&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Permissions中点开Account permissions，只需选择Contents Read and write
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/84cc60d7dc82ff14eaa01ec40282641dd986303dfad72eafaf06666c21a824ea.png&quot; alt=&quot;图 9&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Generate token之后，需妥善保存&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;2. vscode中的设置&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;接下来，使用vscode编辑器，安装&lt;strong&gt;Markdown Image&lt;/strong&gt;插件&lt;br /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/07319afbc7e7c4c6a7532298750e914a01f5452116c27608e2f96712e570841a.png&quot; alt=&quot;图 0&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;进入插件设置，选择GitHub作为上传图片的方式，然后点击设置项目&lt;br /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/bc0b9fa62a4bc16dd306b772637933b91e55c7746a875215795743aa5654ae5b.png&quot; alt=&quot;图 1&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;需要填的内容为这4项，第二项填入之前保存的token，第三项填入新建的github仓库，第一项是为保存的图片新建仓库的一级目录&lt;br /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/6da92424fb47ff2ff0a34ce0b32f209a69300acae1353f139362b4c8c9c5c52f.png&quot; alt=&quot;图 11&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;之后就可以通过右键粘贴图片，或者快捷键&lt;code&gt;Shift+Alt+V&lt;/code&gt;粘贴图片链接，如&lt;br /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/skycity11/picture@master/pic/1add83bb73a1946b6473d5d0c8e7d08836b1310406bf74bbaf092ccfc76639b0.png&quot; alt=&quot;图 10&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;注：很偶尔会出现上传不成功，导致粘贴不了的问题，可能是服务器卡了，过一会儿再试即可&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;—————————————————————————————————————&lt;br /&gt;
The end&lt;br /&gt;
—————————————————————————————————————&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.skycity11.xyz&quot;&gt;首页&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>technique</category><category>markdown</category><category>博客</category><category>个人网站</category><category>粘贴图片</category><category>技巧</category></item><item><title>特定URL隐藏分类文章</title><link>https://blog.skycity11.xyz/posts/2025-07-18-url-hide-post/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/2025-07-18-url-hide-post/</guid><pubDate>Fri, 18 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;通过屏蔽关键词的方式伪隐藏文章，并通过特定URL查找到这些文章&lt;/p&gt;
&lt;h2&gt;原理分析&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;目的:&lt;/strong&gt;
要实现通过特定URL访问隐藏的分类文章，同时不让这些文章出现在&lt;strong&gt;首页或其他公开位置&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方法分析：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果只是不想让文章出现在首页 → 方法1（hidden: true）&lt;/li&gt;
&lt;li&gt;如果希望完全隐藏，除非知道 URL → 方法2（_drafts）&lt;/li&gt;
&lt;li&gt;如果需要更严格的访问控制 → 方法3（私有分支）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;本文中只介绍&lt;strong&gt;方法1&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;举例说明:&lt;/strong&gt;
比如想要将work分类下的文章隐藏起来，输入&lt;code&gt;https://&amp;lt;your-site&amp;gt;/work&lt;/code&gt;才可以看到&lt;/p&gt;
&lt;h2&gt;具体步骤&lt;/h2&gt;
&lt;h3&gt;1. 在文章的 Front Matter 中添加 hidden: true 和 category: work&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;给&lt;strong&gt;隐藏文章&lt;/strong&gt;设置，隐藏属性为&lt;strong&gt;是&lt;/strong&gt;，分类为&lt;strong&gt;work&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;{% raw %}&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hidden: true  # 不在首页显示
category: work  # 属于 work 分类
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;{% endraw %}&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;给&lt;strong&gt;正常文章&lt;/strong&gt;设置，隐藏属性为&lt;strong&gt;否&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;{% raw %}&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hidden: false  # 在首页显示
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;{% endraw %}&lt;/p&gt;
&lt;h3&gt;2. 在_config.yml添加内容确保首页不显示 hidden 文章&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在首页只显示hidden属性为false的文章&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;{% raw %}&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;defaults:
  - scope:
      path: &quot;&quot;
      type: posts
    values:
      hidden: false
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;{% endraw %}&lt;/p&gt;
&lt;h3&gt;3. 创建 /work/index.html 页面&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;该步骤目的是在&lt;code&gt;https://&amp;lt;your-site&amp;gt;/work&lt;/code&gt;中&lt;strong&gt;只显示&lt;/strong&gt;work分类的文章&lt;/li&gt;
&lt;li&gt;将根目录的index.html直接&lt;strong&gt;复制&lt;/strong&gt;到新建目录work下，在此基础上做一些修改&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Front Matter中加入&lt;code&gt;permalink: /work/&lt;/code&gt;，以设置访问路径是&lt;code&gt;https://&amp;lt;your-site&amp;gt;/work&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;在&lt;code&gt;for post in site.posts&lt;/code&gt;中加入 {% if post.category ** &quot;work&quot; %}的判断，并用&lt;code&gt;{% endif %}&lt;/code&gt;收尾，以确保只显示work分类的文章&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;以我的index.html为例&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;有些个人博客（比如我）搭建时用了&lt;strong&gt;分页插件&lt;/strong&gt;（比如&lt;strong&gt;jekyll-paginate&lt;/strong&gt;），所以首页的 index.html 里用的是 &lt;code&gt;paginator.posts&lt;/code&gt;，而不是 &lt;code&gt;site.posts&lt;/code&gt;。但分页插件 &lt;code&gt;paginator&lt;/code&gt;只在首页生效，所以/work页面还是需要&lt;code&gt;site.posts&lt;/code&gt;，只需都替换成&lt;code&gt;site.posts&lt;/code&gt;即可&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修改后&lt;/strong&gt;我的work/index.html如下
{% raw %}&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;---
layout: page
description: &quot;「work」&quot;
permalink: /work/  # 设置访问路径
---

{% for post in site.posts %}
  {% if post.category == &quot;work&quot; %} # 如果为work分类的文章
    &amp;lt;div class=&quot;post-preview&quot;&amp;gt;
        &amp;lt;a href=&quot;{{ post.url | prepend: site.baseurl }}&quot;&amp;gt;
            &amp;lt;h2 class=&quot;post-title&quot;&amp;gt;
                {{ post.title }}
            &amp;lt;/h2&amp;gt;
            {% if post.subtitle %}
            &amp;lt;h3 class=&quot;post-subtitle&quot;&amp;gt;
                {{ post.subtitle }}
            &amp;lt;/h3&amp;gt;
            {% endif %}
            &amp;lt;div class=&quot;post-content-preview&quot;&amp;gt;
                {% if post.lang == &apos;en&apos; %}
                    {{ post.content | strip_html | truncate:300 }}
                {% else %}
                    {{ post.content | strip_html | truncate:200 }}
                {% endif %}
            &amp;lt;/div&amp;gt;
        &amp;lt;/a&amp;gt;
        &amp;lt;p class=&quot;post-meta&quot;&amp;gt;
            Posted by {% if post.author %}{{ post.author }}{% else %}{{ site.title }}{% endif %} on {{ post.date | date: &quot;%B %-d, %Y&quot; }}
        &amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
  {% endif %} # end for 确保如果为work分类的文章
&amp;lt;hr&amp;gt;
{% endfor %}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;{% endraw %}&lt;/p&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;p&gt;The end&lt;/p&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.skycity11.xyz&quot;&gt;首页&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>technique</category><category>markdown</category><category>html</category><category>个人网站</category><category>隐藏文章</category><category>技巧</category></item><item><title>markdown语法总结</title><link>https://blog.skycity11.xyz/posts/2025-07-18-markdown-study/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/2025-07-18-markdown-study/</guid><pubDate>Fri, 18 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;一些搭建网站时踩的坑和总结&lt;/p&gt;
&lt;h2&gt;灰标签&lt;/h2&gt;
&lt;h5&gt;代码：&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;灰标签
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;效果：&lt;/h5&gt;
&lt;blockquote&gt;
&lt;p&gt;灰标签&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;h2&gt;超链接&lt;/h2&gt;
&lt;h5&gt;效果：&lt;/h5&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.skycity11.xyz&quot;&gt;首页&lt;/a&gt;&lt;/p&gt;
&lt;h5&gt;代码：&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;[首页](https://blog.skycity11.xyz)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;h2&gt;斜体&lt;/h2&gt;
&lt;h5&gt;效果：&lt;/h5&gt;
&lt;p&gt;&lt;em&gt;斜体&lt;/em&gt;&lt;/p&gt;
&lt;h5&gt;代码：&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;*斜体*
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;h2&gt;添加代码块&lt;/h2&gt;
&lt;h5&gt;效果：&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;content

&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;代码：&lt;/h5&gt;
&lt;p&gt;在代码块之前和之后的行上使用三个反引号&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;```markdown
content
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;p&gt;The end&lt;/p&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.skycity11.xyz&quot;&gt;首页&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>technique</category><category>markdown</category><category>语法</category><category>个人网站</category><category>技巧</category></item><item><title>Data Representation - TODO</title><link>https://blog.skycity11.xyz/posts/data_rep/2020-06-21-data-rep-todo/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/data_rep/2020-06-21-data-rep-todo/</guid><description>「数据表示」待写</description><pubDate>Sun, 21 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;Endianness&lt;/li&gt;
&lt;li&gt;String (Char Sequence e.g. NULL &lt;code&gt;0x00&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Unicode / UTF8&lt;/li&gt;
&lt;li&gt;Struct and Alignment&lt;/li&gt;
&lt;li&gt;Tagging
&lt;ul&gt;
&lt;li&gt;Tagged Pointer&lt;/li&gt;
&lt;li&gt;NaN tagging&lt;/li&gt;
&lt;li&gt;Tagged Integer (SMI)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>笔记</category><category>基础</category><category>C</category><category>C++</category></item><item><title>FPGA基本原理</title><link>https://blog.skycity11.xyz/posts/2019-12-17-fpga/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/2019-12-17-fpga/</guid><pubDate>Wed, 25 Dec 2019 09:34:00 GMT</pubDate><content:encoded>&lt;p&gt;FPGA基本结构和原理&lt;/p&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;h3&gt;1 FPGA基本结构&lt;/h3&gt;
&lt;p&gt;FPGA组成三要素&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可编程逻辑功能块（逻辑单元）
&lt;ul&gt;
&lt;li&gt;实现用户功能的基本单元，多个通常规则地排成一个阵列结构，分布于整个芯片
&lt;ul&gt;
&lt;li&gt;查找表&lt;/li&gt;
&lt;li&gt;D触发器&lt;/li&gt;
&lt;li&gt;进位线&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;片内互联线（Programmable Interconnect）&lt;/li&gt;
&lt;li&gt;输入输出块（I/O）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.skycity11.xyz&quot;&gt;HOME&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>FPGA</category></item><item><title>LVDS概述</title><link>https://blog.skycity11.xyz/posts/2019-12-17-lvds/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/2019-12-17-lvds/</guid><pubDate>Tue, 17 Dec 2019 14:34:00 GMT</pubDate><content:encoded>&lt;h3&gt;1 LVDS接口概述&lt;/h3&gt;
&lt;p&gt;LVDS(Low-Voltage Differential Signaling)低电压差分信号，是一种信号传输模式、电平标准。&lt;/p&gt;
&lt;p&gt;LVDS接口又称RS-644总线接口。&lt;/p&gt;
&lt;p&gt;LVDS技术核心&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;采用极低的电压摆幅高速差动传输数据&lt;/li&gt;
&lt;li&gt;点对点、一点对多点的连接&lt;/li&gt;
&lt;li&gt;低功耗、低误码率、低串扰和低辐射特点&lt;/li&gt;
&lt;li&gt;相比于LVTTL或LVCMOS电平标准可以极大提升单通道数据速率&lt;/li&gt;
&lt;li&gt;相比于并行接口传输数据，LVDS串口通信接口传输数据可以节省系统的电缆和连接器成本，并且可以减少连接器占用面积所需的物理空间。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;LVDS使用注意点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;关注相关IP核与内部逻辑之间的接口实现&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;LVDS工作原理&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LVDS信号由三部分组成
&lt;ul&gt;
&lt;li&gt;差分信号发送器：将非平衡传输的TTL信号转换成平衡传输的LVDS信号。&lt;/li&gt;
&lt;li&gt;差分信号接收器：将LVDS信号转换成TTL信号。&lt;/li&gt;
&lt;li&gt;差分信号互连器：包括连接线和终端匹配电阻。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LVDS接口使用1.2V偏执电压作为基准，正负端摆幅350mV，即差模电压。
&lt;ul&gt;
&lt;li&gt;驱动差分线对的电流源组成（3.5mA），终端电阻为100Ω，电压摆动幅度为350mV&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LVDS用来传输高速变化信号的原因：LVDS信号物理电平变化在0.85V~1.55V,由0到1电平变化的时间比TTL电平变化要快得多。且低功耗。&lt;/li&gt;
&lt;li&gt;LVDS传输的一个通道有两个信号：V+和V-，电平相反，称之为差分对。
&lt;ul&gt;
&lt;li&gt;1电平：V+有3.5mA电流通过，在发送和接收端产生350mV压差，V-无电流通过。&lt;/li&gt;
&lt;li&gt;0电平：V-有3.5mA电流通过，在发送和接收端产生350mV压差，V+无电流通过。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;LVDS_TX IP核配置（结合实例）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;LVDS_TX的目的是将并行的数据转化成高速串行的串行数据，串行数据位数就是LVDS通道数，串行数据的传输速率输入时钟与串化因子的乘积。若为10位并行数据，则将输入时钟10倍频，每个上升沿传一位数据即可。此时串化因子为10，通道数为1。&lt;/p&gt;
&lt;p&gt;但串化因子的上限位10，如果并行数据是10位以上，比如为21位，此时只能增加串行数据的位宽（通道数）。将输入时钟7倍频，每个通道在上升沿的时候传递一位数据，故三个通道在每个上升沿传三位数据，分别是[20:14],[13:7],[6:0]。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LVDS数据速率 = LVDS时钟频率 × 串化因子&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;175Mb/s = 25MHz × 7&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Parameter Settings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;General
&lt;ul&gt;
&lt;li&gt;LVDS的通道数 = 3（Channels number）&lt;/li&gt;
&lt;li&gt;串化因子(数据位宽) = 7（deserialization factor）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Frequency/PLL settings
&lt;ul&gt;
&lt;li&gt;单通道的LVDS数据速率 = 175Mb/s（output data rate）&lt;/li&gt;
&lt;li&gt;LVDS时钟速率 = 25MHz（input clock rate）&lt;/li&gt;
&lt;li&gt;使用pll复位端口（Use &apos;pll_areset&apos; input port）&lt;/li&gt;
&lt;li&gt;寄存器tx_in使用 = (tx_inclock)（Register &apos;tx_in&apos; input port using）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Transmitter settings
&lt;ul&gt;
&lt;li&gt;输出时钟分频系数 = 7（outclock divide factor）&lt;/li&gt;
&lt;li&gt;输出时钟相位偏差 = 0.00（Specify phase alignment）&lt;/li&gt;
&lt;li&gt;输出时钟占空比 = 57%（outclock ducy cycle）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lvds	lvds_inst (
	.pll_areset ( pll_areset_sig ),
	.tx_in ( tx_in_sig ),
	.tx_inclock ( tx_inclock_sig ),
	.tx_out ( tx_out_sig ),
	.tx_outclock ( tx_outclock_sig )
	);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/skycity11/skycity11.github.io/raw/master/img/LVDS/lvds_time.png&quot; alt=&quot;lvds_time&quot; /&gt;&lt;/p&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.skycity11.xyz&quot;&gt;HOME&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>FPGA</category></item><item><title>图像处理基础</title><link>https://blog.skycity11.xyz/posts/2019-12-9-image/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/2019-12-9-image/</guid><pubDate>Mon, 09 Dec 2019 14:34:00 GMT</pubDate><content:encoded>&lt;p&gt;图像处理简介，为实现FPGA图像处理的运用&lt;/p&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;h2&gt;1 数字图像处理简介&lt;/h2&gt;
&lt;h3&gt;1.1 图像处理概念&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;图像采样
&lt;ul&gt;
&lt;li&gt;图像采样和量化：把连续的感知数据转换为数字形式，这个转换的过程被称为图像采样和量化。&lt;/li&gt;
&lt;li&gt;采样频率越高，得到的图像质量越高。&lt;/li&gt;
&lt;li&gt;Nyquist定理：图像的采样频率必须大于或等于源图像最高频率分量的2倍。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;图像量化
&lt;ul&gt;
&lt;li&gt;图像采样之后每一个点要使用多大范围的数值。&lt;/li&gt;
&lt;li&gt;若4位存储一个点，表示图像有16种颜色（2^4）。&lt;/li&gt;
&lt;li&gt;量化位数越大，表示图像可以拥有更多的颜色。&lt;/li&gt;
&lt;li&gt;8位：灰度图像，包含亮度信息。&lt;/li&gt;
&lt;li&gt;24位：真彩图像，包括RGB3通道。&lt;/li&gt;
&lt;li&gt;32位：在RGB基础上还包含了Alpha通道，用来表示图像的透明度。&lt;/li&gt;
&lt;li&gt;红外图像处理中，通常用14位。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;经过采样和量化之后，得到二维阵列f(x,y)，x∈[0,M-1],y∈[0,N-1]，M为图像宽度，N为图像高度。&lt;/li&gt;
&lt;li&gt;图像处理常用方法
&lt;ul&gt;
&lt;li&gt;图像变换：空间域——&amp;gt;变换域，如傅里叶变换、沃尔什变换、离散余弦变换、小波变换。&lt;/li&gt;
&lt;li&gt;图像编码压缩：以减少描述图像的数据量（比特数）。&lt;/li&gt;
&lt;li&gt;图像增强和复原：为了提高图像的质量。
&lt;ul&gt;
&lt;li&gt;图像增强：突出图像中感兴趣的部分。强化高频：轮廓清晰；强化低频：减少噪声。&lt;/li&gt;
&lt;li&gt;图像复原：先分析降质原因，建立降质模型，再通过滤波重建图像。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;图像分割：将图像中有意义的特征部分提取出来。&lt;/li&gt;
&lt;li&gt;图像描述：用几何模型描述图像。&lt;/li&gt;
&lt;li&gt;图像分类（识别）：图像经过某些预处理后，进行分割和特征提取，从而进行判决分类。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.2 图像系统构成&lt;/h3&gt;
&lt;p&gt;（1）图像处理器：负责采集光照信息。CCD/CMOS。&lt;/p&gt;
&lt;p&gt;（2）图像编码：对输出图像进行采样和量化。&lt;/p&gt;
&lt;p&gt;（3）图像处理器：核心。讲取样和量化结果作为数据源，对图像进行一系列的变换。PC/ARM/FPGA。&lt;/p&gt;
&lt;p&gt;（4）显示设备：对图像进行显示。&lt;/p&gt;
&lt;p&gt;（5）存储设备：对图像进行保存。&lt;/p&gt;
&lt;h3&gt;1.3 色彩空间&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;RGB:R红，G绿，B蓝。&lt;/li&gt;
&lt;li&gt;CMY(K):C青，M洋红，Y黄，（K黑）。&lt;/li&gt;
&lt;li&gt;HSI:H色调，S饱和，I亮度。&lt;/li&gt;
&lt;li&gt;YUV：Y明亮度，UV色度。&lt;/li&gt;
&lt;li&gt;YCbCr：Y亮度，Cb蓝色色度，Cr红色色度。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.4 图像处理流水线&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/skycity11/skycity11.github.io/raw/master/img/image/Pipeline.png&quot; alt=&quot;Pipeline&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;机械反馈控制：通过快门速度和光圈大小对过度曝光或者曝光不足的区域进行补偿。&lt;/li&gt;
&lt;li&gt;自动对焦：主动方法：红外线/超声波测距；被动算法：根据接收到的图像进行对焦决策。通过调整传感器的自动增益控制（AGC）电路，对自动曝光进行控制。&lt;/li&gt;
&lt;li&gt;预处理：传感器的输出需要通过伽马校正才能用于显示。最常用的是中值滤波。&lt;/li&gt;
&lt;li&gt;滤波图像补偿：为了纠正失真，运用数学变换处理图像。&lt;/li&gt;
&lt;li&gt;白平衡：将图像映射为“与光照无关”再输出。自动白平衡(AWB)。&lt;/li&gt;
&lt;li&gt;拜尔插值：
&lt;ul&gt;
&lt;li&gt;非自适应算法：双线性插值、双三次插值。在平滑区域内效果好。&lt;/li&gt;
&lt;li&gt;自适应算法：边缘指导重构。根据局部特征自动改变行为。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;色彩转换：插值后的RGB图像被转换到目标颜色空间。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.5 图像压缩与视频压缩&lt;/h3&gt;
&lt;p&gt;图片压缩：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JPEG：压缩比例为10×~20×。&lt;/li&gt;
&lt;li&gt;JPEG2000:JPEG延续，更好的压缩比。&lt;/li&gt;
&lt;li&gt;GIF：Graphics Interchange Format（图像互换格式）。&lt;/li&gt;
&lt;li&gt;PNG：Portable Network Graphic Format（可移植网络图形格式）。
视频压缩：&lt;/li&gt;
&lt;li&gt;H.261：第一个使用的数字视频压缩国际标准。鼻祖。&lt;/li&gt;
&lt;li&gt;MPEG-1：VCD光盘的技术核心。&lt;/li&gt;
&lt;li&gt;H.262：在DVD、SVCD使用。&lt;/li&gt;
&lt;li&gt;H.263：提高编码效率。&lt;/li&gt;
&lt;li&gt;MPEG-4：又称ASP。第一个含有交互性的动态图像标准。&lt;/li&gt;
&lt;li&gt;H.264：和MPEG-4是相同的标准。也称为AVC或JVT，目前主流视频压缩标准。&lt;/li&gt;
&lt;li&gt;H.265：提高压缩率，减少失真和码流，比H.264增加一倍的数据压缩比且具有更高的视频质量。&lt;/li&gt;
&lt;li&gt;AVS：Audio Video coding Standard(音视频编码标准)，中国制定。&lt;/li&gt;
&lt;li&gt;WMV：Windows Media Video。微软公司开发的视频编解码器。&lt;/li&gt;
&lt;li&gt;Real Video：Real Networks公司开发的视频编解码器。常见于网络在线播放。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.6 视频显示处理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;去隔行处理：NTSC刷新速率设定为30帧每秒。早期限制于速度，无法逐行扫描。故取出时，需要去隔行处理，讲奇数行和偶数行交支排列存储，而不是位于两个分离的视场缓冲区。方法包括行倍增、行平均、中值滤波、运动补偿。&lt;/li&gt;
&lt;li&gt;扫描速率转换：确保输入的帧速率与输出显示的刷新速率相匹配。&lt;/li&gt;
&lt;li&gt;色度采样：
&lt;ul&gt;
&lt;li&gt;色度下采样：视频标准和压缩算法大幅度缩减视频带宽。&lt;/li&gt;
&lt;li&gt;色度重采样：显示器接口所支持的颜色空间域与当前颜色空间域不匹配。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;缩放与剪切：
&lt;ul&gt;
&lt;li&gt;图像裁切：将每行/列的前/后若干个像素丢弃。&lt;/li&gt;
&lt;li&gt;增加或减少每行的像素数量：丢弃像素，抽样滤波（下采样）或者复制像素，插值（上采样）。&lt;/li&gt;
&lt;li&gt;增加或减少每帧的行数：垂直滤波。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其他显示处理：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alpha混合：将图像和视频缓冲区组合起来。组合起来之后，需要决定重叠的地方哪路流胜出。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.skycity11.xyz&quot;&gt;首页&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>FPGA</category></item><item><title>TFT控制器</title><link>https://blog.skycity11.xyz/posts/2019-11-23-tft/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/2019-11-23-tft/</guid><pubDate>Sat, 23 Nov 2019 09:31:00 GMT</pubDate><content:encoded>&lt;p&gt;编写TFT控制器来实现不同的显示输出。&lt;/p&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;h2&gt;1 TFT图片显示&lt;/h2&gt;
&lt;p&gt;将400&lt;em&gt;240分辨率的图片存储到ROM中，输出到800&lt;/em&gt;480分辨率的TFT显示屏上。
实现结果如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/skycity11/skycity11.github.io/raw/master/img/TFT/TFT_picture.jpg&quot; alt=&quot;TFT_picture_jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;工程文件在GitHub：&lt;a href=&quot;https://github.com/skycity11/TFT_picture&quot;&gt;TFT_picture&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;2 TFT字符动态显示&lt;/h2&gt;
&lt;p&gt;在TFT显示屏上实现中英文和数字的动态显示。
将字符(单个字符16*16像素)转换成图片，再输出到TFT显示屏上。
自定义10个ROM存储0~9的数字，从而实现任意输入数字显示。
对时钟分频，实现1s间隔的动态显示。&lt;/p&gt;
&lt;p&gt;工程文件在GitHub：&lt;a href=&quot;https://github.com/skycity11/TFT_char&quot;&gt;TFT_char&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;3 基于SDRAM的TFT显示&lt;/h2&gt;
&lt;p&gt;用SDRAM读写器16位RGB数据显示到TFT屏上，实现颜色动态变化。&lt;/p&gt;
&lt;p&gt;工程文件在GitHub：&lt;a href=&quot;https://github.com/skycity11/TFT_SDRAM&quot;&gt;TFT_SDRAM&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;4 基于AD7928的虚拟示波器设计&lt;/h2&gt;
&lt;p&gt;用SPI通信实现FPGA与AD7928的通信，并将adc获得的数字信号用TFT屏显示。
实现1MSPS的吞吐速率（SPS=Samples Per Second），12位位宽。
AD7928的SPI通信协议时序图如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/skycity11/skycity11.github.io/raw/master/img/TFT/Oscilloscope_time.png&quot; alt=&quot;Oscilloscope_time.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;系统整体框图如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/skycity11/skycity11.github.io/raw/master/img/TFT/Oscilloscope_rtl.png&quot; alt=&quot;Oscilloscope_rtl.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;工程文件在GitHub：&lt;a href=&quot;https://github.com/skycity11/Oscilloscope&quot;&gt;Oscilloscope&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.skycity11.xyz&quot;&gt;首页&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>FPGA</category></item><item><title>Vivado使用注意事项</title><link>https://blog.skycity11.xyz/posts/2019-11-19-vivado/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/2019-11-19-vivado/</guid><pubDate>Tue, 19 Nov 2019 15:44:00 GMT</pubDate><content:encoded>&lt;p&gt;总结一些使用Vivado时的注意事项，主要是与Quartus使用的区别&lt;/p&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;h2&gt;1 Reset信号的IO配置&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;always @(posedge clk or negedge rst_n)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是写Verilog时很常用的一个语句，但是在Vivado中这么写会在Generate Bitstream这一步中报错，如图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/skycity11/skycity11.github.io/raw/master/img/vivado/error.png&quot; alt=&quot;error&quot; /&gt;&lt;/p&gt;
&lt;p&gt;为了避免这个错误，需要在XDR中加一条:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets rst_n_IBUF] 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;原因是，从外部来的（接到板子上的）always语句中的敏感信号为时钟以外的外部信号，Vivado在处理外部时钟信号的时候会自动添加BUFG模块来去除时钟的抖动，但是其他信号（此处的rst_n）就不会这样做，这样的话在always语句的敏感信号列表中使用没有去抖动的外部信号就有可能导致系统不稳定，所以会出现这个错误。&lt;/p&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.skycity11.xyz&quot;&gt;首页&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>FPGA</category></item><item><title>Verilog书写</title><link>https://blog.skycity11.xyz/posts/2019-11-18-verilog/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/2019-11-18-verilog/</guid><pubDate>Mon, 18 Nov 2019 10:39:00 GMT</pubDate><content:encoded>&lt;p&gt;总结一些Verilog常用模块和语法。&lt;/p&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;h1&gt;1 verilog常用模块&lt;/h1&gt;
&lt;h2&gt;1.1 上升沿及下降沿检测&lt;/h2&gt;
&lt;p&gt;上升沿&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wire	variable_rise;
reg		variable_r1;
reg		variable_r2;

assign variable_rise = ~variable_r2 &amp;amp; variable_r1;	//检测上升沿

always @(posedge clk_50m or negedge rst_n) begin
	if(!rst_n) begin
		variable_r1 &amp;lt;= 1&apos;b1;
		variable_r2 &amp;lt;= 1&apos;b1;
	end
	else begin
		variable_r1 &amp;lt;= variable;
		variable_r2 &amp;lt;= variable_r1;
	end
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下降沿&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wire	variable_fall;
reg		variable_r1;
reg		variable_r2;

assign variable_fall = variable_r2 &amp;amp; ~variable_r1;	//检测下降沿

always @(posedge clk_50m or negedge rst_n) begin
	if(!rst_n) begin
		variable_r1 &amp;lt;= 1&apos;b0;
		variable_r2 &amp;lt;= 1&apos;b0;
	end
	else begin
		variable_r1 &amp;lt;= variable;
		variable_r2 &amp;lt;= variable_r1;
	end
end
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;1.2 跑马灯&lt;/h2&gt;
&lt;p&gt;参数N设定灯的个数，参数TIMEOUT设定亮灯时间间隔。&lt;/p&gt;
&lt;p&gt;如设定N为10，TIMEOUT为5M，系统时钟是DE1-SOC的50M时钟，则亮灯间隔是0.1s。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;module	led
#(	parameter N = 10,
	parameter TIMEOUT = 32&apos;d5_000_000)
 (	input								clk,
	input								rst_n,
	output	reg	[N-1 : 0]	led
);

reg	[31:0]	cnt;	//确定亮灯的时间间隔
always @(posedge clk or negedge rst_n) begin
	if(!rst_n)
		cnt &amp;lt;= &apos;h0;
	else if(cnt == TIMEOUT - 1&apos;b1)
		cnt &amp;lt;= &apos;h0;
	else
		cnt &amp;lt;= cnt + 1&apos;b1;
end

always @(posedge clk or negedge rst_n) begin
	if(!rst_n)
		led &amp;lt;= &apos;b1;
	else if(cnt == TIMEOUT - 1&apos;b1)
		if(led[N-1] == 1&apos;b1)
			led &amp;lt;= &apos;b1;
		else
			led &amp;lt;= led &amp;lt;&amp;lt; 1;
	else
		led &amp;lt;= led;
end

endmodule
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;1.3 4位转16位解码器&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;module	decoder_4_16(
	input					enable,
	input		[3:0]		in,
	output		[15:0]		out
);

	wire		[3:0]		high_d;
	wire		[3:0]		low_d;
	
	assign high_d[3] = ( in[3]) &amp;amp; ( in[2]) &amp;amp; enable;
	assign high_d[2] = ( in[3]) &amp;amp; (~in[2]) &amp;amp; enable;
	assign high_d[1] = (~in[3]) &amp;amp; ( in[2]) &amp;amp; enable;
	assign high_d[0] = (~in[3]) &amp;amp; (~in[2]) &amp;amp; enable;
	
	assign low_d[3]  = ( in[1]) &amp;amp; ( in[0]);
	assign low_d[2]  = ( in[1]) &amp;amp; (~in[0]);
	assign low_d[1]  = (~in[1]) &amp;amp; ( in[0]);
	assign low_d[0]  = (~in[1]) &amp;amp; (~in[0]);
	
	assign out[15] = high_d[3] &amp;amp; low_d[3];
	assign out[14] = high_d[3] &amp;amp; low_d[2];
	assign out[13] = high_d[3] &amp;amp; low_d[1];
	assign out[12] = high_d[3] &amp;amp; low_d[0];
	assign out[11] = high_d[2] &amp;amp; low_d[3];
	assign out[10] = high_d[2] &amp;amp; low_d[2];
	assign out[9]  = high_d[2] &amp;amp; low_d[1];
	assign out[8]  = high_d[2] &amp;amp; low_d[0];
	assign out[7]  = high_d[1] &amp;amp; low_d[3];
	assign out[6]  = high_d[1] &amp;amp; low_d[2];
	assign out[5]  = high_d[1] &amp;amp; low_d[1];
	assign out[4]  = high_d[1] &amp;amp; low_d[0];
	assign out[3]  = high_d[0] &amp;amp; low_d[3];
	assign out[2]  = high_d[0] &amp;amp; low_d[2];
	assign out[1]  = high_d[0] &amp;amp; low_d[1];
	assign out[0]  = high_d[0] &amp;amp; low_d[0];

endmodule
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.skycity11.xyz&quot;&gt;HOME&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>FPGA</category></item><item><title>Testbench书写</title><link>https://blog.skycity11.xyz/posts/2019-11-18-simulation/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/2019-11-18-simulation/</guid><pubDate>Mon, 18 Nov 2019 10:39:00 GMT</pubDate><content:encoded>&lt;p&gt;总结一些testbench常用模块和语法以及仿真时出现的问题。&lt;/p&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;h1&gt;1 testbench常用小模块&lt;/h1&gt;
&lt;h2&gt;1.1 时钟产生模块&lt;/h2&gt;
&lt;p&gt;产生50MHz时钟模块：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;`timescale 1ns/1ns
`define CLK50M_PERIOD 20
initial clk = 1&apos;b1;
always #(`CLK50M_PERIOD/2) clk = ~clk;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;2 testbench语法&lt;/h1&gt;
&lt;h2&gt;2.1 task语法&lt;/h2&gt;
&lt;p&gt;task表示任务，里面的语句顺序执行，写好之后直接调用即可,注意加括号，该语法可以起到精简代码的作用。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;initial begin
	rst_n = 0;
	#201;
	rst_n = 1;
	#20000;
	key_press();	//调用
	#20000;
end

reg key;
task key_press;		//定义
	begin
		key = 1;
		#200000;
		key = 0;
	end
endtask
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2.2 repeat语法&lt;/h2&gt;
&lt;p&gt;repeat表示重复，括号中为次数。
简单的重复10次的例子：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;repeat(10) begin
	key = 1;
	#200000;
	key = 0;
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;含敏感信号的例子：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;repeat(10) @(posedge clk) syn_rst = 1&apos;b0;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2.3 随机数$random(不可综合)&lt;/h2&gt;
&lt;p&gt;random函数仅用于测试验证，如果需要可综合的随机数，需要研究LSFR等随机数生成方法。
产生一个(-50,50)范围内的随机数：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;reg	[23:0]	rand;
rand = $random % 50
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;产生一个(min,max)范围内的随机数：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;reg [23:0]	rand;
rand = min + {$random} % (max - min + 1);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2.4 wait语法&lt;/h2&gt;
&lt;p&gt;等待key=1时往下执行。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wait(key == 1);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2.5 for语法&lt;/h2&gt;
&lt;p&gt;与C基本一致，注意不能i++，实例如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for(i=0;i&amp;lt;100;i=i+1) begin
	key = 1;
	#(i * 1000);
	key = 0;
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://vinericy.cn&quot;&gt;HOME&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>FPGA</category></item><item><title>任意奇数分频</title><link>https://blog.skycity11.xyz/posts/2019-11-17-divide-clock/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/2019-11-17-divide-clock/</guid><pubDate>Sun, 17 Nov 2019 05:37:36 GMT</pubDate><content:encoded>&lt;p&gt;对时钟信号进行任意奇数分频，并仿真实现分频信号。&lt;/p&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;h1&gt;1 三分频&lt;/h1&gt;
&lt;h2&gt;1.1 三分频时序&lt;/h2&gt;
&lt;h3&gt;首先来讲三分频电路逻辑，如何实现占空比为50%的三分频，也是硬件逻辑笔试题中常提的问题。其实三分频电路有很多种方法，这里选用其中一种：&lt;/h3&gt;
&lt;h3&gt;先对时钟信号进行上升沿和下降沿触发的两个模三计数，当计数器计数到0和1时进行两次翻转，从而求出两个占空比为1/3的频率波形，分别为上升沿触发和下降沿触发，再将两个信号波形进行或运算。时序图如下：&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/skycity11/skycity11.github.io/raw/master/img/1/shixu.png&quot; alt=&quot;Aaron Swartz&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;1.2 三分频代码&lt;/h2&gt;
&lt;h3&gt;对上升沿和下降沿分别进行模三计数&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;reg	[15:0]	cnt_pos;    //上升沿计数
always@(posedge clk_in or negedge rst_n) begin
	if(!rst_n)
		cnt_pos &amp;lt;= 1&apos;b0;
	else if(cnt_pos == 0)
		cnt_pos &amp;lt;= 1&apos;b0;
	else
		cnt_pos &amp;lt;= cnt_pos + 1&apos;b1;
end
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;reg	[15:0]	cnt_neg;    //下降沿计数
always@(negedge clk_in or negedge rst_n) begin
	if(!rst_n)
		cnt_neg &amp;lt;= 1&apos;b0;
	else if(cnt_neg == (DIV - 1&apos;b1))
		cnt_neg &amp;lt;= 1&apos;b0;
	else
		cnt_neg &amp;lt;= cnt_neg + 1&apos;b1;
end
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;当计数器计数到0和1时进行两次翻转&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;reg	clk_pos;    //  上升沿触发时钟
always@(posedge clk_in or negedge rst_n) begin
	if(!rst_n)
		clk_pos &amp;lt;= 1&apos;b1;
	else if(cnt_pos == 0)
		clk_pos &amp;lt;= 1&apos;b0;
	else if(cnt_pos == 1&apos;b0)
		clk_pos &amp;lt;= 1&apos;b1;
	else
		clk_pos &amp;lt;= clk_pos;
end
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;reg	clk_neg;
always@(negedge clk_in or negedge rst_n) begin
	if(!rst_n)
		clk_neg &amp;lt;= 1&apos;b1;
	else if(cnt_neg == ((DIV - 1&apos;b1)/2))
		clk_neg &amp;lt;= 1&apos;b0;
	else if(cnt_neg == 1&apos;b0)
		clk_neg &amp;lt;= 1&apos;b1;
	else
		clk_neg &amp;lt;= clk_neg;
end
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;将两个信号波形进行或运算&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;assign	clk_out = clk_pos | clk_neg;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;1.3 三分频仿真实现&lt;/h2&gt;
&lt;h3&gt;用modelsim对逻辑代码进行仿真，得到的仿真图如下：&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/skycity11/skycity11.github.io/raw/master/img/1/div_3.png&quot; alt=&quot;Aaron Swartz&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;2 任意奇数分频&lt;/h1&gt;
&lt;h2&gt;2.1 任意奇数分频逻辑&lt;/h2&gt;
&lt;h3&gt;任意奇数分频只要在三分频的基础上进行修改即可，比如进行N分频，就让计数器进行模N计数，然后在计数到0和(N-1)/2的时候翻转，其余不变。&lt;/h3&gt;
&lt;h2&gt;2.2 任意奇数分频代码&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;module	divide_N
#(parameter DIV = 7)
(		input		clk_in,
		input		rst_n,
		output	clk_out
);

reg	clk_pos;
reg	clk_neg;

reg	[15:0]	cnt_pos;
reg	[15:0]	cnt_neg;

always@(posedge clk_in or negedge rst_n) begin
	if(!rst_n)
		cnt_pos &amp;lt;= 1&apos;b0;
	else if(cnt_pos == (DIV - 1&apos;b1))
		cnt_pos &amp;lt;= 1&apos;b0;
	else
		cnt_pos &amp;lt;= cnt_pos + 1&apos;b1;
end

always@(posedge clk_in or negedge rst_n) begin
	if(!rst_n)
		clk_pos &amp;lt;= 1&apos;b1;
	else if(cnt_pos == ((DIV - 1&apos;b1)/2))
		clk_pos &amp;lt;= 1&apos;b0;
	else if(cnt_pos == 1&apos;b0)
		clk_pos &amp;lt;= 1&apos;b1;
	else
		clk_pos &amp;lt;= clk_pos;
end

always@(negedge clk_in or negedge rst_n) begin
	if(!rst_n)
		cnt_neg &amp;lt;= 1&apos;b0;
	else if(cnt_neg == (DIV - 1&apos;b1))
		cnt_neg &amp;lt;= 1&apos;b0;
	else
		cnt_neg &amp;lt;= cnt_neg + 1&apos;b1;
end

always@(negedge clk_in or negedge rst_n) begin
	if(!rst_n)
		clk_neg &amp;lt;= 1&apos;b1;
	else if(cnt_neg == ((DIV - 1&apos;b1)/2))
		clk_neg &amp;lt;= 1&apos;b0;
	else if(cnt_neg == 1&apos;b0)
		clk_neg &amp;lt;= 1&apos;b1;
	else
		clk_neg &amp;lt;= clk_neg;
end

assign	clk_out = clk_pos | clk_neg;

endmodule
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2.3 任意奇数分频测试模块代码&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;`timescale 1ns/1ns
`define CLK50M_PERIOD 20

module	divide_N_tb;
	reg	clk;
	reg	rst_n;
	wire	clk_out;
	
parameter	DIV = 7;
initial clk = 1&apos;b1;
always #(`CLK50M_PERIOD/2) clk = ~clk;

initial begin
	rst_n = 0;
	#(`CLK50M_PERIOD * 20 + 1)
	rst_n = 1;
	
	#5000;
	$stop;
end

divide_N
#(	.DIV(DIV)
	)divide_N
(	.clk_in(clk),
	.rst_n(rst_n),
	.clk_out(clk_out)
);

endmodule
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2.4 任意奇数分频仿真实现&lt;/h2&gt;
&lt;h3&gt;以7分频为例:&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/skycity11/skycity11.github.io/raw/master/img/1/div_7.png&quot; alt=&quot;Aaron Swartz&quot; /&gt;&lt;/p&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://vinericy.cn&quot;&gt;HOME&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>FPGA</category></item><item><title>Peter John Landin</title><link>https://blog.skycity11.xyz/posts/cs_idols/2019-09-13-peter-john-landin/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/cs_idols/2019-09-13-peter-john-landin/</guid><description>「计算机科学偶像」- 彼得·约翰·兰丁</description><pubDate>Fri, 13 Sep 2019 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Peter_Landin&quot;&gt;wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zh.wikipedia.org/wiki/%E5%BD%BC%E5%BE%97%C2%B7%E5%85%B0%E4%B8%81&quot;&gt;维基&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;I was long curious about how does λ calculus become the foundation of formalizaing programming languages. It&apos;s strange that I haven&apos;t look up the answer until today: It&apos;s invented so early by Alonzo Church (whom I will write another post for) as an alternative mathematic foundation in 1930s and its relation with programming language was re-discoverred in 1960s.&lt;/p&gt;
&lt;p&gt;From the &quot;Lambda calculus and programming languages&quot; section of wikipedia page:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As pointed out by Peter Landin&apos;s 1965 paper &quot;A Correspondence between ALGOL 60 and Church&apos;s Lambda-notation&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I found this name quite familiar since I read his paper &quot;The mechanical evaluation of expressions&quot; before, in which he introduced the first abstract machine for functional programming language, namely &lt;a href=&quot;https://en.wikipedia.org/wiki/SECD_machine&quot;&gt;SECD machine&lt;/a&gt;. This paper also define the term &lt;a href=&quot;https://en.wikipedia.org/wiki/Closure_(computer_programming)&quot;&gt;Closure&lt;/a&gt; which becomes a prevalent notion in computer programming nowadays.&lt;/p&gt;
&lt;p&gt;Besides of that, his contributions also include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;on ALGO definition&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/ISWIM&quot;&gt;ISWIM&lt;/a&gt; programming language&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Off-side_rule&quot;&gt;off-side rule&lt;/a&gt;, known as &quot;indentation-based&quot; syntax nowadays, popularized by Miranda, Haskell, Python, etc.&lt;/li&gt;
&lt;li&gt;coin the term &lt;a href=&quot;https://en.wikipedia.org/wiki/Syntactic_sugar&quot;&gt;syntactic sugar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;He was much influenced by a study of McCarthy&apos;s LISP and taught &lt;a href=&quot;https://en.wikipedia.org/wiki/Tony_Hoare&quot;&gt;Tony Hoare&lt;/a&gt; ALGO with Peter Naur and Edsger W. Dijkstra. (Oh yes, definitely 4 more people to write).&lt;/p&gt;
&lt;p&gt;I have just download his old, influential paper &quot;The next 700 programming languages&quot;.
I am sure it will be an enjoyable read.&lt;/p&gt;
</content:encoded><category>CS Idols</category></item><item><title>FPGA笔试题汇总</title><link>https://blog.skycity11.xyz/posts/2020-1-5-fpga-test/</link><guid isPermaLink="true">https://blog.skycity11.xyz/posts/2020-1-5-fpga-test/</guid><pubDate>Sat, 05 Jan 2019 12:55:00 GMT</pubDate><content:encoded>&lt;p&gt;一些公司笔试题的罗列&lt;/p&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;h2&gt;1 AMD 2008&lt;/h2&gt;
&lt;h3&gt;Q: Write a sequece of 3-bit grey code. Can you derive a general equation to convert binary to grey code?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h3&gt;[题目分析]&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;编写一个3位格雷码序列。 您可以导出将二进制转换为格雷码的一般方程吗？&lt;/li&gt;
&lt;li&gt;格雷码
&lt;ul&gt;
&lt;li&gt;用途：跨时钟域的计数器设计（FIFO读写地址）&lt;/li&gt;
&lt;li&gt;好处：每次只变1bit,因此检测到边缘的时候不会判断出错，只会往返一拍。&lt;/li&gt;
&lt;li&gt;格雷码与二进制码对应关系：
&lt;ul&gt;
&lt;li&gt;某二进制数为 B(n-1)B(n-2)...B2B1B0&lt;/li&gt;
&lt;li&gt;对应格雷码为 G(n-1)G(n-2)...G2G1G0&lt;/li&gt;
&lt;li&gt;最高位保留—— G(n-1) = B(n-1)&lt;/li&gt;
&lt;li&gt;其他各位  —— G(i) = B(i+1) 异或 B(i)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/skycity11/skycity11.github.io/raw/master/img/FPGA_test/grey_code.png&quot; alt=&quot;grey_code&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;A: 4位二进制转为格雷码的实现代码如下&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;assign dout[3] = din[3];
assign dout[2] = din[3] ^ din[2];
assign dout[1] = din[2] ^ din[1];
assign dout[0] = din[1] ^ din[0];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;—————————————————————————————————————&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.skycity11.xyz&quot;&gt;HOME&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>FPGA</category></item></channel></rss>