程序要从W25Q128这个芯片读数据,这个驱动程序平时用的挺好的。然后最近程序就有那么第一段代码。执行到读数据时就HardWare Fault了。
追查原因时发现给函数传递的数组指针问题,比如定义一个数组 uint8_t buf[10]
如果把&buf[0]作为读写函数的参数就没事,把&buf[1]作为参数就不行了/
因为STM32的hal库的spi通信程序有个要求,如下:
HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
#if (USE_SPI_CRC != 0U)
__IO uint16_t tmpreg = 0U;
#endif /* USE_SPI_CRC */
uint32_t tickstart = 0U;
HAL_StatusTypeDef errorcode = HAL_OK;
if ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) || (Size > 1U))
{
/* in this case, 16-bit access is performed on Data
So, check Data is 16-bit aligned address */
assert_param(IS_SPI_16BIT_ALIGNED_ADDRESS(pData));
}
if ((hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES))
{
hspi->State = HAL_SPI_STATE_BUSY_RX;
/* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */
return HAL_SPI_TransmitReceive(hspi, pData, pData, Size, Timeout);
}
就是标红的那里,要求数组指针的地址必须是2字节对齐的,否则就hardWare fault。