STM32
直播中

风尚男人

8年用户 909经验值
私信 关注
[问答]

求助,STM32f0上为什么uint32_t赋值会hardfault?

uint8_t nnn[]={0x12,0x34,0x56,0x78,0,0,0};
uint8_t* pbuf = nnn;
pbuf +=2;
uint8_t nData = *pbuf; // ok!
uint16_t nData = *((uint16_t*)pbuf); // ok!
uint32_t nData = *((uint32_t*)pbuf);// hardfault!

为何uint32_t赋值会hardfault?

回帖(2)

李耀鑫

2024-4-8 11:20:57
把nnn改成8个长度是不是就正常了?目前还使用的是7个元素。32位对齐,至少得是4的倍数吧。
举报

杨海清

2024-4-8 15:38:30
在STM32F0上,当将一个uint8_t类型的指针pbuf通过强制类型转换为uint32_t指针后,再对其解引用赋值给一个uint32_t类型的变量nData时,会导致硬件错误(Hard Fault)的发生。

这是因为STM32F0系列的微控制器是基于ARM Cortex-M0内核的,而Cortex-M0内核只能以"aligned access"方式读取和写入内存。"aligned access"是指数据访问时必须按照数据类型的字节对齐方式进行,否则会导致硬件错误。

在这个例子中,当将一个uint32_t类型的指针pbuf解引用赋值给nData时,由于pbuf指针指向的地址并不是4字节对齐的(从最低的地址开始,pbuf指向的是0x56这个字节,而uint32_t类型的字节对齐要求是从地址的最低2位开始是00),这就会导致硬件错误发生。

为了解决这个问题,你可以通过将数据复制到一个字节对齐的临时变量中,再将该变量的值赋给nData,或者通过按字节解析的方式将数据复制到nData中。

以下是一个可能的解决方案示例:

uint32_t tempData;
memcpy(&tempData, pbuf, sizeof(uint32_t));
uint32_t nData = tempData;

或者:

uint32_t nData = (uint32_t)pbuf[0] | ((uint32_t)pbuf[1] << 8) | ((uint32_t)pbuf[2] << 16) | ((uint32_t)pbuf[3] << 24);
举报

更多回帖

发帖
×
20
完善资料,
赚取积分