Embedded UART、SPI、I2C等实现是否通用?

Embedded UART、SPI、I2C等实现是否通用?,embedded,Embedded,是否可以创建一个通用文件,例如uart.c,以便调用不同微控制器的uart函数,例如avr和arm?或者,对于每个微控制器,我必须从头开始创建uart功能吗?不同供应商的硬件实现和注册接口肯定不同。ARM不生产MCU,因为它们许可核心-外围设备不由核心定义,因此即使在ARM设备中,不同供应商的外围设备实现也不同 您可以定义一个通用的设备层接口,并为您需要的每个设备系列实现该接口,然后您可以跨体系结构重用应用层代码 另一种选择是坚持一个共同的家庭。例如,AVR覆盖范围广泛的设备,并且外围设备通常在

是否可以创建一个通用文件,例如uart.c,以便调用不同微控制器的uart函数,例如avr和arm?或者,对于每个微控制器,我必须从头开始创建uart功能吗?

不同供应商的硬件实现和注册接口肯定不同。ARM不生产MCU,因为它们许可核心-外围设备不由核心定义,因此即使在ARM设备中,不同供应商的外围设备实现也不同

您可以定义一个通用的设备层接口,并为您需要的每个设备系列实现该接口,然后您可以跨体系结构重用应用层代码

另一种选择是坚持一个共同的家庭。例如,AVR覆盖范围广泛的设备,并且外围设备通常在整个范围内都很常见。类似地,STM32(ARM Cortex-M)设备在整个范围内共享公共外围设备

因此答案是否定的,但您可以通过抽象硬件(或供应商提供的抽象或设备层)来处理这个问题


对于UART,您可以使用stdio作为抽象层,并通过
fprintf
fputchar
fread
fwrite
等访问设备。尽管通常您也会在较低的层上构建它。

您可以创建硬件抽象层(HAL)作为所有同类硬件的通用接口。正确设计的HAL允许移植应用层代码,这是拥有HAL的唯一目的

HAL应该是一个API库的形式,然后作为如何设计驱动程序的头文件模板,这是“多态性”的最简单形式。应用程序程序员调用HAL,然后将调用驱动程序中特定于MCU的函数

对于UART,您可能有一个init函数,它以波特率、停止位、奇偶校验、握手等作为参数。然后是一个读函数和一个写函数,以及一些错误处理。例如,溢出和帧错误是普遍存在的。然后由MCU“x”的特定驱动程序根据指定的HAL自行实现


一般来说,不应该不必要地创建操作层。这是一项相当合格的工作,很容易出错。如果您不需要项目之间的可移植性或代码重用,那么显然不需要HAL,您也可以直接从应用程序代码调用驱动程序。

一些框架已经解决了这一问题。命名一个流行函数:。您仍然可以抽象基本函数,如读、写、打开、关闭(例如使用函数指针)。根据您的协议,您可以在源代码(C)可以轻松交换的同时保持头文件不变。ST、Atmel和其他人提供的大型库就是一些设计错误的HAL,它们所谓的“HAL”只是围绕寄存器访问的一堆包装。而不是独立于MCU的函数隐藏整个硬件外围功能,而不仅仅是寄存器写入。值得注意的是,硅供应商对为您提供脱离其MCU的方式兴趣不大,因此他们对提供这些蹩脚的潜在“HAL”有私利。