mbed如何与外围设备通信

问题描述 投票:1回答:2

基于这个问题的答案:How does cpu communicate with peripherals?

我已经知道现代CPU通常使用类似于DMA的机制来与外围设备,IO设备等进行通信。

最近,我买了一块板,FRDM-K66F。正如其用户指南所述,该主板CPU基于ARM,并且已经安装了Mbed OS 5。

说到“数字输入/输出”功能,我只知道:

C ++程序 - > mbed库 - > GPIO API - > ...? - >硬件

我想澄清一下cpu如何在低级别范围内与外设一起工作? (从GPIO API到硬件,特别是在mbed的情况下)

在mbed-os库中是否有一些特殊变量声明对应mbed-board cpu中的特定寄存器?那么arm编译器可以将这些语句转换为特定的访问指令?

我不知道如何在Google中搜索此问题,因此如果有任何有用的参考或用户指南,请将其粘贴给我。

arm hardware mbed
2个回答
1
投票

简单的答案是多层次的抽象。 MBED是一个操作系统,旨在移植到许多不同供应商的许多设备:

  • MBED API定义了(在软件中)用户将如何指定对外围设备(如GPIO)的访问权限,包括与板级相关的抽象引脚名称。
  • MBED端口的供应商特定代码定义了一种适用于来自一个供应商/系列的所有部件的通用方法(可能有数百种不同的封装/外设组合,但供应商倾向于保持相同的外设功能。这包括内存映射外围设备,从其基地址引用。
  • 特定于器件的代码定义了每个外设所在的存储器映射中的位置,每个引脚的“友好”名称,以及任何特定于供应商的依赖性(例如启用特定GPIO的时钟要求以及这涵盖的引脚)。

因为它是通用的,所以代码并不总是最适合任何特定目的。它甚至可能不提供硬件提供的所有功能。目的是很容易添加对新设备的支持。

为了展示一些例子,我将引用Cortex-M3 DesignStart Eval目标的碎片。这只有有限数量的外围设备,如果你愿意,你也可以用verilog下载平台的源代码。这只是操作系统的几个部分,这些片段没有完全连接起来。

PinNames包含50引脚接口的EXPnn编号,以及GPIO备用功能引脚复用定义:

typedef enum {
    ALTERNATE_FUNC = 0, /* The pin is used for alternative function */
    GPIO_FUNC = 1       /* The pin is used for GPIO function */
} PinFunction;

gpio_api.c实现了标准API和内部逻辑之间的(有时是丑陋的)映射。例如,要初始化特定引脚,可以在数字和外设之间进行查找(基于每个GPIO的16个引脚):

void gpio_init(gpio_t *obj, PinName pin)
{
struct arm_gpio_dev_t *gpio_dev;

if (pin >= EXP0 && pin <= EXP51) {
    /* GPIO pins */
    switch (GPIO_DEV_NUMBER(pin)) {
    case GPIO0_NUMBER:
        gpio_dev = &ARM_GPIO0_DEV;
    break;
    }

    arm_gpio_init(gpio_dev);

    obj->gpio_dev = gpio_dev;
    obj->mps2_io_dev = NULL;
    obj->arm_mps2_io_write = NULL;
    obj->pin_number = GPIO_PIN_NUMBER(pin);
    /* GPIO is input by default */
    obj->direction = PIN_INPUT;
    return;
}

CM3DS.h中捕获设备的实际内存映射

#define CMSDK_GPIO0_BASE        0x40010000UL
#define CMSDK_GPIO1_BASE        0x40011000UL
#define CMSDK_GPIO2_BASE        0x40012000UL
#define CMSDK_GPIO3_BASE        0x40013000UL

0
投票

没有什么区别,也没有任何魔力,也没有什么特别的mbed使其成为特殊的。

答案在有关零件和纸板的文档中。你谷歌或去恩智浦寻找有问题的mcu:MK66FN2M0VMD18当然是你的链接。在那里,它将告诉你它是基于ARM的A cortex-m4专门,所以你想要到武器站点并获得埋在恩智浦芯片中的处理器核心的处理器细节。您将从您链接的站点获取相关板的文档,或者搜索板名称。

例如,该板的用户指南显示了SDA和SDL的陀螺仪连接,您可以使用微控制器的文档来了解该部件的I2C接口以及这些引脚上的接口和/或您只是咬了一下gpio。通常最好先咬一下然后尝试让mcu i2c外设在以后工作,如果需要的话。

板上的其余外围设备应在BOARD文档中描述,理想情况下是原理图。对于包括NXP MCU的电路板上的每个芯片,您可以访问各个供应商站点以获取每个芯片的信息,其中包括如何对其进行编程,以便陀螺仪例如在这种情况下您将转到NXP,因为它也是恩智浦芯片并获取该文档,了解如何编程等。

现在,这些信息和“mbed os”之间的区别是一堆驱动程序和操作系统层,在主板操作系统上的计算机上的浏览器上的这个网页层之间没有任何不同。板上通过电路板或电缆连接的一些芯片,以及通过电缆或连接器连接到其他电路板的其他物品(硬盘驱动器等)。

就像您的计算机一样,有关于那些接口和软件的接口和文档,这些接口和软件是使用这些接口,总线和协议的文档编写的。

恩智浦可能有像I2C这样的on(MCU)芯片外设的裸机库,希望有一些示例代码可以用于陀螺仪,因为我一直在挑选该芯片,但有时候没有,有时你必须自己编写,这就是微控制器世界的本质。

与此mbed一样,NXP可能以符合mbed os的方式编写代码(注意mbed裸机和mbed os可能是不同的接口)基本上为这个产品编写了芯片和板卡驱动程序。可能在恩智浦的网站上发布的不是在ARMs mbed网站上,但谁知道我没有使用mbed和CMSIS,所以很少看它。 NXP有兴趣提供该板的源代码,因为他们希望您使用该板制造产品并购买大量芯片,如果他们设置障碍,他们所做的就是向您出售一块或几块板被淘汰出局。这就是mcu世界的本质,它与主板世界不同,他们想要卖给你一块芯片和一块单板并称之为一天。微控制器供应商只有在我们每个人中购买数十至数十万个芯片的芯片时才能生存。为了让第N个人这样做,他们需要带有原理图和源代码的参考/评估平台,否则第N个人将使用ST或ti或其他提供原理图和源代码的供应商产品。

因此,您所询问的所有内容都记录在各个地方,这是一个基于ARM的芯片(而不是臂芯片),所以臂芯本身是由臂记录的。这是一个恩智浦芯片,所以芯片的其余部分是由恩智浦理想记录的,但可能还有其他购买的IP需要到供应商网站获取文档,在极少数情况下用于MCU但对于操作系统级芯片来说并不少见(如一个橙色pi上的allwinner芯片或覆盆子pi上的broadcom芯片)有一些购买的IP,NDA规定他们无法记录它,而且ip供应商不会给你没有你可能无法获得的NDA的文档(通常是USB,DDR) ,以及其他一些倾向于拥有这些秘密的ip类型)。你不应该在这些MCU上看到这个,很少有人会说这是一个兼容16550的uart,或者这是ARMs blahnumber uart,你必须谷歌。

如果在操作系统上运行,包括RTOS,至少一般都有例外。应用程序与apis交谈,后者与操作系统驱动程序通信,操作系统驱动程序与芯片中的外设(gpio,i2c,spi,uart,usb,定时器等)通信,其中一些使用芯片外部的外部电路板上的另一个项目或连接到董事会。应用程序,api和驱动程序的组合使得终端外围设备可以执行您所要求的任何操作,只要该软件设计正确并且没有错误。这与在您的计算机上编写程序没什么不同。这里没有魔力。

ARM与ARM或x86或计算机上使用的其他处理器没什么特别之处。在ARM和X86等通用处理器上有加载/存储(读/写)指令,确切的语法是特定的汇编程序,机器代码是特定于处理器的。正如您的其他链接所提到的,x86具有与存储器指令不同的I / O指令的概念,最终当时只是存储器接口上的单个引脚(I / O与存储器信号/引脚以及读取与写入信号/针等)。 ARM都是内存映射I / O,大多数情况下是x86,反向兼容性就在那里,您可以从intel上读取x86文档,了解它如何在芯片外部总线上实现。

与x86不同,ARM购买IP并埋藏在供应商芯片中,因此在这种情况下,ARM总线是NXP芯片的内部,在NXP内你有地址解码器,直接作为MCU很少或没有任何地址空间芯片外的地图。所以在NXP文档中你找到了NXP芯片特定的地址空间,这个特定的NXP芯片uart例如可能是特定于这个NXP芯片没有理由假设它与另一个NXP芯片相同并且当然不是相同的地址或者它如何工作或接口/寄存器作为使用相同ARM内核的非NXP芯片。片上外设均通过芯片内ARM总线上的加载和存储指令进行访问。恩智浦在ARM规则中定义了哪些地址与什么,闪存,内存和特定外设相关联。核心和片上外设之间也有中断连接,以完善其接口。

对于(RT)操作系统,它通常是操作系统中的驱动程序,与操作系统内的apis通信,最终成为加载和存储指令的一种,导致臂总线事务处理到基于地址传递的nxp芯片中的存储器控​​制器将事务处理到芯片中的处理程序(闪存,内存,特定外设)。

这个芯片的地址空间可以在NXP文档中找到,一些芯片供应商在一个文档中有地址空间,如数据表和在另一个文档中具有寄存器偏移的半通用外设的详细信息。但是每个供应商都做自己的事情,信息通常会有一些比其他人更糟糕(恩智浦相当不错,微芯片很糟糕,ST,TI相当不错)。从历史上看,恩智浦甚至会在寄存器描述中拥有寄存器的完整地址,其中大多数供应商的基地址都记录在该文档或其他文档的其他地方,并且外围文档仅显示基址的偏移量。

API只是有人设计好的,坏的或其他的API(不要认为供应商代码是好的,你可以从看到它看出来,它很少由“A”团队编写,通常是由有时被卡住的人写的它的好/好有时它不是)。操作系统驱动程序也是如此。

NXP的最佳利益是为这些电路板提供交钥匙应用,以展示其功能。但与这些产品的大多数消费者的计算机主板不同,MCU消费者理想地是开发者制造芯片+软件级产品以及像这样的软件+板级产品的产品。因此,尽管交钥匙应用程序很有趣,但我们并不是购买该软件板来运行该软件,因此从上到下的api文档,源代码等在某处可以理想地使用。 mbed是一个手臂的东西,所以这些软件你可能不得不从手臂而不是nxp。这取决于恩智浦选择打包的具体方式和内容。

© www.soinside.com 2019 - 2024. All rights reserved.