自制单片机计划
背景
其实diy一个单片机已经想了很久了。还记得第一次接触单片机是中学玩arduino,那个时候觉得:这个挺nb,我将来也要做一个玩玩。
后来,自己买了洞洞板、直插元件,先在面包板上搭了一个简单的烧写电路,在avr 328p dip中烧了一个arduino的bootloader,顺便烧了一个blink(就是LED一闪一闪)作为测试。
当LED亮起的一刻,那是真的激动人心:在单片机最小系统上迈出了一大步。这可是从0到1的创举。
后来想想,光做成这样,烧一个blink也没啥意思,所以用arduino uno + nokia 5110 lcd + 蓝牙模块做了一个简单的备忘录,并且在洞洞板上焊了个原型。
可以通过手机端(通用的蓝牙调试工具)连接上,然后发送指令比如show helloworld,然后液晶屏上就会显示出来。不过也就止步于此了,没继续花时间。
等到了大学,看到有个智能车比赛,要求自己画PCB,想起来自己以前自制单片机的梦想,觉得这是个学以致用的好机会啊,既可以在比赛过程中实现自制单片机,又可以开车,比电赛什么的有意思多了(狗头),然后在学长的诱惑下,开始了硬件学习之旅。
经过了一段时间的学习,可以说略有小成吧,还和学长写了一点PCB设计简述。那么,是时候执行酝酿已久的自制单片机计划了。2020.11,开始。
原型选择
我第一个想到的单片机就是arduino。再具体一点,是nano, mini这样的小核心板,可以插在面包板上。我很喜欢小的电路板,做工精致,很有工艺美感。而大点的uno就没这种感觉。
考虑到贴片的焊接困难,我也曾考虑过一段时间像进口uno那样做成直插式,不过转念一想:这一步早晚要迈出去,为何不从现在开始?虽然实验室小了点,但是工具什么的应该是够的吧,怎么说条件也算不错了(比家里好太多,当时深挖软件,原因之一就是买不起硬件,还是软件学习成本低。不过接触ai之后发现,软件也能很烧钱,哭了)
不过,将来是要基于现在的单片机开发自己的小玩具的,那么对性能就有一定要求了。我发现,在我未来的计划中,328p这样的8位单片机似乎不能满足我的要求。
就在这时,我想起了之前看到的用stm32当成arduino用,这就激起了我的兴趣,stm32似乎是一个不错的选择。8位入门级当玩具,32位高性能战未来。
于是,我买了一个stm32f103c8t6最小核心板,然后成功地烧进去arduino写的blink。(此处省略踩坑步骤)
这样就显而易见了:我自制的核心板,应该以stm32f103c8t6为核心。毕竟,谁会跟高性能过不去呢(狗头)
确定了基本目标,那么就应该参考一下已有设计了。从很多地方比如电路城,51hei,立创硬件开源平台等等,下载了一堆别人的原理图和PCB文件作为参考。现在主流的手机接口都是typec,但是单片机竟然还保留着microusb。这接口哪有typec香啊,正反插都行,typec才是未来。等我后来在画板子的时候才发现,还是microusb好画好焊接。不过就当是焊着练手了。这里还要指出,卖的核心板的usb口纯属闹着玩啊,当时连上去之后以为和arduino一样可以下载程序(国产板是装ch340驱动),后来发现,还是得搞个usb-ttl下载工具,还要手动调整boot引脚、复位,真烦。
在查阅资料的过程中,还发现有很多人在用全志的f1c100s/f1c200s做,能跑linux,着实令我想了很久要不要中途改变计划。不过后来想想,做这种板子对工具要求就更高了,而且还得要四层板,打一次样就一百多,像现在这样一穷二白,还是先从相对简单的stm32板子开始积累经验比较好。
总结一下目标:做一个基于stm32f103c8t6核心+可以用usb下载程序并自动复位+体积小可以插在面包板上(注意引脚间距合适)的单片机核心板。
子产物:USB-TTL下载工具
虽然说没有usb-ttl(usb转串口)下载电路的核心板才是真正的核心板,但是我就觉得核心板应该提供一个除了用stlink/jlink之类的仿真器之外的基础usb下载功能。这样上手就可以用。对于习惯串口打印调试的我觉得这才是基本操作。之前试过vs的arduino插件调试确实也挺好用,也并非不能用usb调试。
总之,一个没有自带下载程序功能的核心板,不是一块好的核心板。(狗头)
但是我对于下载电路的成功与否并没有底,要是一口气做出单片机核心板,上机之后连都连不上,那谁知道是什么原因。实验室、家里都没有分析的工具,就一万用表。
那么将下载电路提取出来,做成USB-TTL下载工具是一个不错的想法。
元件我选择了国产经典方案:沁恒ch340g芯片(更加稳定,但需要加12MHz晶振,340c不用),然后接口由常见的usb-a(就是u盘口)换成了我想要的typec(手机口)-16pin。microusb是经典安卓手机口,但已经在逐渐被淘汰了。有一块typec口的单片机也是这次自制的原因之一,前文已经提到。
设计时,我参照收集到的原理图和手上的usb-ttl做了一份原理图和PCB设计文档。这里的坑主要集中在typec的原理图封装和带3d的PCB封装,这里感谢各位前辈的开源精神,让我翻开源PCB文档时找到了,模型是从国外模型网站上找的,正好契合。不过后来继续翻开源作品时发现了有完整的PCB封装,有点遗憾没能早点找到。
要是按照经典的typec usb2.0 d+d-两条差分线接法(在一列焊盘的左右两侧先分别连好d+d-焊盘)+经典的usb-ttl工具布局,你会发现这两条线应该是反过来的,否则必然相交。当时认为走线是万万不可在340下方走线的,所以只好在其中一条差分线上打了两个过孔,让它们反过来。虽然说违反了差分线规则,而且也没做阻抗匹配(看情况不做也行,就是信号干扰大,可能不稳定),但是也能用。
由于疏忽,到了样板寄过来手工焊接时才发现实验室没有22pF的电容。后来抱着试试看的心态连上电脑,发现居然也可以识别并烧写,说明晶振成功起振了。神奇。
自此,成功验证了ch340g的电路可行性。不过后来在核心板布局时发现还要额外带个晶振太大了,还是改成了ch340c。
单片机核心板元件选择
说是元件选择,但实际上真正能有自己选择的也没什么。仅有的选择就是电源方案:经典的1117-3.3v,RT-9193-33GB,和ME6209A33M3G。第二个是某宝核心板的搭配。第三个是开源方案中看到的。1117体积太大,ME6209似乎也差不多,不过还是选择了最稳妥的RT-9193。RT和ME的芯片手册上参数类似,封装虽然不同但都同样小。留待以后去深入研究两者孰优孰劣。
子产物:国产芯片初步探索
不过在最后对着bom表买元件时发生了一点意外。由于不可抗力(疫情),芯片大幅涨价,stm32f103c8t6原装正版已经上升到了二十多块。它这一块芯片都能顶我几块板子。这对于将来量产(送人)都是极其不利的。所以寻找兼容的廉价替代品成为了一个分支任务。
经过查询,发现有中科芯CKS,GD,APM,还有未曾被人所知,却成为了16届智能车比赛的国产支持商:沁恒。之前说的ch340就是它家的产品。
虽然说它提供的是基于risc-v架构的ch32v103系列,但是我无意间发现它竟然还有另一个arm架构的通用微处理器:ch32f103。详细资料可以去它家官网查查。它基本兼容stm32f103。
我是真心觉得这个公司的人才实在nb。通过赞助一个大学生比赛,让沁恒这个名字和国际知名公司恩智浦、英飞凌排在一起,又走近了未来的工程师人才,还用大学生这一免费劳动力给它开发资源尚未完全成熟的芯片做研究。要是我现在有家公司,说什么也得把提出这个建议的人才挖过来(狗头)。要不是它赞助了这个比赛,我还真不一定查到它有stm32替代品,即使我用了它的ch340。不过在其他地方的营销可谓是差强人意,如果说能换一个更好的管理人才,在支持国产芯片的大背景下分一块大蛋糕还是很有希望的。还有吐槽一下它的产品命名,是一串连续递增的数字(看官网上的产品表),让人不明所以。
去某宝上想看看有没有搭载的板子,但是没有,却发现了基于stm32f103c8t6核心板的ch32f103c8t6版本(只换了芯片)。对国产芯片的好奇心促使我下单,运费不免,单片机本身8块还行。到货后,我分别用stlink和usb-ttl测试了一下烧录它提供的blink示例和stm32的blink都可以,其他外设估计大部分兼容没问题。目前发现的问题是它烧录后的程序没办法自动执行,正常的stm32通过stlink或usb串口烧录后能够立刻执行程序,它就不一样了,按了复位键没用,必须要手动断电,恢复boot引脚设置后通电重启(按复位没用)才会执行之前烧录的程序,就很麻烦,也不知道问题出在哪。不过有个好处是它有一个读保护功能,stm32就没有。
这张表是官方人士发的。也别问我16位编程是什么意思。我还查了一下,说是定时器设计成16位的。
还有看起来貌似内置了usb通讯,但是不知道怎么用。
还有一份长达200多页的ch32f103和ch32v103的对比表,就请读者自行查找吧。可以问问客服。
第一次尝试总结
看到标题各位就能明白为什么叫第一次尝试了。说明没有做到一次即成,难受
这次是直接在pcb板上涂焊膏,然后用热风枪加热直到融化。由于是第一次做这个,刚开始不知道加多少量。结果一开始加的时候就加多了,产生连锡。
手边没有吸锡线(不知道为什么实验室没有这种基础装备),用电烙铁慢慢磨估计都把接口背后的塑料壳给弄没了,而且还不一定成。于是我只好忍痛放弃第一块板。
在第二块板的时候进行的倒是顺利。然而接下来当我插上typec接口时,电脑弹出了无法识别的usb设备提示。
这就非常棘手。因为本人才学疏浅,不知道如何解决这一问题。也不要问示波器逻辑分析仪什么的,还不会用来排查错误。转念一想,干脆分步测试吧,先试试看ch340c能不能正常工作(前面设计用的是ch340g,区别在于g是工业级c是商业级,但内置晶振)
这次,串口成功识别出来了,但乐极生悲,当我把数据线拔下时,因为忘记焊typec接口反面四个脚了(划重点,读者千万不要忘记),然后把接口带着焊盘一起拔了下来。这次整个板又废了。虽然它走了,但它的牺牲无疑是有价值的,就是买的ch340c不是假货(x)
那么接下来,就是第三回合。
然而不出所料,又gg了。然而这次连带稳压输出都变得不正常。万用表显示是4点几。个人能想到的合理原因是被热风枪吹坏了。相较于第一块板,这块板算是真废了。
好的,我怀着平淡的心情,又焊完了第四块板子,不出所料,插上后弹出的又双叒是无法识别。这个时候我想起手边的stlink,决定死马当活马医,总不能浪费几块板啥都没有吧。
刷入arduino的stm32版blink的一瞬间,我的心情是平静的,没有一丝波澜。好在,它执行成功了。
总的来说,其实也没啥好说的,只能感慨一句真烧钱吧,那么就等重整旗鼓,开始第二次-re:dive(x)
(未完待续)