打印
[STM32F0]

为什么第 13 行的代码会导致 Hard Fault?

[复制链接]
117|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小库里|  楼主 | 2025-5-30 23:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#include "stm32f0xx.h"void SysInit(void); uint8_t array1[260] = {0};uint8_t array2[260] = {0};uint16_t test;int main(void) {        SysInit();        for(uint16_t i = 0; i < 260; i++)                array1[i] = i & 0xFF;        test = *(uint16_t*)&array1[0xEA];        test = *(uint16_t*)&array1[0xEC];        test = *(uint16_t*)&array1[0xEB];        while(1);}void SysInit(void) {        FLASH->ACR |= FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;        RCC->CR2 |= RCC_CR2_HSI48ON;        while(!(RCC->CR2 & RCC_CR2_HSI48RDY)) {};        RCC->CFGR &= ~(RCC_CFGR_PPRE | RCC_CFGR_HPRE | RCC_CFGR_SW);        RCC->CFGR |= RCC_CFGR_PPRE_DIV16 | RCC_CFGR_HPRE_DIV1 | RCC_CFGR_SW_HSI48;        while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI48) {};        RCC->CFGR &= ~RCC_CFGR_PPRE;        RCC->CFGR |= RCC_CFGR_PPRE_DIV1;        SystemCoreClockUpdate();}

数组array1 的所有其他有效读数都正常工作( 0xEB 除外)。几乎尝试了所有方法。(volatile、optimizer、additional variables、memory aglin 等)
此代码可在其他 ARM 设备上正常工作。




使用特权

评论回复
沙发
yzdel7| | 2025-5-31 16:58 | 只看该作者
你把8位数组的地址强制转换成16位整型的指针,指针是按两个字节寻址的,0xEB其实已经数组越界了,至于说为什么Hard Fault,这可能跟编译器有关。

使用特权

评论回复
板凳
t60yz| | 2025-5-31 23:38 | 只看该作者
尝试读取非对齐地址将导致 硬件 HardFault,或者 读取失败(返回错误数据),视编译器行为和内存对齐策略而定。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

15

帖子

0

粉丝