打印
[新唐博主]

新唐M480 SPIM执行程序(外部flash执行程序)

[复制链接]
3790|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2021-10-1 18:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
执行程序前,需要将SPIM进行初始化,代码如下:


/*************************************************************************************************************
* 文件名                :        m48x_spim.c
* 功能                        :        m48X SPIM驱动
* 作者                        :        cp1300@139.com
* 创建时间                :        2021-09-24
* 最后修改时间        :        2021-09-24
* 详细                        :        只支持W25Q系列flash,并且需要falsh支持4线模式,并且均不支持4字节地址模式,地址24bit
                                        SS设置必须与官方例程一样,否则会导致直接内存映射模式下无法读取flash
*************************************************************************************************************/
#include "m48x_map.h"
#include "system.h"
#include "m48x_spim.h"

//SPIM IO口选择
#define SPIM_IO_PA0_5       0   //使用PA0.5
#define SPIM_IO_PC0_5       1   //使用PC0.5
#define SPIM_IO_PE2_7       2   //使用PE2.7
#define SPIM_IO_PG9_14      3   //使用PG9.14
#define SPIM_IO_SELECT      SPIM_IO_PC0_5



/* Flash opcodes. */
#define OPCODE_WREN             0x06U   /* Write enable */
#define OPCODE_RDSR             0x05U   /* Read status register #1*/
#define OPCODE_WRSR             0x01U   /* Write status register #1 */
#define OPCODE_RDSR2            0x35U   /* Read status register #2*/
#define OPCODE_WRSR2            0x31U   /* Write status register #2 */
#define OPCODE_RDSR3            0x15U   /* Read status register #3*/
#define OPCODE_WRSR3            0x11U   /* Write status register #3 */
#define OPCODE_PP               0x02U   /* Page program (up to 256 bytes) */
#define OPCODE_SE_4K            0x20U   /* Erase 4KB sector */
#define OPCODE_BE_32K           0x52U   /* Erase 32KB block */
#define OPCODE_CHIP_ERASE       0xc7U   /* Erase whole flash chip */
#define OPCODE_BE_64K           0xd8U   /* Erase 64KB block */
#define OPCODE_READ_ID          0x90U   /* Read ID */
#define OPCODE_RDID             0x9fU   /* Read JEDEC ID */
#define OPCODE_BRRD             0x16U   /* SPANSION flash - Bank Register Read command  */
#define OPCODE_BRWR             0x17U   /* SPANSION flash - Bank Register write command */
#define OPCODE_NORM_READ        0x03U   /* Read data bytes */
#define OPCODE_FAST_READ        0x0bU   /* Read data bytes */
#define OPCODE_FAST_DUAL_READ   0x3bU   /* Read data bytes */
#define OPCODE_FAST_QUAD_READ   0x6bU   /* Read data bytes */

/* Used for SST flashes only. */
#define OPCODE_BP               0x02U   /* Byte program */
#define OPCODE_WRDI             0x04U   /* Write disable */
#define OPCODE_AAI_WP           0xadU   /* Auto u32Address increment word program */

/* Used for Macronix flashes only. */
#define OPCODE_EN4B             0xb7U   /* Enter 4-byte mode */
#define OPCODE_EX4B             0xe9U   /* Exit 4-byte mode */

#define OPCODE_RDSCUR           0x2bU
#define OPCODE_WRSCUR           0x2fU

#define OPCODE_RSTEN            0x66U
#define OPCODE_RST              0x99U

#define OPCODE_ENQPI            0x38U
#define OPCODE_EXQPI            0xFFU

/* Status Register bits. */
#define SR_WIP                  0x1U    /* Write in progress */
#define SR_WEL                  0x2U    /* Write enable latch */
#define SR_QE                   0x40U   /* Quad Enable for MXIC */
/* Status Register #2 bits. */
#define SR2_QE                  0x2U    /* Quad Enable for Winbond */
/* meaning of other SR_* bits may differ between vendors */
#define SR_BP0                  0x4U    /* Block protect 0 */
#define SR_BP1                  0x8U    /* Block protect 1 */
#define SR_BP2                  0x10U   /* Block protect 2 */
#define SR_SRWD                 0x80U   /* SR write protect */
#define SR3_ADR                 0x01U   /* 4-byte u32Address mode */

#define SCUR_4BYTE              0x04U   /* 4-byte u32Address mode */



//是否使能4字节地址模式
#define SPIM_SET_4BYTE_ADDR_EN(x) \
    do {    \
        SPIM->CTL0 = (SPIM->CTL0 & (~(1<<5))) | (((x) ? 1UL : 0UL) << 5); \
    } while (0)

//设置命令模式
#define SPIM_SET_SPIM_MODE(x)    \
    do {    \
        SPIM->CTL0 = (SPIM->CTL0 & (~(0xFF << 24))) | ((x&0xff) << 24);   \
    } while (0)
//设置空闲时间间隔
#define SPIM_SET_IDL_INTVL(x) \
    do {    \
       SPIM->CTL1 = (SPIM->CTL1 & (~(0xF<<8))) | ((x&0XF) << 8);  \
    } while (0)



static void SPIM_IO_Init(void)
{
#if(SPIM_IO_SELECT == SPIM_IO_PA0_5)
    SYS_GPIOx_SetAF(GPIO_PA0_SPIM_MOSI);
    SYS_GPIOx_SetAF(GPIO_PA1_SPIM_MISO);
    SYS_GPIOx_SetAF(GPIO_PA2_SPIM_CLK);
    SYS_GPIOx_SetAF(GPIO_PA3_SPIM_SS);
    SYS_GPIOx_SetAF(GPIO_PA4_SPIM_D3);
    SYS_GPIOx_SetAF(GPIO_PA5_SPIM_D2);
#elif(SPIM_IO_SELECT==SPIM_IO_PC0_5)
    SYS_GPIOx_SetAF(GPIO_PC0_SPIM_MOSI);
    SYS_GPIOx_SetAF(GPIO_PC1_SPIM_MISO);
    SYS_GPIOx_SetAF(GPIO_PC2_SPIM_CLK);
    SYS_GPIOx_SetAF(GPIO_PC3_SPIM_SS);
    SYS_GPIOx_SetAF(GPIO_PC4_SPIM_D3);
    SYS_GPIOx_SetAF(GPIO_PC5_SPIM_D2);
#elif(SPIM_IO_SELECT==SPIM_IO_PE2_7)
    SYS_GPIOx_SetAF(GPIO_PE2_SPIM_MOSI);
    SYS_GPIOx_SetAF(GPIO_PE3_SPIM_MISO);
    SYS_GPIOx_SetAF(GPIO_PE4_SPIM_CLK);
    SYS_GPIOx_SetAF(GPIO_PE5_SPIM_SS);
    SYS_GPIOx_SetAF(GPIO_PE6_SPIM_D3);
    SYS_GPIOx_SetAF(GPIO_PE7_SPIM_D2);
#elif(SPIM_IO_SELECT==SPIM_IO_PG9_14)
    SYS_GPIOx_SetAF(GPIO_PG9_SPIM_D2);
    SYS_GPIOx_SetAF(GPIO_PG10_SPIM_D3);
    SYS_GPIOx_SetAF(GPIO_PG11_SPIM_SS);
    SYS_GPIOx_SetAF(GPIO_PG12_SPIM_CLK);
    SYS_GPIOx_SetAF(GPIO_PG13_SPIM_MISO);
    SYS_GPIOx_SetAF(GPIO_PG14_SPIM_MOSI);
#endif //SPIM_IO_SELECT
}


/* Used for Macronix flashes only. */
#define SPIM_OPCODE_EN4B             0xb7U   /* Enter 4-byte mode */
#define SPIM_OPCODE_EX4B             0xe9U   /* Exit 4-byte mode */

#define SPIM_OPCODE_RDSCUR           0x2bU
#define SPIM_OPCODE_WRSCUR           0x2fU

#define SPIM_OPCODE_RSTEN            0x66U
#define SPIM_OPCODE_RST              0x99U

#define SPIM_OPCODE_ENQPI            0x38U
#define SPIM_OPCODE_EXQPI            0xFFU



void SPIM_SET_SS(u8 level)            {(!level)?(SPIM->CTL1&=~BIT4):(SPIM->CTL1|=BIT4);}    //SS状态设置,低电平有效
void SPIM_OUT_EN(bool isOut)          {isOut?(SPIM->CTL0 |= BIT15): (SPIM->CTL0 &= ~BIT15);}   //输出使能,否则为输入





使用特权

评论回复
沙发
tpgf|  楼主 | 2021-10-1 18:34 | 只看该作者
//总线宽度模式
typedef enum
{
    SPIM_BITMODE_STANDARD   =   0,//标准单线模式
    SPIM_BITMODE_DUAL       =   1,//双线模式
    SPIM_BITMODE_QUAD       =   2,//四线模式
}SPIM_BITMODE;

//功能模式
typedef enum
{
    SPIM_FUN_IO             =   0,  //IO模式
    SPIM_FUN_DMA_WRITE      =   1,  //DMA写模式
    SPIM_FUN_DMA_READ       =   2,  //DMA读模式
        SPIM_FUN_DIRECTMAP                =        3,        //直接内存映射模式
}SPIM_FUN_MODE;

//传输数据宽度定义
typedef enum
{
    SPIM_DATA_8BIT          =   0x7,  //传输数据8bit
    SPIM_DATA_16BIT         =   0xF,  //传输数据16bit
    SPIM_DATA_24BIT         =   0x17, //传输数据24bit
    SPIM_DATA_32BIT         =   0x1f, //传输数据32bit
}SPIM_DATA_BIT_WIDTH;

//突发传输事务数量定义
typedef enum
{
    SPIM_BURST_NUM_1        =   0,     //突发传输1次
    SPIM_BURST_NUM_2        =   1,     //突发传输2次
    SPIM_BURST_NUM_3        =   2,     //突发传输3次
    SPIM_BURST_NUM_4        =   3,     //突发传输4次
}SPIM_BURST_NUMBER;





//设置突发传输数据长度
void SPIM_SetBurstNumber(SPIM_BURST_NUMBER num)
{
        SPIM->CTL0 &= ~(0x3 << 13);
        SPIM->CTL0 |= (0x3 & num) << 13;
}

//设置传输数据宽度
void SPIM_SetDataBitWidth(SPIM_DATA_BIT_WIDTH width)
{
        SPIM->CTL0 &= ~(0x1F << 8);
        SPIM->CTL0 |= (0x1F & width) << 8;
}

//设置SPIM功能模式
void SPIM_SetFunMode(SPIM_FUN_MODE mode)
{
        SPIM->CTL0 &= ~(0x3 << 22);
        SPIM->CTL0 |= (0x3 & mode) << 22;
}


//设置总线宽度模式
void SPIM_SetIoMode(SPIM_BITMODE bitmode)
{
    SPIM->CTL0 &= ~(0x3 << 20);
    SPIM->CTL0 |= (0x3 & bitmode) << 20;
}

//等待传输完成
bool SPIM_WaitTransferComplete(u32 us)
{
    if (us == 0) us = 1;
    do
    {
        if ((SPIM->CTL1 & BIT0) == 0) return TRUE;
        us--;
    } while (us);
    if ((SPIM->CTL1 & BIT0) == 0) return TRUE;
    else return FALSE;
}


//发送一个命令,会完整的使能SS并结束SS使能
bool SPIM_SendCmd(u8 cmd)
{
    bool status;

        SPIM_OUT_EN(TRUE);                                                //输出使能
    SPIM_SetIoMode(SPIM_BITMODE_STANDARD);  //标准IO模式
    SPIM_SetFunMode(SPIM_FUN_IO);           //IO读写模式
    SPIM_SetDataBitWidth(SPIM_DATA_8BIT);   //数据位宽8bit
    SPIM_SetBurstNumber(SPIM_BURST_NUM_1);  //突发传输1次

    SPIM_SET_SS(0);
    SPIM->TX[0] = cmd;
    SPIM->CTL1 |= BIT0;                     //开始传输
    status = SPIM_WaitTransferComplete(10); //等待传输完成
    SPIM_SET_SS(1);         

    if (status == FALSE)
    {
        uart_printf("[SPIM]发送命令:0x%02X失败.\r\n", cmd);
    }
    return status;
}

//设置flash写使能
static bool SPIM_FLASH_WriteEnable(bool isWriteEnable)
{
        return SPIM_SendCmd(isWriteEnable?OPCODE_WREN:OPCODE_WRDI);
}


//SPIM标准IO模式写入多个byte数据,不会使能SS
static bool SPIM_IoModeWriteBytes(const u8 *pData, u32 DataLen)
{
        u32 Int4Cnt = DataLen / 4;                                //整数4字节数量
        u32 Remainder = DataLen % 4;                        //不足4字节的余数数量
        u32 i,index = 0;
        bool status = TRUE;
       
        SPIM_OUT_EN(TRUE);                                                //输出使能
        SPIM_SetFunMode(SPIM_FUN_IO);           //IO读写模式
        SPIM_SetIoMode(SPIM_BITMODE_STANDARD);  //标准IO模式
        SPIM_SetDataBitWidth(SPIM_DATA_8BIT);   //数据位宽8bit       
        //先写整数4字节数据
        if(Int4Cnt)
        {
                SPIM_SetBurstNumber(SPIM_BURST_NUM_4);        //设置突发传输4次
                for( i = 0;i < Int4Cnt;i ++)
                {
                        SPIM->TX[0] = pData[index++];
                        SPIM->TX[1] = pData[index++];
                        SPIM->TX[2] = pData[index++];
                        SPIM->TX[3] = pData[index++];
                        SPIM->CTL1 |= BIT0;                                             //开始传输
                        status = SPIM_WaitTransferComplete(40);                         //等待传输完成
                        if(status == FALSE) goto end_loop;
                }
        }
        if(Remainder)        //不足4字节的余数
        {
                SPIM_SetBurstNumber(SPIM_BURST_NUM_1);        //设置突发传输1次
                for( i = 0;i < Remainder;i ++)
                {
                        SPIM->TX[0] = pData[index++];
                        SPIM->CTL1 |= BIT0;                                             //开始传输
                        status = SPIM_WaitTransferComplete(10);                         //等待传输完成
                        if(status == FALSE) goto end_loop;
                }
        }
       
end_loop:
       
        if (status == FALSE)
    {
        uart_printf("[SPIM]SPIM_IoModeWriteBytes:出错.\r\n");
    }
       
        return status;
}



使用特权

评论回复
板凳
tpgf|  楼主 | 2021-10-1 18:34 | 只看该作者
//SPIM标准IO模式读取多个byte数据,不会使能SS
static bool SPIM_IoModeReadBytes(u8* pData, u32 DataLen)
{
        u32 Int4Cnt = DataLen / 4;                                //整数4字节数量
        u32 Remainder = DataLen % 4;                        //不足4字节的余数数量
        u32 i, index = 0;
        bool status = TRUE;

        SPIM_OUT_EN(FALSE);                                                //输入使能
        SPIM_SetFunMode(SPIM_FUN_IO);           //IO读写模式
        SPIM_SetIoMode(SPIM_BITMODE_STANDARD);  //标准IO模式
        SPIM_SetDataBitWidth(SPIM_DATA_8BIT);   //数据位宽8bit       
        //先写整数4字节数据
        if (Int4Cnt)
        {
                SPIM_SetBurstNumber(SPIM_BURST_NUM_4);        //设置突发传输4次
                for (i = 0; i < Int4Cnt; i++)
                {
                        SPIM->CTL1 |= BIT0;                                             //开始传输
                        status = SPIM_WaitTransferComplete(40);                         //等待传输完成
                        if (status == FALSE) goto end_loop;

                        pData[index++] = SPIM->RX[0];
                        pData[index++] = SPIM->RX[1];
                        pData[index++] = SPIM->RX[2];
                        pData[index++] = SPIM->RX[3];               
                }
        }
        if (Remainder)        //不足4字节的余数
        {
                SPIM_SetBurstNumber(SPIM_BURST_NUM_1);        //设置突发传输1次
                for (i = 0; i < Remainder; i++)
                {
                        SPIM->CTL1 |= BIT0;                                             //开始传输
                        status = SPIM_WaitTransferComplete(10);                         //等待传输完成
                        if (status == FALSE) goto end_loop;
                        pData[index++] = SPIM->RX[0];
                       
                }
        }

end_loop:

        if (status == FALSE)
        {
                uart_printf("[SPIM]SPIM_IoModeReadBytes:出错.\r\n");
        }

        return status;
}



//写flash 1个寄存器
static bool SPIM_FLASH_WriteRegister(u8 addr, u8 data)
{
        bool status;
        u8 buff[2];
       
        buff[0] = addr;
        buff[1] = data;
    SPIM_SET_SS(0);
    status = SPIM_IoModeWriteBytes(buff, 2);        //写入多个字节
    SPIM_SET_SS(1);         

    return status;       
}

//厂家定义标记
typedef enum
{
        MFGID_UNKNOW = 0x00U,
        MFGID_SPANSION = 0x01U,
        MFGID_EON = 0x1CU,
        MFGID_ISSI = 0x7FU,
        MFGID_MXIC = 0xC2U,
        MFGID_WINBOND = 0xEFU
}
SPIM_E_MFGID;


//读取id
u32 SPIM_ReadJEDEC_ID(void)
{
        bool status;
        u32 id = 0;
        u8 buff[1] = { OPCODE_RDID };

        SPIM_SET_SS(0);
        status = SPIM_IoModeWriteBytes(buff, 1);        //写入多个字节
        if (status == FALSE) goto end_loop;
        status = SPIM_IoModeReadBytes((u8*)&id, 3);        //读取
        if (status == FALSE) goto end_loop;
end_loop:
        SPIM_SET_SS(1);

        return id;
}

//使能直接内存映射模式
void SPIM_EnterDirectMapMode(SPIM_CMDCODE cmdcode, u8 IdleIntvl)
{
        SPIM_SET_4BYTE_ADDR_EN(FALSE);        //Enable/disable 4-byte u32Address
        SPIM_SET_SPIM_MODE(cmdcode);          //SPIM mode
        SPIM_SET_IDL_INTVL(IdleIntvl);        //Idle interval.
        SPIM_SetFunMode(SPIM_FUN_DIRECTMAP);   //直接内存映射模式
}


//初始化
void SPIM_Init(void)
{
        u32 id;

    SYS_DeviceClockEnable(DEV_SPIM, TRUE);  //使能SPIM时钟
    SPIM_IO_Init();                         //SPIM IO初始化
       
        SPIM->CTL0 &= ~(1<<0);                                        //关闭加密
        SPIM->CTL0 &= ~(1<<7);                                        //关闭中断
       
        SPIM->RXCLKDLY |= 1 << 20;                                //数据上升沿采样
        SPIM->RXCLKDLY &= ~(0x0f << 16);                //接收数据延时时间为0
        SPIM->RXCLKDLY |= 0x0F;

                                                                                        //SPIM->CTL0 = 0;                                                        //不开启4字节地址模式,不开启中断,不开启加密
        SPIM->CTL1 &= ~(1 << 5);                //SSACTPOL 测试必须设置为0,否则导致直接内存映射失败
    SPIM->CTL1 |= 1 << 16;                  //设置时钟为1/2的HCLK
    SPIM_SET_SS(1);

    SPIM->CTL2 = 8 << 24;                   //虚拟周期数
    SPIM->CTL2 |= 1 << 16;                  //对于DTR/DDR命令代码0x0D、0xBD和0xED,请将USETEN设置为0x1

    SPIM_SendCmd(SPIM_OPCODE_RSTEN);
    SPIM_SendCmd(SPIM_OPCODE_RST);
    SPIM_SendCmd(SPIM_OPCODE_RSTEN);
    SPIM_SendCmd(SPIM_OPCODE_RST);
       
        //SPIM_FLASH_WriteEnable(TRUE);                                //开启flash写使能
        //SPIM_FLASH_WriteRegister(OPCODE_WRSR, 0x00);        //清除状态寄存器-写这个寄存器后,至少要延时10ms,否则flash不稳定,无法读取,应该是写入后要等待寄存器不忙
       
        //SYS_DelayMS(10);
        id = SPIM_ReadJEDEC_ID();
        uart_printf("JEDEC ID:0x%X\r\n", id);
}


使用特权

评论回复
地板
tpgf|  楼主 | 2021-10-1 18:35 | 只看该作者
/*************************************************************************************************************
* 文件名                :        m48x_spim.h
* 功能                        :        m48X SPIM驱动
* 作者                        :        cp1300@139.com
* 创建时间                :        2021-09-24
* 最后修改时间        :        2021-09-24
* 详细                        :        只支持W25Q系列flash,并且需要falsh支持4线模式
*************************************************************************************************************/
#ifndef _M48X_SPIM_H_
#define _M48X_SPIM_H_
#include "m48x_system.h"


#define SPIM_ENABLE_CCM()          (SPIM->CTL1 |= (1<<2))
#define SPIM_DISABLE_CCM()         (SPIM->CTL1 &= ~(1<<2))
#define SPIM_ENABLE_CACHE()        (SPIM->CTL1 &= ~(1<<1))
#define SPIM_DISABLE_CACHE()       (SPIM->CTL1 |= (1<<1))
#define SPIM_ENABLE_CIPHER()       (SPIM->CTL0 &= ~(1<<0))  //开启加密
#define SPIM_DISABLE_CIPHER()      (SPIM->CTL0 |= (1<<0))   //不开启加密


//命令定义
typedef enum
{
        CMD_NORMAL_PAGE_PROGRAM = 0x02UL,       //页编程(页面写入模式使用)
        CMD_NORMAL_PAGE_PROGRAM_4B = 0x12UL,       //页编程(页面写入模式使用)
        CMD_QUAD_PAGE_PROGRAM_WINBOND = 0x32UL,       //四页程序(用于Winbond)(页写入模式使用)
        CMD_QUAD_PAGE_PROGRAM_MXIC = 0x38UL,       //四页程序(用于MXIC)(页写入模式使用)
        CMD_QUAD_PAGE_PROGRAM_EON = 0x40UL,       //四页程序(用于EON)(页写入模式使用)
        CMD_DMA_NORMAL_READ = 0x03UL,       //读取数据(页面读取模式使用)
        CMD_DMA_FAST_READ = 0x0BUL,       //快速读取(页面读取模式使用)
        CMD_DMA_NORMAL_DUAL_READ = 0x3BUL,       //快速读取双输出(页面读取模式使用)
        CMD_DMA_FAST_READ_DUAL_OUTPUT = 0x3BUL,       //快速读取双输出(页面读取模式使用)
        CMD_DMA_FAST_READ_QUAD_OUTPUT = 0x6BUL,       //快速读取双输出(页面读取模式使用)
        CMD_DMA_FAST_DUAL_READ = 0xBBUL,       //快速读取双输出(页面读取模式使用)
        CMD_DMA_NORMAL_QUAD_READ = 0xE7UL,       //快速读取四路I/O(页面读取模式使用)
        CMD_DMA_FAST_QUAD_READ = 0xEBUL,       //快速读取四路I/O(页面读取模式使用)
}SPIM_CMDCODE;






//使能直接内存映射模式
void SPIM_EnterDirectMapMode(SPIM_CMDCODE cmdcode, u8 IdleIntvl);
void SPIM_Init(void);       //初始化



#endif //_M48X_SPIM_H_


使用特权

评论回复
5
tpgf|  楼主 | 2021-10-1 18:35 | 只看该作者
测试代码


/*************************************************************************************************************
* 文件名:                spim_test.c
* 功能:                        spim测试
* 作者:                        cp1300@139.com
* 创建时间:                2021-09-24
* 最后修改时间:        2021-09-24
* 详细:                       
*************************************************************************************************************/
#include "system.h"
#include "m48x_system.h"
#include "test.h"
#include "m48x_spim.h"

#define __at__SPIM_ROM__                __attribute__((section("SPIM_ROM")))

__at__SPIM_ROM__
void spim_app_run(void)
{
        u32 cnt = 0;
       
        while(1)
        {
                SYS_DelayMS(1000);
                uart_printf("%u\r\n", cnt++);
        }
       
}


//spim测试
void spim_test(void)
{
    u32 temp;

    SYS_DelayMS(1000);
    uart_printf("\r\n开始SPIM测试\r\n");
    SPIM_Init();       //初始化       
    SPIM_DISABLE_CCM();       
    SPIM_ENABLE_CACHE();       
    SPIM_DISABLE_CIPHER();  //关闭加密
        SPIM->CTL1 |= 1 << 3;        // invalid cache
    SPIM_EnterDirectMapMode(CMD_DMA_FAST_READ, 0);

        spim_app_run();
    SYS_DelayMS(60);
}


使用特权

评论回复
6
tpgf|  楼主 | 2021-10-1 18:35 | 只看该作者
分散加载文件


; V6: armclang
#! armclang --target=arm-arm-none-eabi -mcpu=cortex-m4 -E -x c
;使用了ARM V6编译器后无法使用宏定义设置ROM起始地址与大小,需要手动修改
; V5: armcc
;#! armcc -E
#include "BaseSetting.h"

       
LR_IROM1 0x00000000 (416*1024)  {    ; load region size_region
  APROM.bin 0x00000000 (416*1024)  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM3 0x20020000 (32*1024)  {  ; RW data SRAM2 32KB SPIM cache
   .ANY (+RW +ZI)
   ;.ANY (IRAM3)
  }
  
  RW_IRAM1 0x20008000 (96*1024)  {  ; RW data SRAM1 96KB
   .ANY (+RW +ZI)
   .ANY (IRAM1)
  }
  
  RW_IRAM0 0x20000000 (32*1024)  {  ; RW data SRAM0 32KB
   .ANY (+RW +ZI)
   .ANY (IRAM0)
  }
  
  ;Ret_SRAM 掉电保持SRAM 4KB
; RW_IRAM4 0x200F0000 (4*1024)  {
;  .ANY (Ret_SRAM)
; }
}

LR_IROM2  0x8000000
{
        SPIM.bin  0x8000000
        {
                ;.ANY (+RO)
                ;.ANY (+XO)
                .ANY (SPIM_ROM)
        }
}


使用特权

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

本版积分规则

1510

主题

14449

帖子

9

粉丝