STM32
直播中

岳臻俊

9年用户 1167经验值
私信 关注
[问答]

在STM32F103上运行正常的CRC代码,放到STM32F051上运行就触发HardFault怎么解决?

              在STM32F103上运行正常的CRC代码,放到STM32F051上运行就触发HardFault.
u32 CRC_CalcBlockCRC(u32 pBuffer[], u32 BufferLength)
{
  u32 index = 0;

  CRC_ResetDR();//RESET  CRC calculator
  for(index = 0; index < BufferLength; index++)
  {
    CRC->DR = pBuffer[index];
  }
  return (CRC->DR);
}

运行会出发HardFault(在STM32F103不会出现问题),

u32 CRC_CalcBlockCRC(u32 pBuffer[], u32 BufferLength)
{
  u32 index = 0;

  CRC_ResetDR();//RESET THE CRC calculator
  for(index = 0; index < BufferLength; index++)
  {
    CRC->DR = 1;//pBuffer[index];
  }
  return (CRC->DR);
} 改成一个固定的数字就没问题。大家有遇到这个问题吗,怎么解决呢?


回帖(1)

李红

2024-5-17 18:16:24
在STM32F103和STM32F051之间迁移CRC代码时,可能会遇到一些问题,因为这两个系列的微控制器在某些方面有所不同。在这种情况下,代码在STM32F103上运行正常,但在STM32F051上运行时触发HardFault。以下是一些可能的原因和解决方案:

1. **寄存器访问权限问题**:STM32F051可能对某些寄存器的访问权限有限制。请确保您的代码具有访问CRC寄存器的权限。您可以尝试在代码中添加以下宏定义来解决这个问题:

   ```c
   #define CRC_BASE ((uint32_t)0x40032000)
   #define CRC ((CRC_TypeDef *) CRC_BASE)
   ```

   然后,在您的CRC函数中使用这个定义:

   ```c
   CRC_ResetDR();
   ```

2. **时钟配置问题**:STM32F051可能需要不同的时钟配置才能正常工作。请确保您已经正确配置了时钟系统,特别是与CRC相关的时钟。您可以在初始化代码中添加以下代码来配置时钟:

   ```c
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
   ```

3. **中断问题**:如果您的代码在STM32F103上使用了中断,请确保在STM32F051上也正确配置了中断。这可能涉及到中断向量表、优先级和中断服务例程的配置。

4. **内存对齐问题**:STM32F051可能对内存对齐有更严格的要求。请确保您的`pBuffer`数组是4字节对齐的。如果需要,您可以在数组定义时添加`__attribute__((aligned(4)))`属性:

   ```c
   u32 pBuffer[] __attribute__((aligned(4)));
   ```

5. **代码优化问题**:编译器优化可能导致STM32F051上的问题。尝试在编译器设置中禁用优化,或者调整优化级别,看看是否能解决问题。

6. **硬件问题**:确保STM32F051硬件没有损坏或存在其他问题。您可以尝试使用其他代码或示例项目来验证硬件是否正常工作。

7. **库文件问题**:请确保您使用的是适用于STM32F051的正确库文件。错误的库文件可能导致寄存器定义错误或其他问题。

综上所述,解决这个问题需要检查多个方面,包括寄存器访问权限、时钟配置、中断配置、内存对齐、代码优化、硬件问题和库文件。通过逐步检查和调整这些方面,您应该能够找到导致HardFault的原因,并解决这个问题。
举报

更多回帖

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