【问题标题】:Test driven development using ARM vendors HAL使用 ARM 供应商 HAL 进行测试驱动开发
【发布时间】:2018-08-09 22:24:54
【问题描述】:

我正在使用测试驱动开发方法用 C 语言编写传感器驱动程序。驱动程序将用于使用 STM32F415 ARM 处理器的项目中。项目是使用 CubeMX 软件生成的,该软件还为各种外围设备生成供应商特定的硬件抽象层文件。我将在我的传感器驱动程序中使用为 SPI 通信协议生成的文件 stm32f4xx_hal_spi.h 和相应的源文件。

我的目标是为 SPI 接口创建一个模拟,然后测试驱动我的传感器驱动程序。我还想尽可能从我的驱动程序代码中抽象出 SPI HAL。原因是相同的驱动程序还必须支持 I2C 协议,因此理想情况下它们可以轻松交换。这也是我想避免将 SPI HAL 文件直接复制到我的传感器驱动程序中的原因。

我最初的方法是创建一个单独的头文件spi_interface.h 并使用它来重新声明我需要来自stm32f4xx_hal_spi.h 的函数。然后我会从这个头文件生成一个模拟。这将允许我测试驱动程序接口的其余部分。

但是,SPI HAL 函数比我最初想象的要复杂。这是一个例子:

HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);

我的问题与 SPI HAL 函数用作参数的 SPI_HandleTypeDef 结构有关:

typedef struct __SPI_HandleTypeDef
{
  SPI_TypeDef                *Instance;    /* SPI registers base address */

  SPI_InitTypeDef            Init;         /* SPI communication parameters */

  uint8_t                    *pTxBuffPtr;  /* Pointer to SPI Tx transfer Buffer */

  uint16_t                   TxXferSize;   /* SPI Tx Transfer size */

  __IO uint16_t              TxXferCount;  /* SPI Tx Transfer Counter */

  uint8_t                    *pRxBuffPtr;  /* Pointer to SPI Rx transfer Buffer */

  uint16_t                   RxXferSize;   /* SPI Rx Transfer size */

  __IO uint16_t              RxXferCount;  /* SPI Rx Transfer Counter */

  void                       (*RxISR)(struct __SPI_HandleTypeDef * hspi); /* function pointer on Rx ISR */

  void                       (*TxISR)(struct __SPI_HandleTypeDef * hspi); /* function pointer on Tx ISR */

  DMA_HandleTypeDef          *hdmatx;      /* SPI Tx DMA Handle parameters   */

  DMA_HandleTypeDef          *hdmarx;      /* SPI Rx DMA Handle parameters   */

  HAL_LockTypeDef            Lock;         /* Locking object                 */

  __IO HAL_SPI_StateTypeDef  State;        /* SPI communication state */

  __IO uint32_t              ErrorCode;    /* SPI Error code */

}SPI_HandleTypeDef;

它由多个其他结构组成,这让我认真思考这里的正确方法。在模拟供应商 HAL 接口时,是否有一种完善的处理结构的方法?我是否将所有需要的struct 定义复制到我的spi_interface.h?我的初始计划在这种情况下有效吗?

【问题讨论】:

  • Bloatware HAL 来编写另一个不必要的抽象级别。 IMO 的想法 100% 错误。 uC 编程需要完全不同的方法。如果你想在硬件(寄存器)级别编写自己的抽象层程序 uC

标签: c unit-testing tdd


【解决方案1】:

在 Google 上搜索“SPI bit bash”或“SPI bit bang”,然后将其移植到 STM32。您真正应该做的唯一移植是将要移植到 STM 的代码的 GPIO 层换掉。因此,请寻找将这部分抽象出来并让您轻松交换这部分的代码。我想你可以试试 Maxim 的this driver。只需移植 spiReadReg ()spiWriteReg() 函数即可。

首先,您可以将SPI_CS = 1; 之类的内容替换为GPIO_SetBits(YOUR_SPI_PORT, YOUR_GPIO_CS_PIN); 之类的内容。

使用 SPI,您操作总线的速度有多慢都没有关系。您可以随心所欲地放慢速度,然后逐步提高速度,直到发现错误为止。

对于 I2C,我已成功将 this driver 从 Microchip 移植到 STM32F,并使其与 TI 的基于 I2C 的电池平衡器/监视器一起工作。如果您正在使用的代码足够简单,那么它应该是一项简单且相对轻松的工作,即使不是有趣的工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    相关资源
    最近更新 更多