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