单片机开发总结

马上秋招了,复习一下单片机。

序言

大二的时候玩过单片机,马上秋招了,linux只是会用,不会移植,看不懂内核,看不懂uboot,C++也没精通,QT也是半吊子,python也不是我的职业方向,只能把简单的单片机拿过来复习一下,希望在招聘的时候底气能够足一点。
找工作是一个原因,除此之外,我还想认真地学一下UCOS,毕竟一个搞嵌入式的连一个RTOS都没接触过,说出去岂不是让人笑话。
本篇文章并不会有什么细节,如果有,那也只是为了辅助介绍思想,更多的是一种单片机开发流程的总结与感悟。具有很强的通用性。所以完全可以当作一篇茶余饭后的小文章来看看。

概述

假如有一天,你的老板给你一块你从来没用过的单片机让你基于这款单片机开发出某某产品,我们该怎么办呢。这种情况,我相信在这个技术更新如此之快的时代是时常发生的情况,作为技术人,我们必须有一套应对这种情况的方法,这篇文章就是介绍一下我个人对这种情况的处理办法,不成熟是肯定的,有错误也是肯定的,毕竟我才大三。我大概总结了一下,有如下几个步骤:调研芯片的应用领域、收集相关资料、确认芯片内核架构、了解芯片系统结构、购买开发板与仿真器、组织工程文件、选择并配置开发环境、编写应用程序、测试应用程序、根据用户反馈维护并优化应用程序。我们下面将会挨个介绍上面的每一个步骤。

注1:编写应用程序、测试应用程序、根据用户反馈维护并优化应用程序三点将不会在本篇文章中涉及,后面我会有一个系列的文章来记录我的UCOSIII学习历程,在那里将会有大量的应用示例

注2:下面的步骤介绍是以STM32F103RBT6为例进行的

调研芯片的应用领域

这个步骤主要是为了了解一种芯片的优点与缺点,它之所以适用于某个领域,一定是在这些领域有某些独特的优势,之所以不适合其它领域也一定是在这些领域有一些劣势。那么如何调研呢?本人作为学生,没有系统地学习有哪些调研方法,只能简单地根据浅薄的经验来介绍一下几种常用的方法。

  • 百度:最简单粗暴的方法,基本上得不到什么有用的信息
  • 去各种相关的电子论坛:这些论坛里面更多的是具体的技术细节的探讨,以及某些技术的行业应用,你可以通过这些行业应用去大概了解芯片的应用领域
  • 去询问大佬:这其实是最高效的方法,如果你的身边有相关领域的大牛,直接去向他们咨询,这将会帮你节省很多时间,同时,友情提醒,不要轻信同水平人的言论。
  • 去看大佬的博客:这其实和上一点效果差不多,由于大牛不常有,所以才需要这种方法。

总之,尽可能地去获取更多的高质量的信息,保证你在研究这块芯片之前已经对它有了足够的市场认知

收集相关资料

如果我们确定了某类芯片适合我们的项目,那么我们下一步就需要去研究它了,古语有言,巧妇难为无米之炊。我们在学习之前要先收集许多许多的资料,这些资料可以以视频、电子书、纸质书、代码、论坛、论文等多种形式而存在,下面我以我在复习STM32的过程中资料的收集情况来进行简要介绍。

  1. 手册型的
    主要包括M3权威指南(中英文)、标准库参考手册(中英文)、芯片数据手册、应用参考手册等。
    在这里插入图片描述

  2. 教材型的
    我这里主要使用了两方面的教材,一个是老师的PPT,一个是一些开发板公司的PDF教材,如下所示,当然如果有钱,也可以去买一些纸质版的教材。
    在这里插入图片描述
    在这里插入图片描述

  3. 视频型的
    我最近看视频不多了,感觉速度太慢而且信息不够,一般只有入门某个领域的时候才会看视频,我当时入门单片机的视频是郭天祥的《十天精通单片机》。

  4. 代码型的
    其实对于单片机来说,不需要去看太多的代码,因为单片机的代码逻辑非常简单,没有CS专业或者嵌入式的各种算法,各种数据结构,各种框架,各种设计模式。所以,在单片机层次,只要把标准库弄熟练了,多找点实际项目练练,基本都没什么问题。

  5. 论坛型的
    这一点非常重要,我们要多去逛逛各大论坛,比如什么摩尔吧、电路城、电子工程世界、一些芯片厂家的社区、一些开发板厂家的社区等等,在里面多学习,多交流,多找几个项目自己做一做,遇到问题,可以去那里找一找。

  6. 论文型的
    关于论文,在单片机方面其实我没有怎么见到过,因为单片机实在是没有什么论文可以发,不过我们可以去看一些应用单片机来进行科学研究的论文,其实不要局限思维,多去看一些大佬写的科研论文,看看人家是怎么组织文章结构的,看看人家是如何进行研究探索的,这对提高自己的科研素养还是很有帮助的。
    Tips:如果有能力,尽量不要去看知网上的文章,因为含金量实在是太低了

确认芯片内核架构

这一步看似是一个很简单的步骤,实际上,它的确是很简单的步骤,芯片的内核型号,从它的手册中一翻就出来了,但是,简单并不意味着不重要,相反,它非常重要,从名字上我们就可以看出,它是整个芯片的内部核心,也就是说内核的类型直接关系到芯片的下限与上限,比如M3的内核没有MMU,这就注定它无法跑linux,所以想上linux的朋友最好选一些高端的内核,如果想跑android等带文件系统的操作系统,最好选择带MMU且主频高一点的内核(比如Cortex A系列)。我目前用的M3就只能跑一跑像UCOS这样的RTOS。总之选择芯片前一定要清楚自己的内核需求,选择合适的芯片。
下面是《Cortex-M3权威指南(中文)》的目录

在这里插入图片描述
我们可以看到很多术语,要想准确地选择自己需要的内核,就需要对内核的一些常用术语有一定的认识,目前里面还有很多术语,我都不太熟悉,以期将来工作有机会再加深对这些术语概念的理解。

了解芯片系统架构

ARM公司开发出内核之后,很多厂商就在其内核之上进行芯片设计,本质上就是加了许多外设(如I2C,SPI,ADC/DAC等等)。不同的厂商这些外设的差别是很大的。我们需要针对某个芯片去仔细地了解它的芯片系统架构。
芯片里面有哪些外设,这些外设之间以及与内核是如何连接的,数据信息、地址信息、控制信息都是如何传递的,地址空间是如何分配的,有哪些存储器,这些存储器的特点与大小是怎样的,有哪些下载与调试接口,有没有一些没见过但是好像很有用的外设。
下面是STM32F10xx的系统架构

在这里插入图片描述
我们可以从中获取很多信息,比如有哪些外设,信息是如何传递的(手册里会有对这个架构的简单介绍),有哪些存储器,这些部件之间是如何组织的,哪些是主动单元,哪些是被动单元,我们都可以知道。

购买开发板与仿真器

这一步个性化就更强了,如果你会画板子的话,最好自己画一个,这样学习更深刻。如果不会,也没关系,我们去淘宝上一搜就一大堆,根据自己的需要选一个就可以了,选板子的时候尽可能选择功能多一点的,虽然可能贵一点(单片机学习板贵上天能有多贵呢?),但是学习嘛,何必在意这点小钱呢。看看调试接口是怎样的,然后附带购买仿真器,仿真器可能贵一点,如果有钱就买好一点的,没钱就买便宜的,其实无所谓。我没有买过仿真器,都是在实验室蹭的?(没办法,出身贫寒,只能这样子维持一下生活了),我旁边这个还是找我以前的队友借的。

组织工程文件

可以说这一步是简单的,又是困难的,简单在大部分的代码都是别人写好的,困难在你需要去对着芯片架构理解这些代码,下面是正点原子的STM32F103代码结构(Tips:其实这种代码结构只是给人看的,编译器根本不在乎你是怎么组织的,它能看见的就是一堆C文件和汇编文件以及链接脚本)。

在这里插入图片描述
这个工程文件(大部分单片机都可以这样分类)主要分为如下几个部分:

  • Libraries:芯片库文件,主要包含内核接口库和外设驱动库两部分
  • listing:这里面有一个.lst文件,里面包含了丰富的信息
  • Output:这里面是输出文件,包含各种中间文件
  • Project:工程文件,类似于Makefile一样的存在
  • Doc:工程文件的说明文档
  • Board:板级驱动,也就是针对你的开发板特定的驱动,在别的板子上不行
  • User:基于驱动程序的应用程序

这是我们电脑上文件的实际存放形式,但是在keil中还有一个工程组织结构,如下图
在这里插入图片描述
我们看到的不叫文件夹,在keil里面叫做group,它也只是给人看的一种组织形式。我们可以向里面添加我们需要的文件

选择并配置编译环境

这一步,不同的开发方式,不同的开发软件,都有着不同的配置方法,但是基本思想都是一样的,我们以keil为例进行介绍

在keil中有一个叫做魔术棒的东西,他就是用来配置编译环境的,如下所示
在这里插入图片描述
点开,我们会看到如下界面,我们将逐个介绍里面每一个选项卡的含义(Options for Target)
在这里插入图片描述
1. Device选项卡
如下图,在这一步中,我们选择相应的目标芯片,这样keil就会根据这个芯片选择特定的编译器,我们可以通过这个选项卡知道芯片的一些信息。
在这里插入图片描述
2. Target选项卡
如下图
在这里插入图片描述
1、指定用晶振频率,可以用于模拟调试,仅反应外部震荡频率
2、可以选择keil自带的操作系统,一般不用
3、系统可视文件,一般不用
4、片外只读存储器设置
5、片内只读存储器设置
6、编译器选择
7、交叉模块优化
8、使用MicroLIB
9、片外RAM设置
10、片内RAM设置
3. Output选项卡,如下图
在这里插入图片描述
1、输出路径
输出路径就是在工程编译的过程中,输出这些文件的保存路径
2、输出可执行文件名
3、输出可执行文件
4、输出库
输出的是静态库,而不是动态库
4. Listing选项卡
在这里插入图片描述
1、输出路径、宽高
选择列表文件输出的文件夹。可设置文件页面的宽度、长度。
2、输出汇编列表
勾选上会输出汇编列表信息,如果工程中没有汇编文件,则什么也不输出
3、C编译列表
C编译程序列表选项,勾选上可生成.txt,.i文件
4、链接列表
可选择生成或者禁止生成.map文件
5. User选项卡
在这里插入图片描述
1、编译运行之前运行用户程序
2、编译之前运行用户程序
3、编译之后运行用户程序
4、编译之后执行条件
执行条件
编译完发出声音
启动调试程序
6. C/C++选项卡
在这里插入图片描述
1、预处理定义
这里主要就是预定义功能,相当于程序中的#define xxx
2、语言代码生成
可以理解为编译链接到最后生成代码,这部分对代码优化尤其重要
3、包含路径
就是让keil知道可以去哪里寻找头文件
4、多功能控件
5、编译器控制字符串
针对编译器执行的命令,用来控制编译器的行为的
7. Asm选项卡
在这里插入图片描述
这个选项卡和上一个C/C++差不多,只不过针对的是汇编语言,不再赘述。
8. Linker选项卡
用来控制链接器的行为的
在这里插入图片描述
1、使用来自目标对话框的内存布局
这一步的意思就是使用我们指定的内存布局来编排代码中不同部件的位置
2、分散文件
可以加载、查看和编辑分散文件
9. Debug选项卡
这个选项十分重要,它是用来调试(软件仿真、硬件在线) 使用的。软件仿真和硬件在线调试配置基本一致,所以只讲硬件在线调试
在这里插入图片描述
1、选择硬件在线调试
2、选择硬件在线调试
Load Application at Startup:启动时加载应用程序。
Run to main():程序执行到main()函数。
Initialization File:加载编辑初始化文件。
3、复位初始化会话设置
如果勾选上,点击一下“复位”就会恢复到之前的状态。包括:断点Breakpoints、窗口Watch Windows、性能分析器Performance Analyzer、内存窗口Memory Window、工具箱Toolbox、系统查阅器System Viewer等。
4、DLL文件
这里不要动
5、管理组件描述文件
这里一般不用去管理。
10. Utilities选项卡
这个部分属于公共选项。
在这里插入图片描述
1、为Flash编程使用一个目标驱动(也就是一个flashloader)
这里是二选一,一般我们使用上面的“Update Target Driver for Flash Programming”。
Use Debug Driver:使用调试驱动。
Update Target Before Debugging:调试之前更新目标
Setting:设置
很多人下载程序后,需要复位一下程序才可以运行,原因在于没有勾选“Reset and Run”,如下图:
在这里插入图片描述
2、配置图像文件的处理
这个我们不常用,暂时不去了解
11. 总结
来总结一下,这10个选项卡中,最核心的是Target、C/C++、以及Linker。其中的Target和Linker共同用来配置链接器,Target和C/C++共同用来配置编译器。注:其实Device的选择对后面的选项卡都有影响,但我们要知道这种影响是机器帮我们做的,为的是帮我们屏蔽芯片细节,但是出于学习的目的,我们在这里要忽略Device这个选项卡,自己去了解芯片架构,内存映射,自己配置选项卡。
除此之外,后面的Debug和Utilities也是很重要的。

总结

凡事都是要遵守流程,讲究规范,注意总结,这对于技术的积淀和效率的提高十分重要,感谢你的阅读,如果有错误或者不成熟的地方,请一定要提出来,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值