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

操作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扩展软件包
关注我们
st-img 微信公众号
st-img 手机版