
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 =%d at 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 =%d at 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就直接复位了。 大家有遇到类似的问题吗? 求解决,求调试办法! |
另外,建议逐行调试几遍找找在哪复位的。
评分
查看全部评分
2)如果能确定是CPU复位了,可以在调试模式下看下RCC的状态寄存器里是什么原因导致的复位。
评分
查看全部评分