STM32F1进入HardFault_Handler()

在做SRAM访问时,出现问题,问题代码如下:

主函数程序如下:

/* 
 * 函数名:main
 * 描述  : 主函数
 * 输入  :无
 * 输出  : 无
 */
int main(void)
{
    USART1_Config();
    printf("USART IS OK!\r\n");
    SysTick_Init();
    LED_GPIO_Init();
          
    LED_Turn(LEDALL,LED_OFF);
    printf("进入SRAM内存测试! \r\n");
    FSMC_SRAM_Test();
    printf("进入SRAM内存测试结束! \r\n");
          
    while(1)
    {
        LED_Turn(LED4,LED_ON);
        Delay_ms(500);
        LED_Turn(LED4,LED_OFF);
        Delay_ms(500);
    }  
}
16行的FSMC_SRAM_Test();函数内容如下:

/*
************************************************************************
  函数名称: void FMSC_SRAM_Test(void)
                FSMC_SRAM测试实例
  入口参数: None  
                
  返回数据: None
                
  其他说明:
                
  调用形式:     
************************************************************************
*/
void FSMC_SRAM_Test(void)
{
    u32 WriteReadStatus = 0, Index = 0;
    u16 TxBuffer[SRAM_BUFFER_SIZE];
    u16 RxBuffer[SRAM_BUFFER_SIZE];
                    
  printf("\n\rFSMC初始化 \r\n");
    //FSMC初始化
  FSMC_SRAM_Init();
  printf("\n\r 静态内存初始化完成!\r");
                    
  /*将写SRAM的数据BUFFER填充为从0x1234开始的连续递增的一串数据 */
  SRAM_Fill_Buffer(TxBuffer, SRAM_BUFFER_SIZE, 0x1234);
                    
  printf("\n\r 开始向静态内存写入数据 \r");  
  FSMC_SRAM_WriteBuffer(TxBuffer, SRAM_WRITE_READ_ADDR, SRAM_BUFFER_SIZE);
  printf("\n\r 静态内存写入数据完成!\r"); 
                    
  printf("\n\r 开始向静态内存读出数据\r"); 
    FSMC_SRAM_ReadBuffer(RxBuffer, SRAM_WRITE_READ_ADDR, SRAM_BUFFER_SIZE);  
  printf("\n\r 静态内存读出数据完成!\r");
                    
  printf("\n\r 校验写入的数据是否与读取的数据一致,是:DS1亮 否:DS2亮!\n\r");        
    for (Index = 0x00; (Index < SRAM_BUFFER_SIZE) && (WriteReadStatus == 0); Index++)
    {
        if (RxBuffer[Index] != TxBuffer[Index])
        {
            WriteReadStatus = Index + 1;
        }
        printf("%02x ",RxBuffer[Index]);
    }
                
    if (WriteReadStatus == 0)
    { 
        LED_Turn(LED1,LED_ON);
    }
    else
    { 
        LED_Turn(LED2,LED_ON);
    }
}
当屏蔽这个函数的时候,这个函数后面的程序就能执行。
但是不屏蔽时,能正常进入函数,21行的pintf()函数不能打印出来,但是能进入22行的FSMC_SRAM_Init();
但这个函数执行不两句就开始进入HardFault_Handler();
把进入HardFault_Handler()的发生语句屏蔽后,还是执行不两句就开始进入HardFault_Handler()
很是郁闷,从网上搜索结果,大致如下:

  • 内存溢出
  • 堆栈溢出,增加堆栈的大小
  • 数组越界
  • 错误的操作了硬件
  • 变量定义的位置对编译器造成影响
  • 指针指向系统不允许的地方,访问越界
  • JLINK的驱动版本问题
太多了说法,很乱,看来导致进入HardFault_Handler()函数的原因也是多种多样的。
我也针对,广大网友的说法,进行相应的调整,处理……结果都是一样的悲催。
后来,一个无意之举,解决了我点问题,将 FSMC_SRAM_Test()函数声明的两个数组,如下
u16 TxBuffer[SRAM_BUFFER_SIZE];
u16 RxBuffer[SRAM_BUFFER_SIZE];
把它们定义成全局变量,问题就解决了,很侥幸,也很幸运。
目测是分析导致问题如下:
  • 数组定义的不对,编译器对它做出的处理有问题。
  • 还有一个可能是我定义的数组太大了SRAM_BUFFER_SIZE为0XFF,大致内存出了问题,但是编译器又不能检测出。
也希望发生这个问题的朋友,交流一下,也让小弟学一招。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值