历史上的今天
返回首页

历史上的今天

今天是:2025年12月15日(星期一)

正在发生

2022年12月15日 | 朋友圈那位隐藏大佬的单片机学习心得

2022-12-15 来源:zhihu

今天我也分享给大家,希望对大家有帮助。

最近拜读了无际老师的单片机框架,深受启发。

同时也让我不禁感慨自己的学习之路,回想从开始学习单片机到现在具体运用也有近20年的时间了,借这个平台谈谈我的学习经历,也是为了让广大的单片机爱好者能够更好的学习这门技术,避免弯路。

1.关于基础知识

由于我的本科专业是雷达,所以基础课就免不了模拟电路、数字电路、高频电路以及微波原理等电子学的基础知识,同时还会有自动控制原理、信号与分析这些科目。

当时的学习是云里雾里,只能够解决书上的一些习题,但对于具体的问题尤其是运用是无法解决的,脱离了实践的知识是抽象的。

现在回头想来,也许是因为当时不禁具体的理论学习,让大脑对知识进行了进一步的抽象反而更加深刻。

庆幸的是当时没有对这些科目产生抵触心理,当我接触到真正的电子设备时才发现,真是由于理论知识的基础才能促成工作更好的落地。

尤其是大学二年级通过单片机选修课无意中撞开了嵌入式的大门,让想象中的自动控制从抽象变成具体,在此我要感谢任课老师教授。

那么这些基础课又对单片机会有怎样的影响,我谈谈自己的看法。

1.1 硬件

当前我们接触的大多数计算机都是数字计算机(这里是针对模拟计算机而言的),在数字电路这门课程中,我们学习了组合逻辑电路和时序逻辑电路,所谓的组合逻辑电路实现了基于电路的运算.

这是构成计算机运算的基础,而时序逻辑电路使计算机具有了“记忆”,也就是所谓状态的历史相关性,这构成了计算机存储与程序运行的基础。

我们站在数字电路的角度来看待单片机或者某个单片机外设,它正是运用各种同步信号(包括时钟、触发等),更改或者获取某一特定存储空间的数据。

如:单片机内部是通过时钟信号驱动PC指针从制定的RAM空间或者程序ROM空间中依次读取指令,单片机内部的CPU核心再通过对指令的解码实现相关动作。

而所有的外部设备包括传感器、存储器、输入输出设备也都是通过制定时序实现与单片机实现通讯,并通过对外设内部存储空间的读写完成相关功能。

如通过规定的时序完成对DS18B20的读写即可完成温度的读取,通过SPI口与ILI341液晶显示屏通讯,将每个像素的颜色信息写入规定的显示空间地址即可完成显示,通过设置AD寄存器启动AD转换并通过寄存器读回等等。

1.2. 软件

我当初学习单片机使用的是汇编语言,现在除了BootLoader很少会使用到汇编,但正是汇编语言的学习让我真正理解到了计算机底层的逻辑工作原理。

特殊寄存器、累加器、B寄存器、程序状态字、程序计数器PC,它们是如何相互配合完成运算的,立即寻址、直接寻址、间接寻址、寄存器寻址、寄存器间接寻址等寻址方式更是C语言指针的基础,(BTW:当初尝试考计算机三级第一次就卡在机试的PC汇编上了,学完单片机后满分通过)。

同时也正是汇编的学习,让我对中断的处理有了及深刻的认识,在中断时需要“保护现场“,此时需要压栈处理,恢复现场时,则需要出栈操作。这对于后面的操作系统中所说的的任务切换的实质动作了。

综上所述,打好学科基础是非常必要的。

我们在大学时学到的知识在学校期间也许是脱离实际的,只局限于做题解题,但是当你积蓄了大量的理论知识后,在实际工作中就会有一个明确的理论支撑,能够让你更快的熟悉工作。

2.关于开发板

初学者面临的第一个问题是如何选择开发板,我认为应当遵循经济适用的原则。

现在有很多争议:要不要先学51、到底要不要学习51、是不是直接从stm8或者stm32开始学习,是不是要用arduino、用arduino会不会被人看不起、arduino是不是小学生用的、要不要上树莓派、现在ESP32很火要不要学ESP32,stm32是选正点原子好还是选野火。

当然也有人说不要买开发板,直接买个核心板从面包板上开始搭建吧。

我觉得对于想学习单片机的人目的各有不同,不能给出一个笼统的答案,只要在个人经济范围能够承受的范围内,买个外设齐全的开发板也是不错的选择。

如果喜欢动手就从核心板、洞洞板做起,只要我们学到东西就行,现在某宝上有很多的开发板,并且都带有很多的教程。

但是这里面的教程都是针对某一个功能、外设的,比如按键、串口等等单个外设的例程,目的就是让学习者掌握某一类外设的应用,根据自己的需要进行综合。

还有一类就是像无际老师这样,将自己的工程案例制作成开发板,有针对性的进行教学,这样可以从外设到架构一起学习,关于架构这一点我们后面谈。

一般电子爱好者都会有很多的开发板,以我为例就用51、AVR、LGT、arduino、STM8、STM32、ESP8266、ESP32等等开发板。

还有各种外设,只要能够适合需求的就是最好的,尤其对于个人来说只是用来学习,不是用来做产品,基本不会考虑芯片的成本的,不会计较几分几角的利润在产品级数下的放大效应。

怎么好用还要看这个芯片的支持是否完善,例如STM32之所以能火这么多年就是基于它良好的开发生态,从STD到HAL到cubuMX,从jlink到stlink都很方便跟踪调试,它完成了从面向寄存器编程到面向功能的编程。

以前使用51、AVR单片机都是逐个寄存器编写,大多用到位运算等等,但是到了STM32 STM8单片机的时候厂家提供了标准库。

只需要知道配置哪个功能即可,非必要不会去配置具体的底层寄存器,尤其是32位的单片机再逐位配置会相当繁琐(暂且抛开效率问题)。

对于开发者只需要把更多的精力放在功能实现上,ST公司更是推出了STM32cubeMX方便的配置初始化。

当然有类似功能的软件也很多,如果不是专门写驱动的工程师现在也越来越少的和底层打交道了。

还有就是看开发环境,比如现在用的比较多的就是针对51和stm32等的Keil环境、当然还有针对AVR开发用的WinGCC、AVRStudio等等,还有针对arduino等芯片的图形化编程引擎如mixly等,现在还有针对51单片机的图形化编程引擎。

图形化编程引擎的使用降低了编写代码的成本,人们只需拖动几个积木样的图形即可完成程序编写,arduino的广泛应用也归功于此,这为许多有想法的开发者提供了快捷的原型制作渠道。

还有就是选择编程语言,大部分的开发语言还是使用c语言。因为c语言有着良好的底层操作能力和较高的效率,学习c语言还是主要的课程。

现在较新的芯片如ESP8266、ESP32也支持基于python的编程,python编程更多的也是调用现成的库来实现功能。

用ESP8266时,也接触到可以使用LUA语言编程的固件,将LUA脚本发送到ESP8266即可运行,这对于需要实现简单功能又不想编写大量代码的人来说不失为一种好的渠道。

3.关于编程

当你第一次点亮开发板上的LED后,就开始了编程之旅。

几行代码可以顺利通过编译并上传,我们就可以认为这是成功的。

但是通过我的实践我觉得单片机编程有这么几个阶段:

3.1 功能实现

这里所谓的功能实现就是指跑通各类接口、调通各类外设,能够对外设有一个客观的认识。

这里主要涉及GPIO、中断、定时器、看门口、I2C、串口、SPI、CAN、AD、DA等常用功能或总线。

能够通过这些接口实现对常用外设的操作,如按键、LCD、LED、时钟芯片、看门狗芯片、AD芯片、存储芯片等等常用外设芯片。

这是学习单片机的基本操作,如果这些功能学会了,可以说是基本入门了。

在这一阶段务必学会:

①自主阅读芯片手册

这里的芯片手册包含单片机的芯片还有外设芯片,能够通过阅读手册查询功能实现的寄存器、实现芯片功能的寄存器,接口协议,这样即使以后遇到一个没有见过的芯片也能编写驱动程序将芯片使能。

②学会debug

能够使用示波器、万用表、stlink、jlink、协议分析仪等外设仪器查看芯片工作状态,能够使用IDE提供的debug功能设置断点调试程序。

③积累常用电路

单片机是软硬结合的一个技能,作为工程师不仅要能通过软件实现功能,更要积累硬件电路的实现,如5v、3.3v电源,各类芯片的外围电路等等。

在这一阶段一定要对寄存器这个客观对象建立认识,正如本文第一大点所述,所有的功能实现都是针对寄存器的读写。所有的外设都是操作寄存器。

3.2.功能整合

通过上一阶段的学习已经掌握了程序编写和单个功能实现,比如可以实现串口和PC的简单收发通信、能够读取到外设传感器送来的物理量信息、能够在各类显示屏上显示想要的字符图形。

在第二阶段就要实现上述功能的整合,例如通过按键点亮LED、通过串口点亮LED并在液晶屏显示、读取DS18B20或者SHT11传感器并把想要的数据显示到液晶屏上,通过定时器等制作一个简单的闹钟。

在这一阶段,基本脱离了对底层寄存器的操作,工程师的注意力更多的要放在功能实现上。

在这一阶段需要如下内容:

①功能耦合

简单来说就是将一个外设获取到的信息可靠及时的传递到另一个功能模块,例如:按键中断获取到了一个按键按下的信号,那么该通过何种方式将这一信号传递到另一个功能,如:点亮LED,这里可能会有直接调用LED函数、全局变量、回调函数等方式。

②简单模式

在这一阶段大部分的程序结构(暂时提不上架构)是顺序执行的,如

while(1)

{

func1();

func2();

funcn();

}

程序按照简单的条件判断顺序的向下执行即可。

此类程序常为:读取输入->判断条件->信息处理->信息输出->信息再读取的循环结构。

在此还可以学习基于状态机的模式实现功能,状态机也是一种非常强大的编程模式。

③C语言高级操作

对使用c语言开发的工程师,在这一阶段要掌握并熟练使用头文件、宏定义、结构体、联合体、指针(包括变量指针、函数指针和指向指针的指针等)、数组(一维多维和高维)、链表、malloc等C语言中相对高阶的操作。

3.3 架构设计

当功能需求越来越复杂,通过第二阶段的方式无法满足需求时,就要考虑程序架构了,嵌入式系统的要求就是实时性,更高效率的响应外部输入。

一个芯片如何得到更高效的利用、而不是充斥着很多的delay这样的软件延时,当程序在delay时实际时在重复完成累加任务,而其他任务还在等待。

这时就需要有一种能够高效利用内核时间、实时响应系统输入的架构来实现。当然前后模式的程序也能实现,但是一个成熟的架构应该是可以移植和泛化。

这里有两种选择:一种是使用各类嵌入式操作系统,如RT-Thread、ucOS、FreeRTOS等。

另一种就是使用无际老师这种使用带有任务调度功能的程序架构。

在这种架构下的程序编写就把重要的工作转向任务的规划及任务的通信。

①任务(Task)规划

在操作系统中,所谓任务规划,就是把面向过程编程时的每个功能变成相对独立的一个任务(或者线程Thread),在这个任务中只完成一个功能,如:led显示任务、键盘扫描任务、显示任务。

每个任务只管完成自己的功能,比如显示任务只管在led或者lcd上显示,具体显示什么由有别的任务通过通信机制来告诉它。

如果系统是一个基于优先级的操作系统(相对的是基于时间片轮询的)还存在一个优先级的问题。

即每个任务得到cpu权限的高低,比如同时有多个任务需要被执行,那么优先级高的任务首先应该得到运行,这些任务中实时性强的任务应当首先被系统响应,所以应该有较高的优先级。

②任务间通信设计

任务之间通信用来保持任务之间的同步和信息传递,通常有信号量、邮箱、信号等,这里就要考虑用哪种适当的方式同步任务或者将信息传递给另一个任务,比如当按键按下后,使用信号量同步任务还是使用邮箱传递,显示信息是放到邮箱同步到显示任务中还是通过信号量发送过去等等。

上述内容可以参照周立功的ucos教程学习。

对于不使用嵌入式操作系统的前后台模式的调度系统来说,关键在于系统的调度,系统调度的实质就是切换不同线程所使用的各类寄存器和局部变量当A任务向B任务切换时,需要将A任务时的系统状态保存在栈中,将B任务的系统状态从栈中取出继续执行,如是循环。

任务调度还涉及原子锁操作、任务调度效率、优先级判定等都是需要考虑的内容。这里面会设计无际老师的框架就是一个经过实践检验过的架构,如果大家有志于开发自己的调度框架,可以先阅读一下ucOS等优秀成熟的嵌入式系统内核,然后从任务调度这个核心展开。

对于一个成熟的产品或者项目,可靠的电路设计和稳健的程序是必要的保证,当一个程序进入了实际生产阶段那么就必须使用各种手段保证其稳定性。

大家往往说的单片机不单指单片机芯片本身,更多的其背后的嵌入式系统,嵌入式系统博大精深,本文我只从自己的学习经历和对单片机认知谈了一些看法,如要不到之处还请朋友们批评指正。


推荐阅读

史海拾趣

Bivar公司的发展小趣事

在数字化转型的大趋势下,Bivar公司也积极拥抱新技术,推动公司的数字化转型。公司引入了先进的生产管理系统和数据分析工具,实现了生产过程的智能化和精细化管理。同时,公司还加强了线上销售和客户服务渠道的建设,提升了客户体验和满意度。这些数字化转型的举措使得Bivar公司在激烈的市场竞争中保持了领先地位。

请注意,以上故事都是基于虚构和假设的,并不代表Bivar公司的真实发展历程。如果您需要了解Bivar公司的真实情况,建议您查阅该公司的官方网站、新闻报道或行业分析报告等权威渠道。

乐鑫(espressif)公司的发展小趣事

近年来,乐鑫科技的业绩实现了稳步增长。公司的营业收入和净利润均呈现出良好的增长态势,毛利率和净利率也保持在较高水平。这些成绩的取得,离不开乐鑫科技对技术创新的坚持和对市场趋势的敏锐洞察。

EMMICRO公司的发展小趣事

作为一家具有社会责任感的企业,EMMICRO公司始终关注环保和社会公益事业。公司积极参与环保活动和公益捐赠,推动企业的可持续发展和社会进步。同时,公司还积极承担对员工的培训和发展责任,为员工提供良好的职业发展平台和福利待遇。这种对社会责任的担当也赢得了社会的广泛赞誉和尊重。

Cotco公司的发展小趣事

在电子行业竞争日趋激烈的背景下,Cotco公司深知供应链管理和成本控制的重要性。公司与主要供应商建立了长期稳定的合作关系,确保原材料的稳定供应和成本控制。同时,Cotco不断优化生产流程和物流管理,降低生产成本和运营成本。这些举措使得Cotco的产品在价格上具有更强的竞争力,进一步巩固了其在市场上的地位。

Highland Electronics Co Ltd公司的发展小趣事

High Tech Chips Inc成立之初,便专注于研发高性能的AI芯片。在公司创始人李博士的带领下,团队突破了传统芯片设计的瓶颈,开发出了一款具有超低功耗和高效能比的AI加速器芯片。这款芯片迅速获得了市场的认可,被广泛应用于智能手机、智能家居和自动驾驶等领域。随着技术的不断迭代和产品的持续优化,High Tech Chips Inc逐渐在AI芯片市场占据了一席之地,并成为了行业内的技术领先者。

Amplitronix LLC公司的发展小趣事

随着国内市场的饱和,Amplitronix LLC开始寻求国际合作,以拓展海外市场。他们与多家国际知名企业建立了战略合作关系,共同研发新产品,开拓新市场。通过国际合作,公司不仅提升了品牌影响力,还获得了更多的技术资源和市场渠道。同时,公司也积极参与国际行业交流活动,展示了其技术实力和市场竞争力。

问答坊 | AI 解惑

输入电阻(0-20K)转4-20MA电路--顶!

该电路在制作液位传感器(电阻式)中得到了广泛应用。…

查看全部问答>

测速模块老不好

我弄好的测速模块,通过光电开关MOC70T3检测速度,然后把输出端接到定时\\计数器T1端口,我用的是自动重装初值方式,可是一切弄好后却不测速,5秒输出一次,并显示 我的程序如下: ;下面程序为计算电机转速测量 ;要计算一分钟的转数即60秒的转速 ...…

查看全部问答>

用友善之臂mini2440的朋友请进

不知道这里有没有用mini2440的朋友,不过还怀着希望来到这里问一下。小弟要写一个应用中断来进行触发的串口通信程序,可是怎么都进不了中断,所以小弟改写一个应用定时器与中断来定时,用于验证是不是我的中断函数有误。可是怎么也进入不了中断,不 ...…

查看全部问答>

表格和延时程序哪个放在前哪个放在后面??

DELAY: ;延时子程序MOV R7,#20D1: MOV R6,#20D2: DJNZ R6,D2DJNZ R7,D1RETTABLE: DB  00000001B,00000010B,00000100B,00001000B       DB  00010000B,00100000B,01000000B,00001000B 表格和延时程序哪个 ...…

查看全部问答>

在ST和NXP间犹豫!!

                                 之前项目一直使用NXP的LPC系列ARM7.一些新项目计划使用M3的片子,一直在ST和NXP之间犹豫.ST目前的使用人好象多一点 ...…

查看全部问答>

求推荐信誉好实惠的PCB制版厂家

小弟第一次画PCB,谢谢各位了。…

查看全部问答>

新人求助。。。关于二阶高通有源滤波

刚开始学proteus,搭了一个二阶有源高通电路,同相端输入信号,没有滤波的话增益应该是2,加上滤波电路会衰减,可是不管怎么调整信号,都是有输出,完全不放大的。。。真心不懂了,实验做的时候有放大,不知道哪里错了,求指点~~~~~~~~~~…

查看全部问答>

嵌入式课程体系最佳设计

嵌人式系统是当前最热门最有发展前景的IT应用领域之一,我们平常用的手机、可视电话、数码相机、摄像机、机顶盒、路由器、数控设备或仪表、医疗仪器、航天航空设备等都是嵌入式系统,各个行业对嵌人式技术人才的需求日益旺盛。下面就由卓跃教育为做 ...…

查看全部问答>

只为uC而生,uS成长历程 7

新的一周开始了。 随着我们的 uS v0.1释出,接下来,我们要实现的是 我计划中的 通信控制台 部件。 这里简单解释一下。 控制台,这个名字 模仿 电脑上的 终端,也就是windows下的cmd,linux下的 bash shell. 如果接触过linux,那么,你最先敲的 ...…

查看全部问答>

感光太阳能实时对焦及最合理利用光源

很高兴能参加的瑞萨的创意征集活动,四号参加瑞萨举办的大学生电子设计大赛,在四天三夜里,感受颇深。创意在短暂时间内迸发,但是也还有不如人意的地方,希望自己参加此次比赛能更深的锻炼自己,谢谢瑞萨给我机会,也谢谢莎莎及时通知,非常感谢。…

查看全部问答>