赞
踩
STM32入门100步 - 第8期
编程语言介绍
杜洋 洋桃电子
上一期我们在电脑上安装好了KEIL软件,也新建了工程,在工程中安装了固件库。准备工作完成后,接着就是在工程中编写程序了。只有程序使ARM内核有规律的工作,才能控制各功能在硬件上发挥作用。程序是单片机的思维,思维必须通过硬件电路产生实际的效果。硬件电路的设计一旦完成就很难改动,而单片机的魅力就是在硬件不改变的情况下,通过程序的千变万化带来硬件上呈现五花八门的效果。虽然说单片机开发是需要硬件与软件兼顾,但硬件设计通常都有经典方案,即使有改变也很小。所以硬件部分的学习相对固定且简单,而软件编程不仅需要与硬件的配合关系,还要考虑寄存器占用、运行速度、多任务处理、实时性、稳定性、检查未知错误等很多方面。所以学习单片机开发最主要的还是学习编程,而编程最主要的是掌握编程语言。那么,STM32单片机都有哪些编程语言?每一种都有怎样的特性?我们未来的教学要使用哪一种语言呢?这一期我们就来介绍一下。
编译器
给单片机写程序,本质上是与单片机对话的过程。我们用一种计算机语言告诉单片机要做什么,这个过程是我们说给单片机听。然后单片机会按我们的语言去操作内部功能和外部接口,从而在硬件电路上实现我们预想的效果。单片机运行的结果就是单片机告诉我们的答案,这个过程是单片机说给我们听。单片机开发、调试的过程就是我们下达任务,单片机回答任务结果的对话。
那么我们要以什么样的语言和单片机交流呢?汉语?英语?还是意大利语呢?要知道汉语、英语是人与人之间交流的语言,人要会这些语言必须通过学习,单片机是机器,它可不会学习。所以我们与单片机交流就得用它能理解的语言,这就是机械语言,这是由最基础的计算器原理决定的。单片机只能理解机械语言,人类要用单片机就得学习机械语言,可机械语言非常抽象难懂,它没有固定的逻辑、含义,就类似用“4B”表示“我”,用“8V”表示“你”这样,完全是死记硬背。为了减少人们的学习难度,技术人员发明了各种计算机语言,计算器语言很类似英语,比如用“if”表示“如果”,用“else”表示“否则”,只要学会了英语就能很快学会计算机语言。常用的计算器语言有很多种,BASIC语言、C语言、C++语言、C#语言、JAVA语言。
其实所有语言都能做单片机开发,只要有对应的“编译器”,编译器就像“百度翻译”一样,可以把计算机语言翻译成机械语言。如果我们有一种强大的汉语编译器,那么写汉字也能编程,可惜设计出这种编译器太困难了,没有人去开发(曾有一种汉字编程的“易语言”,但少有人用)。目前市面上已有的编译器只支持汇编语言和C语言这两种。这两种语言的可操作性强,又有很好的通用性,代码简洁,执行效率高。KEIL4软件里面的编译器就支持这两种语言,KEIL4软件会把汇编语言文件或C语言文件编译成HEX或Bin文件,这些文件叫做单片机可执行文件,俗称烧写文件,也就是机械语言。烧写文件是单片机可以直接识别的语言,它是一堆毫无规律的十六进制数据,它被直接存放在flash里面,单片机运行时可以调用这些十六进制数据,就可以直接被ARM内核执行了。最早的单片机开发者,因为没有像KEIL这样的编译工具,当时的电脑技术也不发达,开发人员需要查阅机械语言对应的执行命令表格逐一编写,开发难度非常大,随着电脑技术的不断发展,各种电脑辅助软件应运而生,其中就有像KEIL这样带有编译器的开发软件,这样单片机工程师就不需要直接去查表格编写机械语言,而只要去学习一个人类容易学习、方便编写和读懂的语言,然后再通过编译器把它转化成机械语言,就可以更轻松更快速的完成开发。
【图1】编译器的作用
【图2】一段汇编语言的程序
【图3】一段C语言的程序
【图4】一段机械语言的代码(HEX烧写文件)
STM32单片机最常用的编程语言就是C语言和汇编语言,汇编语言主要是用在单片机内核的启动代码上,而且这部分程序也不需要初学者修改,一般不需要学习掌握。但是有经历自学自然更好,技多不压身,多学有益。C语言则作为我们用户常用的底层驱动和上层应用程序的编写,ST公司提供的固件库几乎全部是用C语言来编写的,只要我们学会C语言就能完成单片机的开发。C语言是我们未来学习的重点,C语言不仅能用于STM32单片机的开发,还可用在8051、PIC、MSP430等其他单片机的开发中。可以这么说:学好C语言,几乎可以应对所有单片机开发。请大家一定要学好它。
除此之外,还有一种图形化编程方式,但其本质上还是C语言,只是设计者将常用的C语言程序做成图形块,编程时将需要的C语言程序所对应的程序块用鼠标拖动到流程图上,就会自动生成一套完整的程序。这种编程方式非常直观、高效,图形化编程可能在未来代替C语言,成为主流的新方式。可目前各单片机公司都只为自己的单片机设计图形化编程软件,比如我们后面会讲到的STM32Cube软件是ST公司为STM32单片机设计的图形化编程软件,这款软件不支持其他公司的单片机。目前图形化编程还有很多不足之处,首先是各单片机的图形化编程软件不通用,不能像C语言那样“通吃”。其次是图形化编程只是在C语言基础上做的升级版,当涉及到深入、复杂的编程,还是需要掌握C语言。所以图形化编程只是C语言编程的辅助工具,而想全面取代C语言还需要很多年。
再进一步说,之所以我们要学习C语言和汇编语言,就是因为编译器的功能还不够强大,不能直接读懂我们的汉字或英文,那么足够强大的编译器会把我们的文字直接转换成单片机的机械语言,那样我们就不需要再学习C语言了,直接用我们熟悉的人类的语言就可以。随着电脑科技和人工智能的进步,C语言和汇编语言终将被淘汰!我想单片机的开发者也会被淘汰,因为电脑可以通过人工智能直接编程了,在这一切没有来临之前,我们还是要认真的去学习C语言来做单片机的开发!
现在电脑开发软件的语言那么多,例如C++、C#、Java。先进而高级的语言越来越多,我们为什么还要学习很古老的C语言呢?其实到目前为止,所有单片机的开发几乎都是用C语言和汇编语言完成的。我们的STM32单片机的开发是使用C语言,而你想做8051、AVR或其他任何单片机的开发,都是使用C语言。所以你只要学好一门语言,就可以在单片机程序开发方面畅通无阻。之所以只能通过C语言来对单片机开发,是因为虽然C语言是高级语言,但它并不是太高级,他还和底层硬件寄存器有着很深刻的联系,所以它的适应性非常好,可以几乎在任何环境下不需要太多支持就可以运行。尽管C语言提供了许多低级处理的功能,但是依然保持着良好的跨平台特性。C语言不仅能够在许多电脑上进行编译,甚至包括了一些嵌入式处理器,也就是单片机。而像C++、C#、Java这样的语言不能够开发单片机,正是因为它的跨平台能力太弱,它们是为某一个平台(如PC或手机)而专门设计的。但C语言不是,它既能在电脑上运行,还能在单片机上运行,而C++、C#、Java这些语言的底层结构也基于C语言。
当你学好C语言之后,再学习其他语言就会更加轻松易学。现在我们知道了单片机的编程语言只有汇编语言和C语言了。那我们来看一下这两种语言的优缺点 ,性能对比请见【表1】。汇编语言的格式非常简单,它是类似于直接操作底层寄存器的语言方案,它的优点就是执行效率非常高,开发者可以直接操作指定的某一个寄存器,编程操作非常精准。但精准也会带来缺点,那就是不容易移植。单片机有很多型号,每一种型号都有自己的设计,你在一个单片机上用汇编语言精准开发的程序,挪到另一个型号的单片机上就无法运行。编写好后的语言更不容易读懂,因为当中涉及大量的指令,需要死记硬背,学习难度非常大。而C语言是高级语言,它的设计更偏向于用户的易用性,虽然它的编程效率不及汇编语言(C语言需要先把语句转换成汇编语句才能操作单片机内的寄存器),用户只能操作上层部分,底层部分由C语言自动处理。这种方式相比于直接用汇编语言的效率不高,但带来的好处是方便移植,因为你只操作上层部分,底层部分由C语言自动处理。当你更换单片机型号时,只要C语言在底层自动处理的部分做出调整(由编译器自动完成),用户编写的程序不需要修改,所以很方便移植!而且C语言都是英文单词编写,读懂非常容易,所以用C语言做单片机编程开发目前是最佳的选择。
【图5】汇编与C语言的优劣点
程与序
在介绍C语言的基本组成部分之前,先来说一下编程的基本概念,我们所说的编程实际上是编写“程序”。程序这个词很有意思,它可以拆开来看,“程”代表一种规范、一种章程,“序”代表顺序。规范是指硬性的规定,也就是我们按照这个规定去做,就能完成一些任务。比如说C语言中的各种语句,例如if、while、for,你要知道每一种语句它的含义和功能是什么?还有其内容的格式,比如一条语句应该怎样写?一个函数怎样组成。另外规范还包括“操作内容”,也就是要写的程序内容。比如用C语言让单片机点亮一个LED灯要怎么操作,读取一个按键的开关状态要写怎样的语句,这都是需要我们掌握的规范。而“序”所讲的顺序是指内容的前后关系。比如我们想点亮一个LED灯,然后再熄灭它。如果语句内容不变,前后顺序调过来,就变成了先熄灭后点亮。这样虽然在规范上没有错误,但是顺序错误依然达不到我们想要的效果。除了先后顺序之外,还有判断和循环的关系。我们需要判断一个事件,还有我们要反复执行一个事件,在什么情况下跳出这个事件呢?这都是“序”的工作。我们要学习编写”程序“,这要注意规范是否正确,内容的顺序是否正确,其中有任何一个错误都不能达到程序的正确要求。初学者可能对”程序“的深意不能完全理解,但没有关系,大家只要有一个基本概念和初步印象,随着未来不断的学习实践,相信你会理解的越来越深刻。
从这张图上我们可以了解C语言的大概组成框架,在我们未来的编程开发当中会不断涉及到这些内容。涉及的内容细讲起来比较复杂,图中只列出常用的内容,关于指针、枚举之类的高级应用并没有体现,在后文涉及到的时候,我会再逐一细讲。先看一下“函数”部分,其中包括main函数和子函数,main函数就是主函数,单片机上电后程序从main函数开始执行,然后再跳转到各种子函数,最后还是跳回到main函数。再看“数值的表达方式”,我们平时习惯的数值表达方式主要是十进制,但是在C语言当中十进制只是其中一种,还有十六进制和二进制。再看“基本规范”,C语言有一些基本规范,比如语句之间的分隔符用一个分号表示。括号具有很多应用,主要用于表达式和数组。大括号可作为一个函数的内容概括。注释符是给用户编写注释信息的,方便我们能够理解这条程序。声明则是对子函数或者变量做提前预告。数组就是把一堆数据放在一起,它分为一维数组和二维数组。C语言当中的数据不仅有十进制、十六进制的区别,还有“数据类型”的差别,也就是数据的长度是多大,有没有符号,有没有小数点,这些都是数据类型。另外就是“符号和表达式”,图中列出的是C语言在进行运算比较的时候常用的符号,包括等号、加号、减号等,这些在未来的编程当中都会经常涉及。刚才说的数据结构表达式符号之类最终都要通过“语句”来呈现,语句属于“序”的部分,它是用来判断程序下一步要往哪个方向走。例如if、while这样的语句是用来判断表达式,然后再决定是否执行后面的语句,或者是执行哪一组语句。而像while、do while、for这样的语句,是通过判断表达式来决定是否继续循环执行后边的语句,还是跳出循环运行下面的语句。未来你会知道,学习单片机开发其实就是在做各种表达式的条件判断,通过不同的条件来执行不同的语句。最后还有#include、#define这样的宏定义语句,它们能够帮助开发者提高编程效率,但是这些语句本身对程序内容没有影响。
【图6】程与序的关系
注意事项
了解以上内容只能说是大概知道了C语言的基本骨架,要想真正学会C语言,还需要在单片机开发实践当中不断的学习和积累。我之前遇到过很多单片机初学者,他们都说学不会单片机编程,实际上编程的基础知识并不难,难的是不断在实践中积累经验,熟练掌握、娴熟运用,这个娴熟的过程是最难的,也是最复杂的。在学习C语言的过程中,我希望你可以买到专门讲解C语言的书来看,有遇见不懂不会的地方,能利用网络搜索引擎自行找到答案。把你的问题放入搜索框,我相信网络上一定会有解答,如果没有就再多花点功夫查找。另外,我讲的知识在STM32的开发中不会都派上用场,很多语句、运算符少有用到。你的学习方法不是自己按照规则一句一行的写程序,而是参照我给出的示例程序,或者到网上查资料参照别人的示例程序,看看别人是怎么写程序的,观察程序的结构和逻辑,分析程序运行的原理和效果。初学者最容易犯的毛病是过早的自己独立写程序,就好像汉字还没认全就想写小说,最后一定四处碰壁,反而走了很多弯路。初学者最好先学会复制、粘贴,把别人的程序“抄”到自己的程序里,东拼西凑组成自己的程序。这种方法感觉像是小学生抄作业,不算光明正大。但编程老手都是这么做的,我写的大部分程序都是从各种渠道复制过来的,极少有一字一句打字写成的。这才是正常的状态,请收起初学者的偏见,“入乡随俗”地写程序吧。关于编程的细节之处还有很多可以说,但是现在你还没有开始学习,说多了不仅听不懂还会产生厌烦情绪,所以在后面的文章中讲到具体内容时再插话吧。最后免费赠送一份祝福:祝你能轻松学会、熟练运用!
注意事项总结:
初学者别急于自己编程,而是多看别人的程序。别不会走就想跑。
学习基础知识只能看懂别人的程序,不断的编程练习和实际项目开发才能真正独立写程序。
行业大多数编程者都是尽量找到现有的程序,而不是从头到尾自己写,复制粘贴程序代码才是常态。
要善于利用网络,有不懂的知识要用搜索引擎找答案,也可以在网上找到很多现有的示例程序来参考。
有兴趣还有多余精力的朋友可以再学汇编语言和C++语言,从中能让你对编程的本质理解的更深入。
转载至:杜洋电子
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。