使用基本的嵌入式系统 API

Man*_*ary 0 c embedded microcontroller

我正在尝试借助在线资源来学习嵌入式系统,但我发现这非常困难。我对如何使用自动生成的 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)
{
  
}
Run Code Online (Sandbox Code Playgroud)

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

Cli*_*ord 5

嵌入式系统”

在那里使用定冠词是不合适的——没有一个嵌入式平台、API 或框架。

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

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

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

从本质上讲,对于裸机嵌入式系统,通常需要通过其数据表和用户手册熟悉特定目标,从可能的多个选项中选择开发工具链和 SDK/库/框架并使用它运行。

虽然没有适用于所有嵌入式系统的通用 API,但存在普遍适用的通用原则、技术和模式,但肯定没有通用的 API 或硬件初始化方法。关于该主题有各种通用文本 - 在线资源往往特定于特定的框架或架构,许多在线课程也是如此(必然如此,否则该主题太广泛了)。

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