你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

操作FMC导致CPU复位

[复制链接]
啊华田 提问时间:2017-2-18 09:29 /
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就直接复位了。
大家有遇到类似的问题吗?
求解决,求调试办法!
收藏 1 评论2 发布时间:2017-2-18 09:29

举报

2个回答
moyanming2013 回答时间:2017-2-18 14:29:34
没仔细看代码,你确定指针没越位吗?
另外,建议逐行调试几遍找找在哪复位的。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

creep 回答时间:2017-2-18 20:36:32
1)不知道楼主有没有试过调用库函数的8bit读写函数是否有问题。
2)如果能确定是CPU复位了,可以在调试模式下看下RCC的状态寄存器里是什么原因导致的复位。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版