Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用基本嵌入式系统API_C_Embedded_Microcontroller - Fatal编程技术网

C 使用基本嵌入式系统API

C 使用基本嵌入式系统API,c,embedded,microcontroller,C,Embedded,Microcontroller,我试图借助在线资源学习嵌入式系统,但我发现这非常困难。我有一些关于如何使用自动生成的API的问题?我正在使用stm32cubeIDE上的核子-f446re开发板。 例如,在经历了大量在线讲座之后,我能够理解,如果我必须初始化GPIO引脚,我必须使用以下代码序列,如下所示: int main(void) { HAL_Init(); SystemClockConfig(); GPIO_Init(); // High L

我试图借助在线资源学习嵌入式系统,但我发现这非常困难。我有一些关于如何使用自动生成的API的问题?我正在使用stm32cubeIDE上的核子-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和处理函数。我的问题是,我应该继续记住使用的API和处理程序的顺序,并对其他外设(如定时器、Uart、CAN、PWM等)执行类似的操作,还是有其他方法?此外,如果我使用其他微控制器,用于上述相同事情的API序列会相似还是有很大不同?请导游

嵌入式系统”

使用定冠词是不合适的——没有一个嵌入式平台、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的核仁系列)提供最直接的支持。将其放在定制硬件上需要稍微多做一些工作

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

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

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


我的建议是继续你现在的样子,但要知道,你所学的是嵌入式系统的一个特定的、狭隘的方面,不要过于拘泥于特定的方面,而接受一般的原则。

学习某个库是如何工作的是毫无用处的。相反,如果你真的想学习微控制器编程,你应该看看库是如何做的,然后自己写类似的代码。在这种情况下,将整个项目加载到一个合适的IDE中。然后在这些函数调用中继续挖掘(在ST默认的基于Eclipse的IDE中,使用F3键),直到找到
HAL\u GPIO\u Init
的定义

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

  • 用于I/O的实际数据寄存器
  • 用于说明引脚应输入还是输出的数据方向寄存器
  • 上拉/下拉寄存器在端口输入时启用内部拉电阻,也可能设置上拉/下拉
所有的微控制器GPIO在功能方面都有点类似,因为它们具有上述寄存器的一些特性。通常还有一个中断启用寄存器+一个用于中断的上升/下降沿寄存器

这些寄存器的具体工作方式是特定于MCU的,因此,一旦您从库代码中知道寄存器的名称,您就可以在手册中查找并阅读它们的使用方法。这是一个32位寄存器,因此它们将是32位寄存器


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

@old\u timer:虽然我很欣赏拼写错误的修复,但如果你不介意的话,我会坚持使用英式英语拼写;-)。美国拼字法使得在拼字游戏中使用Z比其10分的字母分数更容易——这会破坏游戏。我的道歉者没有意识到这是英国拼字法,皮质被弄坏了,所以当我开始拼字时,我在路上右击了几下。@old_timer没问题,我会说两种语言——英语和美国;-)这是有意义的现在取决于计算机,网站或其他什么,我已经看到了z和s的东西在过去的几年里,现在我对一些单词的拼写提出了疑问…在计算机开始尝试帮助之前…底线是两者都是对的(也都是错的)…这可能是我对其他人的第一次编辑,这是我打算修复的皮质打字错误…你的编码问题是什么?因为如果是“我必须学会成功吗?”那么答案是肯定的。嵌入式工作要求很高。您不恰当地称之为“API”的东西,在单个制造商的零件线中往往并不完全一致。您使用的HAL函数因错误和臃肿而闻名。谢谢@TomServo。我明白你的意思。需要使用Refe从头开始编写所有api