STM32编程语言介绍_stm32汇编语言-程序员宅基地

技术标签: STM32  

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++语言,从中能让你对编程的本质理解的更深入。
转载至:杜洋电子

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_18182559/article/details/119156356

智能推荐

Selenium自动化测试-进阶_selenium自动化测试进阶使用-程序员宅基地

文章浏览阅读606次。浏览器、鼠标、键盘 操作 maximize() 设置浏览器最大化setSize() 设置浏览器宽高back() 模拟浏览器后退按钮forward() 模拟浏览器前进按钮refresh() 刷新页面(F5) Actions 类提供了鼠标操作的常用方法:contextClick() 右击clickAndHold() 鼠标点击并控制doubleClick() 双..._selenium自动化测试进阶使用

Java数字金额转化成汉字大写金额_java两位小数金额转大写-程序员宅基地

文章浏览阅读1.6k次。import java.math.BigDecimal;/** * Utils - 金额转为大写汉字 */public final class NumberToCNUtils { /**汉语中数字大写*/ private static final String[] CN_UPPER_NUMBER = { "零", "壹", "贰", "叁", "肆", "伍", "陆..._java两位小数金额转大写

CMM(软件能力成熟度模型)-程序员宅基地

文章浏览阅读1.4w次,点赞16次,收藏116次。CMM,即“软件能力成熟度模型”,是对组织软件过程的描述,核心内容是将软件开发视为一个过程,并且根据相应的原则对于软件开发进行相应的监控和研究。_cmm

vue2+vue-cli使用unocss_vue2 unocss-程序员宅基地

文章浏览阅读2.5k次。在根目录中添加 unocss.config.js 文件是为了提供更细粒度的配置选项给 @unocss/webpack 插件。通过这个配置文件,你可以定制化 UnoCSS 的行为,例如定义主题样式、配置插件、启用或禁用特定功能等。在 Vue CLI 项目中,默认情况下,你应该在根目录创建一个 unocss.config.js 文件来配置 UnoCSS。这个文件会被 @unocss/webpack 插件自动识别并加载。具体配置请查阅官网文档。_vue2 unocss

【C++】最通俗的多态、虚表、虚指针讲解_虚表指针-程序员宅基地

文章浏览阅读2.9k次,点赞26次,收藏82次。多态需要两个特性:(1)方法重写(override):父类与子类具有函数签名完全相同的方法。(2)向上类型转换(upcasting):用一个父类指针指向子类对象的时候,假如调用的是虚函数,会自动暂时将该指针转换为子类类型的指针。虚函数的存在就是为了类型转换,即使没有虚函数也能重写方法。虚函数并不是为了解决函数重写问题的。假如你去在父类和子类中都写上函数签名相同的方法,同样也能重写函数。例如 我们先写一个没有虚函数的例子结果为是完全没问题的!是的,即使不加virtual,也能实现方法重写!假如我用子类_虚表指针

【FFmpeg】ffmpeg命令详解(一)_ffmpeg -vf命令-程序员宅基地

文章浏览阅读5k次。1、命令格式ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...global_options:全局选项input_file_options:输入文件相关的选项output_file_options:输出文件相关的选项-i input_url:输入文件,可以有多个输入文件,每个输入文件前都要加“-i”选项output_url:输出文件2、简述_ffmpeg -vf命令

随便推点

小米格机9008救砖后如何跳过nv损坏进入MIUI系统写基带并修临时基带_9008备份基带-程序员宅基地

文章浏览阅读2.7k次。我k40刷完后虽然串号这些都有了也识别卡了但是没信号是因为modem分区用的工厂包的文件还是我手机坏了或者qcn有问题如果你在没有改qcn的情况下刷回原系统的modem分区文件你又会进入nv损坏无限重启[doge]这时你就会发现电脑设备管理器会出现新的4个新设备端口打开QPST就可以刷基带了(k40在正常的系统我觉得应该也可以用这种方式开启端口备份基带,改串号可以用星海之类的软件正常勿改)。以上都是经验之谈具体看个人[坏笑][坏笑][坏笑][坏笑]从折腾了这几天的红米k40来看。从k40救砖经验来看。_9008备份基带

参与CSDN1024程序员节活动-程序员宅基地

文章浏览阅读4k次。有幸参与了CSDN主办的1024程序员活动-岳麓对话,聆听各位专家畅谈中国软硬件产业的根技术以及前沿科技的发展现状和未来。听程序员们聊技术,都比较实在落地,在谈到如果你有个孩子在读大学你会推荐他学什么专业和技术时,各位大佬都集体推荐本专业或本专业的基础学科,都充满了对自己行业的自豪感。小冰CEO李笛说:学习人工智能,未来如果技术被颠覆了,等于是自杀,而不学人工智能,则相当于是他杀。百度副总裁马杰说:我们应站在时代的肩膀上,人工智能在深刻地改变我们的世界,未来会持续产生影响。国科量子副总裁聂际敏说:学

BIM族库下载——10套知名地产Revit样板文件_地暖bim效果图-程序员宅基地

文章浏览阅读1.2k次。【资源介绍】资源名称:10套知名地产Revit样板文件资源分类: BIM族库、Revit族库其他简介:10套知名地产Revit样板文件【资源下载】链接:https://pan.baidu.com/s/1qsTHMbhGkiXztPQDmJlKfQ提取码:wb33【资源截图】【免责申明】本站提供的资源下载链接均来自互联网,仅供学习研究之用,不得用于商业,请在24小时内删除!资源版权归原作者及其公司所有,如果你喜欢,请购买正版。..._地暖bim效果图

西电软件体系结构——01绪论-程序员宅基地

文章浏览阅读288次。课程简介软件体系结构的主题是针对复杂软件系统的高层结构、组织单元之间的相互关系的描述,以及围绕这种描述开展的各项活动,如设计、评估、实现、管理等。课程目标_西电软件体系结构

Job for mysqld.service failed because the control process exited with error code-程序员宅基地

文章浏览阅读1k次。initialize specified but the data directory has files in it.”意思是初始化数据目录时发现目录里面有文件,可能原因是之前运行过命令目录中已生成文件。只要我们找到MySQL的数据目录并删除里面的文件即可解决。datadir是我们安装MySQL时默认指定的存放文件的数据目录,进入文件中删除里面的目录即可。网上搜了一下绿线标注部分语句,说是缺少libaio这个包,那就装一下。PS:如果我的方法没用的话可以试试网上说的修改文件权限的方法。_job for mysqld.service failed because the control process exited with error

老司机必备的手机浏览器,比UC浏览器还好用_比uc好用的手机浏览器-程序员宅基地

文章浏览阅读1w次。各位听得最多的段子:老司机们,上车了。没错,不管是在电脑端还是移动端,都需要一款好用的浏览器。那么,老司机们都用什么浏览器,什么样的浏览器才是老司机必备的浏览器呢?来咯,这些手机浏览器比UC浏览器还好用,功能可媲美桌面浏览器,一起来看看吧。_比uc好用的手机浏览器