woshi_ziyu
发表于: 2015-9-24 14:21:29 | 显示全部楼层

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

主函数程序如下:

  1. /*
  2. * 函数名:main
  3. * 描述  : 主函数
  4. * 输入  :无
  5. * 输出  : 无
  6. */
  7. int main(void)
  8. {
  9.     USART1_Config();
  10.     printf("USART IS OK!\r\n");
  11.     SysTick_Init();
  12.     LED_GPIO_Init();
  13.          
  14.     LED_Turn(LEDALL,LED_OFF);
  15.     printf("进入SRAM内存测试! \r\n");
  16.     FSMC_SRAM_Test();
  17.     printf("进入SRAM内存测试结束! \r\n");
  18.          
  19.     while(1)
  20.     {
  21.         LED_Turn(LED4,LED_ON);
  22.         Delay_ms(500);
  23.         LED_Turn(LED4,LED_OFF);
  24.         Delay_ms(500);
  25.     }  
  26. }

复制代码

16行的FSMC_SRAM_Test();函数内容如下:

  1. /*
  2. ************************************************************************
  3.   函数名称: void FMSC_SRAM_Test(void)
  4.                 FSMC_SRAM测试实例
  5.   入口参数: None  
  6.                
  7.   返回数据: None
  8.                
  9.   其他说明:
  10.                
  11.   调用形式:     
  12. ************************************************************************
  13. */
  14. void FSMC_SRAM_Test(void)
  15. {
  16.     u32 WriteReadStatus = 0, Index = 0;
  17.     u16 TxBuffer[SRAM_BUFFER_SIZE];
  18.     u16 RxBuffer[SRAM_BUFFER_SIZE];
  19.                     
  20.   printf("\n\rFSMC初始化 \r\n");
  21.     //FSMC初始化
  22.   FSMC_SRAM_Init();
  23.   printf("\n\r 静态内存初始化完成!\r");
  24.                     
  25.   /*将写SRAM的数据BUFFER填充为从0x1234开始的连续递增的一串数据 */
  26.   SRAM_Fill_Buffer(TxBuffer, SRAM_BUFFER_SIZE, 0x1234);
  27.                     
  28.   printf("\n\r 开始向静态内存写入数据 \r");  
  29.   FSMC_SRAM_WriteBuffer(TxBuffer, SRAM_WRITE_READ_ADDR, SRAM_BUFFER_SIZE);
  30.   printf("\n\r 静态内存写入数据完成!\r");
  31.                     
  32.   printf("\n\r 开始向静态内存读出数据\r");
  33.     FSMC_SRAM_ReadBuffer(RxBuffer, SRAM_WRITE_READ_ADDR, SRAM_BUFFER_SIZE);  
  34.   printf("\n\r 静态内存读出数据完成!\r");
  35.                     
  36.   printf("\n\r 校验写入的数据是否与读取的数据一致,是:DS1亮 否:DS2亮!\n\r");        
  37.     for (Index = 0x00; (Index < SRAM_BUFFER_SIZE) && (WriteReadStatus == 0); Index++)
  38.     {
  39.         if (RxBuffer[Index] != TxBuffer[Index])
  40.         {
  41.             WriteReadStatus = Index + 1;
  42.         }
  43.         printf("%02x ",RxBuffer[Index]);
  44.     }
  45.                
  46.     if (WriteReadStatus == 0)
  47.     {
  48.         LED_Turn(LED1,LED_ON);
  49.     }
  50.     else
  51.     {
  52.         LED_Turn(LED2,LED_ON);
  53.     }
  54. }
复制代码

当屏蔽这个函数的时候,这个函数后面的程序就能执行。

但是不屏蔽时,能正常进入函数,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,大致内存出了问题,但是编译器又不能检测出。

也希望发生这个问题的朋友,交流一下,也让小弟学一招。

跳转到指定楼层
如果你能看到我的世界里那些渐渐消逝的美好,你就能体会到现在所拥有的幸福。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 28 | 回复: 50



手机版|

GMT+8, 2024-4-26 22:04 , Processed in 0.036569 second(s), 5 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表