操作FMC导致CPU复位
STM32F746IGT6 外扩了的16位数据总线的SDRAM(32MB),测试读写32位和16位数据都正确,但写8位数据时,cpu直接复位了(RCC->CSR为复位值)。这是啥原因啊?配置不正确?附上测试的代码如下,
SDRAM配置部分:
SDRAM_Timing.LoadToActiveDelay = 2;
SDRAM_Timing.ExitSelfRefreshDelay = 8;
SDRAM_Timing.SelfRefreshTime = 6;
SDRAM_Timing.RowCycleDelay = 9;
SDRAM_Timing.WriteRecoveryTime = 2;
SDRAM_Timing.RPDelay = 3;
SDRAM_Timing.RCDDelay = 3;
hsdram.Init.SDBank = FMC_SDRAM_BANK1;
hsdram.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9;
hsdram.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13;
hsdram.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;
hsdram.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
hsdram.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3;
hsdram.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
hsdram.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2;//FMC_SDRAM_CLOCK_PERIOD_2;
hsdram.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE;
hsdram.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0;//FMC_SDRAM_RPIPE_DELAY_0;
32位读写测试代码:
uint32_t temp0,temp1;
uint32_t j=1,k;
uint32_t i,n,err = 0;
while(1)
{
k = j =0;
__IO uint32_t* ptestbuf = (__IO uint32_t*)0xc0000000;
printf("write st.\n"); printf("ptestbuf=%x",(uint32_t) ptestbuf);
for(i=0;i<0x800000;i++)
{
//* (__IO uint8_t*)ptestbuf = j++;
//ptestbuf ++;
ptestbuf = j++;
for(n=0;n<10;n++);
//if(i/0x100 && (!(i%0x100)))
//printf("write i=%x",i);
//if(i==0)
//printf("write i=%x",i);
}
printf("read st.\n");
//OSTimeDly(10);
ptestbuf = (uint32_t *)0xc0000000;
for(i=0;i<0x800000;i++)
{
temp0 = ptestbuf;
if (temp0 != k)
break;
k++;
//ptestbuf ++;
}
if(i!=0x800000){
printf("Task4err =%dat TestWriteBuff[%d] = %d, j = %d\n",++err,i,temp0,k);
}
else
printf("Task4test ok,err =%d\n",err);
//j++;
//RunLedFlag(0);
printf("Tick=%d\n",HAL_GetTick());
for(i=0;i<1000000;i++);
}
如果在写入数据过程中没有 for(n=0;n<10;n++);这句话 ,则测试程序运行一段时间后,cpu也会复位,类似与总线缓存写爆的感觉。
8位读写测试代码:
uint8_t temp0,temp1;
uint8_t j=1,k;
uint32_t i,n,err = 0;
while(1)
{
k = j =0;
__IO uint8_t* ptestbuf = (__IO uint8_t*)0xc0000000;
printf("write st.\n"); printf("ptestbuf=%x",(uint32_t) ptestbuf);
for(i=0;i<0x800000;i++)
{
//* (__IO uint8_t*)ptestbuf = j++;
//ptestbuf ++;
ptestbuf = j++;
//if(i/0x100 && (!(i%0x100)))
//printf("write i=%x",i);
//if(i==0)
//printf("write i=%x",i);
}
printf("read st.\n");
//OSTimeDly(10);
ptestbuf = (uint8_t *)0xc0000000;
for(i=0;i<0x800000;i++)
{
temp0 = ptestbuf;
if (temp0 != k)
break;
k++;
//ptestbuf ++;
}
if(i!=0x800000){
printf("Task4err =%dat TestWriteBuff[%d] = %d, j = %d\n",++err,i,temp0,k);
}
else
printf("Task4test ok,err =%d\n",err);
//j++;
//RunLedFlag(0);
printf("Tick=%d\n",HAL_GetTick());
for(i=0;i<1000000;i++);
}
8位读写测试,写第一个数据的时候,CPU就直接复位了。
大家有遇到类似的问题吗?
求解决,求调试办法!
没仔细看代码,你确定指针没越位吗?
另外,建议逐行调试几遍找找在哪复位的。 1)不知道楼主有没有试过调用库函数的8bit读写函数是否有问题。
2)如果能确定是CPU复位了,可以在调试模式下看下RCC的状态寄存器里是什么原因导致的复位。
页:
[1]