STM32坑分享——之SPI读写外部Flash引发HardWare Fault

程序要从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。

相关推荐
_探索_7 小时前
STM32U5F7VJT6Q (Cortex-M33, 160MHz) TouchGFX统计MCU占用率和FPS
stm32·单片机·嵌入式硬件
浩子智控7 小时前
zynq嵌入式开发(2)—基本开发测试实例
linux·嵌入式硬件·硬件架构
猫猫的小茶馆8 小时前
【Linux 驱动开发】Linux 内核启动过程详解
linux·c语言·arm开发·驱动开发·stm32·单片机·mcu
辰哥单片机设计8 小时前
STM32太阳能光伏板
stm32·单片机·嵌入式硬件
mftang8 小时前
MCU上应用的主流NVM技术: 嵌入式相变存储器(PCM) 和嵌入式磁阻随机存取存储器(MRAM)
单片机·嵌入式硬件·pcm
炸膛坦客8 小时前
Cortex-M3-STM32F1 开发:(五十四)CAN(车企会用),难但很重要
stm32·单片机·嵌入式硬件
willhuo8 小时前
RS485回响程序设计方案
单片机·lua
项目題供诗8 小时前
51单片机入门-LED点阵屏(九)
单片机·嵌入式硬件·51单片机
恶魔泡泡糖8 小时前
51单片机ADC模数转换
单片机·嵌入式硬件·51单片机
项目題供诗8 小时前
51单片机入门-DS1302时钟(十)
单片机·嵌入式硬件·51单片机