大灰狼 发表于 2023-8-15 00:46:13

【实验箱已发出】【越是向往高处的阳光,根就越要伸向黑暗的地底】

本帖最后由 国学芯用 于 2023-8-17 15:36 编辑

一、我的青春——STC89C516
      在上大一的时候,从学长口中了解到单片机这种神奇的芯片,最后下定决心买了一套STC单片机开发板,花费160大洋,对于从贫困农村走出来的我而言,这绝对是一笔巨款。如今回首,感谢当初的自己,如果上天再给我一次选择的机会,即使1600大洋也要买。从这片单片机开始,经过电赛的洗礼,我逐渐将C语言、数电、模电、电力电子等课程融会贯通,虽不敢说精通,但在同学之中已是遥遥领先,更是得到了老师的认可,成为老师的实验室管家,得到了更多的实验资源。
二、浮躁的内心——向往高处的阳光
      初学STC51单片机时和大多数人一样,选择了keil+C语言开发STC89C516单片机,但是这种传统的8051单片机引脚、功能、性能都有限,很难达到要求(对于今天的我而言,不是STC89C51不行,而是当初的自己不行)。为了轻轻松松地达到要求,我开始追求更多引脚、更多功能、更高主频的高级单片机。先后学习了MSP430、STM32库函数,此时的我纯靠死记硬背程序,然后排列组合,也能轻而易举地实现各种功能。但是心里很悬,总感觉自己是在别人的基础上写程序,写程序更像是英文填空。
      直到学习了STC32寄存器开发,我顿时豁然开朗,原来我以前死记硬背的程序是这样的。。。又一次偶然的机会,我以极低的价格得到了一块IAP15W4K32S4最小系统板,这次我将尝试在只有技术手册作为参考资料的情况下开发一款从未接触过的单片机,因为理解了“所有对单片机的操作,都是对单片机寄存的操作”这句话的含义,再加上宏晶的技术手册清晰明了,所以我对IAP15W一见如故,基本不用学习,直接拿着技术手册从新建工程开始,每一个字符都是自己编写,毫无压力地完成要求。随着深入学习,令我震惊的是,IAP15W有仿真功能。对于有些要求必须使用STC89C51,程序有BUG时就移植到IAP15W上,经调试确定问题后,STC89C51同步修改。
      从此,我开始疯狂地学习各种各样的单片机,STC15,STC8,STC32(很遗憾,没有STC16),以及其他很多公司的单片机(在宏晶的地盘上,就不说了,哈哈)。当然,欲速则不达,我只会开发一些基本外设,对于USB、CAN等,反正我是学生,又用不着,以后再说。。。每开发一款单片机,我的成就感就+1,而且一律采用寄存器开发,有次遇到一款单片机,官方以及网上都只有库函数,遇到问题怎么办?先用库函数解决,然后抽丝剥茧,把库函数中的有效寄存器操作提取出来,我就偏爱寄存器,嘻嘻~。插个小故事:多年之后,有位老师见我这么喜欢寄存器,便告诫我:程序应当以可读性、可维护性、可移植性为先,至于效率,目前的单片性能都比较强,一般不考虑效率。虽然老师说的对,但是寄存器并不影响可读性、可维护性、可移植性呀。而且,打脸来的很快,在后续为这位老师做项目的过程中,由于成本问题,选择了一款性能一般的单片机,要在100us内运行两次FOC以及一些复杂的逻辑,得亏我用寄存器优化了大量代码,才勉强达到要求。那时我就在想我要是精通汇编多好,就可以完全胜任而不是勉强达到要求。
三、少年的悔悟——想学汇编
      我们学院是在大三学习8051单片机,由于老师是位老教授,因此沿用了汇编教学。而我在大三之前我已经能够驾驭很多高级单片机,所以我心里想:汇编又如何?在当时我看来,汇编不过是一种古老的语言,汇编与C语言就像中文与外语,只是用不同的语言表达相同的意思。直到后来一次和单片机老师对话的机会,老师问我:“用汇编有什么好处?”我答:“用汇编可以清除的知道单片机运行了什么指令,而C语言一行代码可能会被编译成多条指令,不知道单片机具体做了什么。”老师摇了摇头说:“汇编的好处不止这些,但是目前的很多单片机都比较强,汇编的应用越来越少。”此时我感觉老师像一位医术精湛的老中医面对后继无人时表现出了遗憾。

      汇编难吗?我感觉还好,因此我下定决心要学汇编,要继承老师的衣钵。但是,理想很美好,现实很残酷,要求不只是功能,还有开发时间,实在是没有时间用汇编开发。闲暇时会用汇编写几个小程序,但仅限于STC89C51单片机,而且都是一些毫无应用价值的、十分简单的小程序,汇编就逐渐离我越来越远了。但也并非毫无益处,再后来的高级单片应用中,我可以通过技术手册的汇编指令集与keil调试时的汇编窗口简单分析一些特殊语法的效果,例如判断内联函数是否内联,汇编便是最好的证明。

四、向黑暗的地底扎根——再学汇编
      看了陈教授的视频,感觉陈教授说的很对,如果代码是离职的老工程师用汇编写的怎么办?高级单片机的启动代码都是汇编写的,看不懂怎么办?更有甚者,有的单片机下载程序还需要烧写算法,不懂汇编,就只能用别人写好的文件。如今汇编应用的场景很少,能够学习汇编的机会更少,所以借此宏晶给予的机会,拾起大学丢掉的理想,耐心、踏实地学习汇编,至少要做到:能用C语言实现的功能,都得用汇编写一遍。


大灰狼 发表于 2023-8-15 23:31:48

本帖最后由 大灰狼 于 2023-8-15 23:56 编辑

2进制+STC-ISP编程,拒绝Keil
      STC-ISP大家都用过,在加载hex文件后程序文件程序窗口会出现一堆数据,这些数据便是单片机所能识别的二进制值数据(这些数据是16进制,而16进制是二进制的简写),那么这些数据与我们编写的程序有什么关系吗?当然有!!!现在让我我们分析一下其中的关系。

      汇编指令“MOV”、“JMP”等字符又叫做【助记符】,助记符这个名字很形象,也就是说:汇编指令其实只是帮助我们人类记忆的符号,那它帮助我们记忆什么呢? 我们人类既能识别字符又能识别二进制,单片机无法识别字符只能识别二进制数据,那么只能使用二进制编程喽?将一个数据放进累加器的二进制指令是0111_0100,但指令那么多,还都是0和1的排列组合,这谁记得住啊?可见,纯粹的二进制数据对于我们人类而言是枯燥无味、难以记忆的,所以有没有什么办法能够帮助我们记住这些二进制数据呢?当然有办法,我们可以使用已经存在的有意义的文字代替二进制数据,比如我们可以使用“MOV”(move)代替0111_0100,这样我们就能很容易记住将数据放进累加器的指令了,而编译器就是翻译器,将我们的“MOV”翻译成0111_0100。汇编指令与二进制指令是一一对应的关系,翻译器会绝对准确地将助记符翻译成二进制指令,不会多指令,也不会少指令,所以汇编编程就是二进制编程,助记符就是在帮助我们人类记忆二进制指令。
      为证明以上想法,进行如下实验:
         硬件:LED负极接在P2.0上,P2.0=0则LED亮。
         思路:P2.0支持位寻址,其地址为1010_0000(A0),将位寻址的位清零的指令为1100_0010(C2),因此只需要C2 A0即可点亮LED。
         操作:打开STC-TSP → 在【程序文件】窗口输入“C2 A0” → 【下载/编程】。
   现象:LED亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮啦!
      是的,点亮LED只需要2个字节的ROM,而C语言需要18个字节的ROM,代码减小,效率提升。点击【保存数据】,我们的二进制程序就可以保存啦。

      我的内心就像树一样,树越是向往高处的光亮它的根就越要向下、向泥土、向黑暗的深处。

DebugLab 发表于 2023-8-16 00:41:29

大灰狼 发表于 2023-8-15 23:31
2进制+STC-ISP编程,拒绝Keil
      STC-ISP大家都用过,在加载hex文件后程序文件程序窗口会出现一堆数据 ...

哈哈哈哈哈{:4_202:}

DebugLab 发表于 2023-8-16 00:45:02

后面加上02 00 00
写成
C2 A0 02 00 00
不然就跑飞了
233

DebugLab 发表于 2023-8-16 00:57:32

本帖最后由 DebugLab 于 2023-8-17 22:14 编辑

DebugLab 发表于 2023-8-16 00:45
后面加上02 00 00
写成
C2 A0 02 00 00

扇区擦除后一定是FF
根据MCS-51指令集
FF指令是
MOV Rn,A
Rn是位于RAM低128位中的寄存器,其中n可以是0~7中的任何一个,在此处n=7
A是累加器
点完灯了CPU会反复把累加器中的值写到R7寄存器
如果STCISP勾选了在程序区结束处添加参数,就会跑飞自动复位



神农鼎 发表于 2023-8-16 07:32:19

02H 00H 00H ; 是 LJMP 0000H

建议查下下面的二进制码
MOV IAP_CONTR, #00100000; 软件控制复位单元复位






神农鼎 发表于 2023-8-16 07:35:51

STC32G12K128, STC32G8K64的相关复位标志位和控制位












gentleman 发表于 2023-8-16 09:38:04

大灰狼 发表于 2023-8-15 23:31
2进制+STC-ISP编程,拒绝Keil
      STC-ISP大家都用过,在加载hex文件后程序文件程序窗口会出现一堆数据 ...

牛啊{:4_250:},不过没有启动引导代码,单片机为什么也能正常工作啊

月光如盐 发表于 2023-8-16 13:21:40

楼主对我们的免费公开课 认可/支持/给力,建议主动联系我们同事
=====提前获得 【免费+包邮送】的 STC32G12K128实验箱 或 STC8H8K64U实验箱
=====现在送的,都可以利用MCU自带的 硬件USB直接仿真,硬件USB直接下载

【免费+包邮】 送/申样/采购 可加 如下 QQ或微信联系
加STC华南区客服刘经理QQ: 3398500488 ;微信:18106296592要求 【免费+包邮】 送, 还免费教仿真
加STC华南区客服曹经理QQ:1933892258 ;微信:18106296595 要求 【免费+包邮】 送, 还免费教仿真
加STC华东区客服聂经理QQ:2593903262;微信:18106296598要求 【免费+包邮】 送, 还免费教仿真
加STC西北区客服孙经理QQ: 1347154513 ;微信:18106296593要求 【免费+包邮】 送, 还免费教仿真
加STC华北区客服石经理QQ: 1638975601 ;微信:19952583876要求 【免费+包邮】 送, 还免费教仿真
加STC华中区客服唐经理QQ:2571301708 ;微信:18106296589 要求 【免费+包邮】 送, 还免费教仿真
加STC东北区客服张经理QQ:3141888640 ;微信:19952583265   要求 【免费+包邮】 送, 还免费教仿真
加STC西南区客服张经理QQ:3141888640 ;微信:19952583265   要求 【免费+包邮】 送, 还免费教仿真
工作时间:8:30-12:00,13:00-17:30(周一 到 周五, 法定节假日除外)

【免费+包邮】 送/申样/采购传统电话热线:0513-55012928、0513-55012929、0513-55012966
工作时间:8:30-12:00,13:00-17:30(周一 到 周五, 法定节假日除外)

大灰狼 发表于 2023-8-16 21:43:51

DebugLab 发表于 2023-8-16 00:45
后面加上02 00 00
写成
C2 A0 02 00 00


哈哈哈哈,为了使代码最小,能删的都删了{:4_167:}
页: [1] 2
查看完整版本: 【实验箱已发出】【越是向往高处的阳光,根就越要伸向黑暗的地底】