打印

STM32H7xx SDRAM在SystemInit()里初始化的一些问题分享

[复制链接]
492|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kaloulin|  楼主 | 2018-7-11 15:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看公司的代码(LINUX的)里面有[__attribute__((section(".dabdata")))]这样的东西,我就想改一下原子的mymalloc代码。之前是这样处理的[__attribute__((section(".ARM.__at_0xc0000000")))],不知道是不是因为我用的ARMCC6.10的问题,下载是会提示没有对应FLASH算法。

第一阶段:

写好分散加载文件,编译下载运行进Hardfault。调试发现没进main()就死机了,在Fault Report里面看到IMPRECISERR打√了,不精确的数据访问。

百度一下,发现SDRAM必须在main()前初始化好。

第二阶段:
在SystemInit()函数插入SDRAM初始化,编译下载运行,还是死机。
/* system startup
*/
    system_ClockConfig();
#if 1//defined(ExtSDRAM_ENABLE)
    ExtSDRAM_Init();
#endif //ExtSDRAM_ENABLE   

调试发现[__weak void HAL_SDRAM_MspInit(SDRAM_HandleTypeDef *hsdram)]这个函数似乎没有执行。
然后用[static void SDRAM_IOInit(void)]替代这个函数,编译下载运行OK没问题。

第三阶段:
上uCOS-II系统,编译下载,偶尔死机,按RESET键几次死机后就只能重新上电才能运行,或者下载完后就必须重新上电才能运行。
调试发现,死机后。
static void SDRAM_IOInit(void);
static void SDRAM_MPUInit(void);

uint8_t ExtSDRAM_Init(void)
{
    uint32_t temp = 0;
    uint8_t ret = 0;


        /* SDRAM IO&Clock Enable */
    SDRAM_IOInit();
    DelayUs(20);
    /* SDRAM FMC MPU Enable */
    SDRAM_MPUInit();
    DelayUs(20);


    /*  SDRAM init sequence
    */

    .........
}
红色的两个函数并没有执行,重新上电后是好的。
然后把static去掉,编译下载运行完全没问题,无论是下载完运行,还是狂按RESET按键重启。但是在没有uCOS-II的时候是没问题,没搞懂这个。

现在malloc这部分是这么写的:

*********
/************* ARMCC Link *****************/
#define _SRAM12_RW      __attribute__((section(".SRAM12")))
#define _SRAM4_RW       __attribute__((section(".SRAM4")))
#define _ITCM_RW        __attribute__((section(".ITCM")))
#define _DTCM_RW        __attribute__((section(".DTCM")))
#ifdef ExtSDRAM_ENABLE
#define _EXTSDRAM_RW    __attribute__((section(".ExtSDRAM")))
#endif //ExtSDRAM_ENABLE

********
__ALIGNED(4) uint8_t AXISRAM_BASE[AXISRAM_MALLOC_SIZE]; //default system SRAM
             uint32_t AXISRAM_MAP[AXISRAM_MAPTAB_SIZE];


__ALIGNED(4) uint8_t AHBSRAM12_BASE[AHBSRAM12_MALLOC_SIZE] _SRAM12_RW;
             uint32_t AHBSRAM12_MAP[AHBSRAM12_MAPTAB_SIZE] _SRAM12_RW;


__ALIGNED(4) uint8_t AHBSRAM4_BASE[AHBSRAM4_MALLOC_SIZE] _SRAM4_RW;
                         uint32_t AHBSRAM4_MAP[AHBSRAM4_MAPTAB_SIZE] _SRAM4_RW;


__ALIGNED(4) uint8_t DTCM_BASE[DTCM_MALLOC_SIZE] _DTCM_RW;
                         uint32_t DTCM_MAP[DTCM_MAPTAB_SIZE] _DTCM_RW;


__ALIGNED(4) uint8_t ITCM_BASE[ITCM_MALLOC_SIZE] _ITCM_RW;
                         uint32_t ITCM_MAP[ITCM_MAPTAB_SIZE] _ITCM_RW;


#if defined(ExtSDRAM_ENABLE)
__ALIGNED(4) uint8_t SDRAM_BASE[SDRAM_MALLOC_SIZE] _EXTSDRAM_RW;
                         uint32_t SDRAM_MAP[SDRAM_MAPTAB_SIZE] _EXTSDRAM_RW;
//__ALIGNED(4) uint8_t SDRAM_BASE[SDRAM_MALLOC_SIZE] __attribute__((section(".ARM.__at_0xc0000000")));
//             uint32_t SDRAM_MAP[SDRAM_MAPTAB_SIZE] __attribute__((section(".ARM.__at_0xc1900000")));                        
#endif //ExtSDRAM_ENABLE


本人只在STM32F103上写过一些uCOS-II和FATFS的一些代码,本来就没啥经验。这个问题从上上个月开始就一直困扰着我,本来打算直接用指针算了,没那么多破事,但是想想还是解决算了。
就断断续续的,一边调其他代码一边处理这个问题。

有什么不对的,请轻喷,毕竟经验能力有限。

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

439

主题

448

帖子

0

粉丝