|
在做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,大致内存出了问题,但是编译器又不能检测出。 也希望发生这个问题的朋友,交流一下,也让小弟学一招。 |