Warm tip: This article is reproduced from serverfault.com, please click

c-使用基本的嵌入式系统API

(c - Using basic Embedded Systems APIs)

发布于 2020-11-29 06:14:57

我想借助在线资源来学习嵌入式系统,但是我发现这非常困难。我对如何使用自动生成的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和处理程序的顺序,并对其他外围设备(如Timers,Uart,CAN,PWM等)执行类似的操作,还是有其他方法?另外,如果我使用其他微控制器,用于与上述相同的事物的API的顺序是否会相似或相差很多?请指导。

Questioner
Manu Chaudhary
Viewed
11
Clifford 2020-11-29 22:00:19

嵌入式系统”

使用定冠词是不合适的-没有一个嵌入式平台,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也不是一种选择,并且针对ARM以外的体系结构的跨平台,多供应商框架或SDK也很少(如果有的话)。

本质上,对于裸机嵌入式系统来说,最常见的问题是通过其数据表和用户手册熟悉特定的目标,从可能的多个选项中选择一个开发工具链和SDK /库/框架,并与之一起运行。

尽管没有适用于所有嵌入式系统的通用API,但存在通用的通用原理,技术和模式,但是肯定没有通用API或硬件初始化方法。关于该主题,有各种通用的文章-在线资源往往是特定于特定的框架或体系结构的,许多在线课程也是如此(因为主题过于广泛,所以必定如此)。

我的建议是按原样继续进行,但是要知道,你所学的内容通常是嵌入式系统的一个特定而狭窄的方面,并且不要太拘泥于特定的规则并接受通用的原则。