2016-12-27 72 views
0

我正在阅读有关引导编程嵌入式系统 - 使用C和GNU开发工具,第二版(Michael Barr,Anthony Massa)的书中的微控制器,发行人:O'Reilly,然后我发现其中之一引导步骤是在启动之前发生的硬件初始化和本书中关于硬件初始化的信息。是:。硬件初始化的功能

“最实际的硬件初始化发生在第二阶段,在 这一点上,我们需要告知处理器有关的环境,这也是 初始化中断控制器和其他重要的好地方外围设备。 不太关键的硬件设备可以在相关联的设备 驱动器启动时进行初始化,通常从内主。

硬件初始化程序,hw_init,应通过初始化 存储器接口配置启动寄存器,以通知处理器大约 其他内存和外围设备安装在电路板上。通过 时间这个任务完成后,ROM和RAM地址的整个范围将被启用 ,所以你的软件的剩余部分可位于在ROM或RAM任何方便 地址。”

,但我搜索有关它在谷歌的更多信息,但只发现关于启动代码的结果和几乎没有关于硬件初始化,我想了解更多它是做什么

+0

它为微控制器所有的寄存器写入一个初始值。因此,您需要获取微控制器数据表,并决定要在每个寄存器中放置什么值。 – user3386109

+0

几乎从来没有你需要触摸永远注册,文档显示或应该后重置状态,你不一定需要触摸那些处于你想要的状态,假设你的初始化后重置。如果不是,那么最简单的方法是块的部分重置,然后触摸你不喜欢默认的块,最坏的情况是触摸块中的大部分寄存器。 –

+0

我曾经拆解过一个AVR程序,并且在启动代码之前没有发现硬件初始化,那么复位立即跳转到启动代码,所以它写在哪里? –

回答

1

硬件初始化是特定于您的应用程序,所以没有我已经给出了几个例子:

其中一个我们制造的产品co带有一个ARM微控制器,通过CAN总线与其他系统进行通信,并使用PWM来控制LED的亮度。这种情况下的硬件初始化意味着我们必须为CAN总线的速度和设备的CAN ID设置CAN外设。我们还必须设置PWM的定时器。

我们通过SPI与GYRO传感器进行对话。因此,该产品的硬件初始化还包括设置SPI并通过SPI发送消息来初始化GYRO传感器。

PC的键盘内部的微控制器必须设置其GPIO引脚来扫描键盘的行和列,还必须初始化USB外设,以便可以与其连接的PC进行通信。

每个微控制器都有一些外围设备。根据您的应用,您可以选择一个微控制器。您的应用程序的引导代码必须初始化(或设置)您需要的外设。

设置外设意味着将值写入外设的寄存器以对其进行编程以执行所需的功能。

大多数微控制器都带有一个软件库,可以为您执行大部分硬件初始化。例如,它可以为您设置一个串行端口。您只需告诉它您要使用哪种U(S)ART以及您需要的波特率。有关Arduino上的串行端口,请参阅here

+0

因此,我可以说硬件初始化的例子是在内存设备上应用内存映射,对内存和外设寄存器进行初始化和配置,以便能够启动和配置处理器,以便能够与内存和外设连接,如启用芯片选择 –

+0

这是正确的。大多数微控制器都有内部存储器,你告诉你的(交叉)编译器什么是内存类型和大小(RAM和ROM,主要是Flash)。 – NZD

+0

我曾经拆解过一个AVR程序,并且在启动代码之前没有发现硬件初始化,所以复位立即跳转到启动代码,所以这是因为cav是一个简单的系统,只需要熔丝位作为其硬件初始化? –

1

arduino启动代码的来源是可用的,你可以漫步,看看他们在做什么。

处理器(核心)启动的方式对于该体系结构以及可能的版本或变体(avr系列有多种变体)非常具体。然后你可以在芯片周围包裹一个芯片,像处理器那样简单,其中许多外围设备和资源都在其他芯片中,或者像芯片上的微控制器或系统,其中许多(如果不是全部)资源在芯片上。 Arduinos上的芯片是微控制器,芯片上有相当数量的资源,但是如果没有用户界面(按钮等)或显示器,您可能非常满意在芯片内部运行整个应用程序的意义。什么使芯片对人类有用? (教育肯定,但最终你想要一些芯片接口)

随着AVR,处理器核心和芯片公司是同一家公司,他们拥有/控制整个事情,以前atmel现在微芯片(希望他们不要破坏atmel),所以你可以去他们的网站获取所有信息,处理器核心和芯片信息。芯片有望在家庭中类似。以ARM为例,虽然ARM拥有处理器核心,但其他许多芯片公司都将自己的东西包装在它们周围,这意味着你必须去支持一些信息,剩下的芯片公司,以及两个由于每个芯片供应商都不会与其他芯片公司兼容,因为各种原因(包括对其IP的合法保护),武器缠绕的武器在基于武器的世界中差异很大。所以首先你必须了解处理器是如何启动的,主要有两种方法,一种是地址表,复位地址,中断地址,可能是故障或其他中断。程序员填写这张表(它在某种非易失性存储器中(通常但不一定是),如flash或rom),这些地址指向处理这些事件的代码。

然后你编写处理这些事件的代码,你似乎要问的是重置事件。正如答案,它变得非常多的芯片和架构特定。通常情况下(但并非总是如此),这些例外是无穷无尽的,因为并非所有架构和芯片的设计方式都完全相同,就像启动一个模型一样 - 即使它们都是四轮车,t也不同于启动特斯拉)将堆栈指针设置为指向您和芯片/系统设计人员知道地址的内存。基本的东西只是为了让处理器运行起来,你可能不得不初始化一些通用寄存器,但通常不会,也许设置一些处理器功能标志等。也许你想打开一个缓存或其他东西。此代码通常但不总是在非易失性存储器中,只读,所以您可能需要安装RAM,有时不需要使用微控制器。然后,您可能需要设置一些时钟,这些时钟对于微控制器和处理器来说都很常见,但细节非常多芯片和系统特定。并非总是如此,但许多微控制器都内置RC振荡器(电阻器电容依赖于电子的速度,如果您愿意,会产生振荡,永动机),但它们不是很准确,所以如果您需要精确度,您可以调整它们或者在调谐设置中使用熔丝,或者经常需要切换到晶振,但这是特定于电路板的,您必须遵循一些芯片特定的过程切换到该振荡器。如果芯片上有一个芯片可以使该振荡器的速度倍增,那么也许还需要使用一个PLL,或许可以在芯片内将8Mhz的外部时钟转换为48Mhz的时钟。

因此,标志,时钟,内存,堆栈不一定按此顺序。也许还有其他一些事情。接下来的外设,也许你的应用程序想要使用uart和spi控制器和两个定时器。那么你必须提出这些,都非常具体的芯片。有时您必须启用外设的时钟,这些外设在复位时被禁用以节省功耗。然后根据您想要使用这些通用ISA外设的模式,您必须根据您的应用程序进行设置。重复,直到所有这些设置。

然后你的应用程序可能需要做它需要初始化的东西,也许你在spi总线或总线上有一个温度传感器,一个显示器和一个sd卡。您必须与这些人讨论并根据他们的筹码规则和程序初始化这些外围设备。

最终数十到数万行代码后,您的应用程序可以开始做它的事情。

arduino有一个引导程序,它是avr芯片的一个特性,并且当然是由arduino设计人员和工具使用的。如果您使用其中一个引脚声明的芯片来重置芯片,则会通过芯片中的功能将其引导加载程序加载为应用程序。如果您以其他方式断言该引脚然后重置,那么它将从应用程序闪存引导,运行您的应用程序。至少在串行接口方面,AVR芯片系列有几种不同的方式进入引导程序或逻辑,可用于重新编程应用程序闪存“在电路中”。旧的arduino时代,这是一个串行端口(uart)接口,带有一个基于Atmel产品的简单协议,但是如果您真正查看它们的引导加载程序并编写自己的加载程序,而不是使用avrdude或Arduino沙箱。无论哪种方式,这是一个非常普遍的解决方案,微控制器往往有一种或多种方式进入芯片,然后在电路中进行编程,无论是引导加载程序还是逻辑或某种组合。

该引导加载程序本身就是一个完整的应用程序,其目的是提供一个接口来要求它为您重新写入闪存。作为一个完整的应用程序,它必须完成应用程序的所有工作,可由处理器启动,设置资源/外围设备,然后继续执行主应用程序代码。

所以你可以去atmel站点,也许看看attiny avr微控制器的更简单的,或者看看你的arduino,找到你拥有的芯片家族并下载资源。这些文档的名称因供应商而异,通常称为数据表的内容包括芯片引脚和引脚定义,器件的订购信息(可包含引脚数量,闪存/ RAM数量等的器件型号选项)和电子信息。一些供应商的所有编程信息都在数据表中,数据表中有一些或没有,您需要某种形式的参考手册或用户手册或其他名称,有时还有一个涵盖处理器核心或所有可能的外设,然后数据表告诉你芯片有哪些可能的列表以及它们所处的位置(处理器地址)。

硬件初始化的相当一部分工作是研究,找到电路板的文档,和/或阅读原理图,或者如果你的公司正在让硬件工程师去问问他们的东西是否是硬件工程师不可理解或完整(通常没有理由完全记录它是否存在该人和你,在白板或skype消息或电子邮件上记录的文件就足以满足你不需要的冗长文件)。芯片供应商的文档几乎总是有错误,所以需要通过缺乏更好的术语来查看寄存器中的位是否符合文档所说的内容,或者您​​是否可以通过戳他们或阅读他们的示例代码或其他开源代码。除了非常特定的系统的特定应用程序之外,您将找到一个包含所有您需要的硬件init信息的地方。