使用基本的嵌入式系统 API

Using basic Embedded Systems APIs

我正在尝试借助在线资源学习嵌入式系统,但我发现这非常困难。我对如何使用自动生成的 API 有一些疑问?我在 stm32cubeIDE 上使用 nucleo-f446re 开发板。 在看了很多在线讲座之后,举个例子,我能够理解如果我必须初始化一个 GPIO 引脚,我必须使用下面的代码序列,如下所示:

int main(void)
{
    HAL_Init();
    SystemClockConfig();
    GPIO_Init();                              // High Level GPIO Initialization
    while(1);
    

    return 0;
}    

void GPIO_Init(void)
{
    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitTypeDef ledgpio;
    ledgpio.Pin = GPIO_PIN_5;
    ledgpio.Mode = GPIO_MODE_OUTPUT_PP;
    ledgpio.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA,&ledgpio);
}
 void SystemClockConfig(void)
{
  
}

如GPIO_Init函数所示,有一个API的序列和使用的Handler函数。我的问题是,我应该继续记住 API 的顺序和使用的处理程序,并对其他外围设备(如定时器、Uart、CAN、PWM 等)做类似的事情,还是有其他方法?另外,如果我使用其他一些微控制器,用于与上述相同事物的 API 的顺序会相似还是有很大不同?请指导。

"the embedded systems"

定冠词的使用不合适-没有一个嵌入式平台,API或框架。

在您的问题中,“自动生成 APIs” 是 ST 的 STM32CubeMX 框架的一项特殊功能。初始化序列和 API 特定于 STM32 和 CubeMX/STM32 HAL API。它当然不是 STM32 的唯一 API - 您可以直接在 STM32xxxx.h 定义的寄存器级别对其进行编程,使用标准外设库(在 CubeMX 之前作为 ST 的 SDK 产品),或使用替代框架比如mbed.

如果您的目标不是 STM32,那么 CubeMX 对您来说完全不可用——其他供应商可能提供他们自己的专有框架——或者什么都不提供。例如,ARM CMSIS API 在 ARM Cortex M 设备上通用,与供应商无关。虽然 Mbed 适用于范围广泛的 ARM 目标,以及比 CMSIS 或 CubeMX 更高级别的生态系统。 Mbed 特定 COTS 开发板(如 ST 的 Nucleo 系列)最直接支持它。将它放在自定义硬件上需要稍微多一些工作。

如果您不使用基于 ARM 的微控制器,那么 Mbed 也不是一个选项,并且除了 ARM 之外,几乎没有跨平台、多供应商框架或 SDK。

本质上,对于裸机嵌入式系统,最常见的问题是通过其数据 sheet 和用户手册来熟悉特定目标,从可能的几个中选择开发工具链和 SDK/libraries/framework选项和 运行 它。

虽然所有嵌入式系统没有共同的API,但有普遍适用的共同原则、技术和模式,但肯定没有共同的API 或硬件初始化方法。关于这个主题有各种一般文本 - 在线资源往往特定于特定的框架或体系结构,许多在线课程也是如此(必然如此,因为主题过于宽泛)。

我的建议是像现在这样继续学习,但请注意,您正在学习的内容通常是嵌入式系统的一个具体而狭隘的方面,不要太拘泥于具体内容并接受一般原则。

学习某个库的工作原理是没有用的。相反,如果你真的想学习微控制器编程,你应该看看图书馆是如何在背后做事的,然后自己编写类似的代码。在这种情况下,将整个项目加载到一个体面的IDE。然后在这些函数调用中继续挖掘(在 ST 默认的基于 Eclipse 的 IDE 中,使用 F3 键)直到找到 HAL_GPIO_Init.

的定义

它很可能会写入至少 3 个不同的寄存器:

  • 用于I/O
  • 的实际数据寄存器
  • 用于说明引脚是输入还是输出的数据方向寄存器
  • 上拉up/down寄存器启用内部上拉电阻以防输入端口,也可能设置up/down

所有微控制器 GPIO 在功能方面都有些相似,因为它们具有上述寄存器的某种风格。通常还有一个中断使能寄存器 + 一个 rising/falling 中断边缘寄存器。

这些寄存器具体如何工作是特定于 MCU 的,所以一旦您从库代码中知道了寄存器的名称,您就可以去手册中查找它们并阅读它们应该如何使用。这是一个 32 bitter,所以它们将是 32 位寄存器。

更高端的微控制器(如ARM)也有各种路由寄存器,你必须设置,以便将某个硬件功能路由到某个引脚。这些往往很难正确处理,因此如果您有一些示例代码可供查看,这将节省大量时间。