硬件初始化的功能

时间:2016-12-27 23:45:48

标签: arduino embedded avr electronics

我正在阅读有关微控制器启动的书籍,编程为嵌入式系统 - 使用C和GNU开发工具,第2版(Michael Barr,Anthony Massa),发布者:O'Reilly,然后我发现其中一个启动步骤是在启动之前发生的硬件初始化以及我在书中找到的关于硬件init的信息。是:

“大多数实际的硬件初始化都发生在第二阶段 至此,我们需要告知处理器其环境。这也是 初始化中断控制器和其他关键外设的好地方。 可以在关联设备时初始化不太重要的硬件设备 驱动程序启动,通常来自main。

硬件初始化程序hw_init应该通过初始化来开始 内存接口配置寄存器通知处理器 板上安装的其他内存和外围设备。由 这个任务完成的时间,整个ROM和RAM地址范围将是 启用后,您的软件的其余部分可以在任何方便的位置 ROM或RAM中的地址。“

但是我在google中搜索了有关它的更多信息,但只找到了有关启动代码的结果,而且几乎没有关于硬件初始化的内容,我想了解更多内容

2 个答案:

答案 0 :(得分:1)

硬件初始化特定于您的应用程序,因此没有一刀切的选择。我在下面举了几个例子。

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

我们制造的另一款产品通过SPI与GYRO传感器对话。因此,该产品的硬件初始化还包括设置SPI并通过SPI发送消息以初始化GYRO传感器。

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

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

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

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

答案 1 :(得分:1)

arduino引导代码源可用,您可以浏览它们以查看它们正在做什么。

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

随着AVR,处理器核心和芯片公司是同一家公司,他们拥有/控制整个事物,以前atmel现在的微芯片(希望他们不要破坏atmel),所以你可以去他们的网站获取所有信息,处理器核心和芯片信息。这些芯片有望在各个家庭中相似。以ARM为例,虽然arm拥有处理器核心,而其他芯片公司,其中许多公司都围着它们包装自己的东西,这意味着你必须先拿出一些信息和其他芯片公司,其中两个由于各种原因,包括对其IP的法律保护,每个芯片供应商都不会将其产品与其他芯片公司兼容,因此围绕手臂缠绕的东西差异很大。

首先,您必须了解处理器的引导方式,主要有两种方式,一种是地址表,复位地址,中断地址,可能是故障或其他中断。程序员填写这个表(它在某种非易失性存储器中(通常但不一定)像flash或rom),这些地址指向处理这些事件的代码。

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

所以标志,时钟,内存,堆栈不一定按顺序排列。也许还有其他一些事情。接下来是外围设备,也许你的应用程序想要使用uart和spi控制器以及两个定时器。那么你必须把它们搞定,所有特定的芯片。有时您必须为外设启用时钟,这些时钟在复位时被禁用以节省功耗。然后,根据您要使用这些通用外设的模式,您必须根据应用程序设置它们。重复,直到完成所有这些设置。

然后您的应用程序可能必须执行初始化所需的操作,也许您在spi总线或总线上有温度传感器,显示器和SD卡。你必须与那些人讨论并根据他们的芯片规则和程序初始化这些外围设备。

最后几十到几万行代码,你的应用程序可以开始做任何事情。

arduino有一个引导加载程序,它是avr芯片的一个特性,当然也被arduino设计师和工具使用。如果您将其中一个引脚置为单向复位芯片,则会通过芯片中的某个功能将其引导加载程序作为应用程序加载。如果您以另一种方式断言该引脚然后重置,那么它将从应用程序闪存引导,运行您的应用程序。至少对于串行接口,AVR芯片系列有几种不同的方式进入引导加载程序或逻辑,可用于重新编程应用程序闪存"在电路中#34;。旧的arduino时代这是一个串口(uart)接口,有一个基于Atmel产品的简单协议,但是如果你真正查看它们的引导加载程序并编写自己的加载程序而不是使用它们,它们会大量删除它avrdude或Arduino沙箱。无论哪种方式,它都是一种非常常见的解决方案,微控制器倾向于有一种或多种方式进入芯片进行编程,然后在电路中进行编程,无论是引导加载程序还是逻辑或某种组合。

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

因此,您可以访问atmel网站,或者查看更简单的AVR微控制器,或者查看您的arduino并找到您拥有的芯片系列并下载资源。文档的名称因供应商而异,通常称为数据表的内容包括芯片引脚排列和引脚定义,部件的订购信息(部件号的选项,包括引脚数,闪存/内存量等)和电气信息。一些供应商的所有编程信息都在数据表中,数据表中有一些或者没有,您需要某种形式的参考手册或用户手册或其他名称,有时会有一本涵盖处理器内核或所有内容的系列手册。可能的外围设备然后数据表告诉你芯片可能的列表和它们所在的位置(处理器地址)。

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