这是arm裸机1期加强版第1课第2、3节课程的wiki文字版。 为什么没前途也要学习单片机? 因为它是个很好的入口。 学习单片机可以让我们抛开复杂的软件结构,先掌握硬件操作,如:看原理图、芯片手册、写程序操作寄存器等。在上一节视频里,我刚把单片机贬得一无是处,说单片机没前途了,这节视频,我又要告诉你们,没有前途,也要学习单片机。为什么? 首先,我说不用学习单片机,是指不要使用老一套得学习方法学习单片机。什么叫老一套的方法? · 硬件上:不要使用C51、STM32这些专用的单片机开发板。如果以后,你不打算从事单片机开发,你用这些芯片干嘛,研究了两三个月,把这些寄存器都用清楚了,你又用不上,没必要啊。 · 软件上:不要使用Keil、MDK等集成度太高的软件。你用这些软件,你写个main()就可以了,然后调用各种库,进行傻瓜式操作。这些好用的工具,封装了很多技术细节,使得我们没法了解裸机、单片机的本质。 以后我们会使用新一套的方法来进行单片机的开发。新一套的方法,我们后面再介绍。 我们之所以还要学习单片机,是因为它里面的知识,对我们后续学习Linux还是有用的。我们首先来看看,一个Linux系统是怎么一回事。 一个嵌入式Linux系统的软件组成: 单片机大全Bootloader–>Linux驱动–>Linux APP–>Linux GUI(Android/QT)。我们PC机一上电的时候,黑色屏幕上会显示BIOS,这个BIOS目的是去启动Windows内核。Windows内核再挂载C盘(系统盘)、D盘(应用盘),最后再去启动应用程序,像QQ、网游等。 同样的道理,我们的Android手机或者工控设备,也有BIOS,但嵌入式Linux系统里面不叫BIOS,叫Bootloader,他的目的是去启动Linux内核。 它首先也是识别应用程序所在的存储设备,挂载根文件系统(在Windows系统里面的C盘、D盘,在Linux里面称为根文件系统)。最后去启动应用程序。 仔细的分析下Bootloader,它去启动内核,它去哪里启动内核呢? 显然是去某个地方读出内核,就比如说BIOS是去C盘上读出Windows内核,我们的Bootloader是去Flash或者SD卡读取内核。 因此Bootloader要拥有读取Flash或者SD卡的能力。有些Bootloader还要显示logo,因此还要具有操作LCD的能力。Bootloader还要设置开发板的环境,比如,初始化时钟、初始化内存、还要设置网卡等。这么多事情,都是在Bootloader里面实现的,太复杂了,如果你一来就分析整个Bootloader是非常困难的。 那我们怎么学习呢? 把他拆开,写出单独的程序,比如:LED点灯、时钟、网卡、Flash都单独写个程序来练习,这些不就是单片机程序吗? 所以说,Bootloader是单片机程序的大全。我们为了更好的学习Bootloader,我们应该事先一个一个练习硬件,当我们熟悉每个硬件后,再组合起来,就是一个Bootloader。 我们再来看看Bootloader启动内核之后,内核再去挂载根文件系统,意味着内核也要有操作硬件的能力,这就是驱动程序。我们首先来看看一个简单的驱动程序是什么样子。首先我们的应用程序是调用open()、read()、write()这些标准的接口去访问硬件。那么就进入驱动程序里面,驱动程序里面有对应的drive_open()、drive_read()、drive_write()。 最后在驱动程序里面,去配置硬件。比如一个LED点灯驱动,那么drive_open()要把GPIO设置为输出引脚,drive_read(),返回GPIO状态,driver_write()则写GPIO,让引脚输出高电平或者低电平。 对于我们的LED驱动程序,你需要提供drive_open()、drive_read()、drive_write()这些接口,这就是它的框架。具体的怎么操作硬件,就是硬件操作。所以说,我们事先在单片机里面,熟悉熟练的掌握硬件操作。即驱动程序的组成: 驱动程序=软件框架+硬件操作 你需要学会看原理图、看硬件怎么连接、看芯片手册、知道怎么读写寄存器。这一切都可以先在单片机里面学习,去掌握。以后学习Linux驱动时,把重点放在软件框架就行了。 我们可以事先学习单片机,单片机的学习可以让我们先抛开复杂的软件结构,先掌握硬件的操作,如:看原理图、芯片手册、写程序操作寄存器等。这就是为什么单片机没有前途,我们也要学习。是因为他里面涉及的硬件操作,对我们后续的学习,非常有用处。 现在我们知道了,我们学习单片机,不是为了掌握单片机的开发技能,而是为了掌握Bootloader,掌握硬件操作。 单片机和Linux都想学_换个两全的方法学习单片机 本节教你如何学习单片机,如何选择合适的开发板和开发工具。 现在我们知道单片机是要学习的,那么怎么去学习单片机?在上一课我们说不要使用老一套的方法学习,实际上是指的两个问题。 第一:选择什么开发板; 第二:使用什么开发工具; 我们学习单片机的目的是干嘛?目的是为后续嵌入式Linux学习服务。 单片机->bootloader->Linux系统/驱动->APP(QT) 可以使用同一套开发板。 我们选择开发板的原则是:资料丰富。 开发板首推三星 (SAMSUNG)系列的,资料最开放, * 有S3C2440、S3C6410、S5PV210、Exynos4412; 我们用百度进行搜索,看哪个资料最丰富。结果如下: 再在搜索关键词中加入“教程”后,S3C2440的搜索结果比AM335X更多,因此S3C2440的资料仍是最多的,TI的营销更好,当然,TI作为工控板,其用户也是很多的。 所以,从教程的丰富程度来看,S3C2440为首选开发板; 我们后面会考虑使用TI的芯片重新录制一套视频,但需要2-3年的功夫,所以,现在还是使用S3C2440吧。 现在普遍有个错误观点:S3C2440过时了,它还是ARM9内核,现在Cortex-A7、 Cortex-A8、 Cortex-A9、 Cortex-A15都出来了,它的性能太差了。 那要看学到的知识是否过时。 我们首先来看看一个芯片是怎么组成的,里面有CPU、外设串口、I2C、SPI、LCD等。 **不同芯片的差别: 从上一课我们知道,驱动=软件框架+硬件操作。这个软件框架对于所有的芯片都是一样的,因为都是用Linux内核。 我假设你选择了2440开发板,那么怎么使用2440开发板来学习单片机的开发呢?又使用什么开发工具呢? ① Windows下的单片机学习,深度不够
如果我们基于ARM+Linux,不使用这些Windows工具,你可以学得更深,并且单片机的大全Bootloader,他就是ARM+Linux开发的,他并不使用Windows下的工具。
我说的这些概念,你可能听都没听过,这是因为Windows下这些好用的工具把这些统统都给屏蔽了。
所以我们怎么去学习单片机的开发呢? 使用S3C2440开发板,在Linux环境(Ubuntu)下使用arm-Linux-gcc工具来编译程序。 |
|