栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

八.国民技术MCU开发之 XFMC模块之PSRAM

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

八.国民技术MCU开发之 XFMC模块之PSRAM

八.国民技术MCU开发之 XFMC模块之PSRAM

文章目录
  • 八.国民技术MCU开发之 XFMC模块之PSRAM
    • 1.相关开发环境
    • 2. MCU PSRAM 硬件原理图
    • 3.PSRAM 初始化以及读写测试代码
      • 3.1 XFMC_Psram_Init
        • 3.1.1 XFMC RCC时钟使能
        • 3.1.2 XFMC 配置Block 以及MemType
      • 3.2 PSRAM读写 函数XFMC_Psram_Write_Buffer

1.相关开发环境

硬件版本:N32G457QEL_EVB V1.1

软件SDK版本 Nationstech.N32G45x_Library.1.1.1

开发软件:KEIL

2. MCU PSRAM 硬件原理图

3.PSRAM 初始化以及读写测试代码
    uint8_t bank_index  = 1;
    uint16_t tx_buffer[BUFFER_SIZE];
    uint16_t rx_buffer[BUFFER_SIZE];
int psram_test_main(void)
{


    uint32_t wr_status = 0;

    //Debug_USART_Config();
    printf("rnxfmc external 16bit psram test startrn");

    //while(bank_index < TEST_SRAM_NUM)
    {
				 printf("rnbank_index=%drn",bank_index);
        
        XFMC_Psram_Init(bank_index);
								 printf("rnbank_index=%d %drn",bank_index,__LINE__);
        
        XFMC_Psram_Fill(bank_index,WRITE_READ_ADDR, BUFFER_SIZE, 0xFFFF);
								 printf("rnbank_index=%d %drn",bank_index,__LINE__);
        
        Fill_Buffer(tx_buffer, BUFFER_SIZE, 0x1230);
								 printf("rnbank_index=%d %drn",bank_index,__LINE__);
        
        XFMC_Psram_Write_Buffer(tx_buffer, bank_index, WRITE_READ_ADDR, BUFFER_SIZE);
								 printf("rnbank_index=%d %drn",bank_index,__LINE__);
        
        Memset((void *)rx_buffer,0,BUFFER_SIZE*2);
        
        
        XFMC_Psram_Read_Buffer(rx_buffer, bank_index, WRITE_READ_ADDR, BUFFER_SIZE);
								 printf("rnbank_index=%d %drn",bank_index,__LINE__);
        
        wr_status = Buffercmp(tx_buffer, rx_buffer, BUFFER_SIZE);

        if (wr_status == PASSED)
        {
            
            printf("xfmc psram_%d read and write test passrn",bank_index);
        }
        else
        {
            
            printf("xfmc psram_%d read and write test failrn",bank_index);
        }

//        bank_index++;
    }

//    while (1)
//    {
//    }
}
3.1 XFMC_Psram_Init
        
        XFMC_Psram_Init(bank_index);
void XFMC_Psram_Init(uint8_t bank_num)
{
    XFMC_Bank1_Block *bank_index;
    XFMC_NorSramInitTpye XFMC_NORSRAMInitStructure;
    XFMC_NorSramTimingInitType readWriteTiming;
    bank_index = bank_num == 0 ? XFMC_BANK1_BLOCK1 : XFMC_BANK1_BLOCK2;

    
    RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_XFMC, ENABLE);
    
    SRAM_Gpio_Config(bank_num);

    readWriteTiming.AddrSetTime      = XFMC_NOR_SRAM_ADDR_SETUP_TIME_3HCLK;
    readWriteTiming.AddrHoldTime     = XFMC_NOR_SRAM_ADDR_HOLD_TIME_1HCLK;
    readWriteTiming.DataSetTime      = XFMC_NOR_SRAM_DATA_SETUP_TIME(0x05);
    readWriteTiming.BusRecoveryCycle = XFMC_NOR_SRAM_BUSRECOVERY_TIME_8HCLK;
    readWriteTiming.ClkDiv           = XFMC_NOR_SRAM_CLK_DIV_2;
    readWriteTiming.DataLatency      = XFMC_NOR_SRAM_DATA_LATENCY_2CLK;
    readWriteTiming.AccMode          = XFMC_NOR_SRAM_ACC_MODE_A;

    XFMC_NORSRAMInitStructure.Block            = bank_index;
    XFMC_NORSRAMInitStructure.DataAddrMux      = XFMC_NOR_SRAM_MUX_DISABLE;
    XFMC_NORSRAMInitStructure.MemType          = XFMC_MEM_TYPE_PSRAM;
    XFMC_NORSRAMInitStructure.MemDataWidth     = XFMC_NOR_SRAM_DATA_WIDTH_16B;
    XFMC_NORSRAMInitStructure.BurstAccMode     = XFMC_NOR_SRAM_BURST_MODE_DISABLE;
    XFMC_NORSRAMInitStructure.AsynchroWait     = XFMC_NOR_SRAM_ASYNC_NWAIT_DISABLE;
    XFMC_NORSRAMInitStructure.WaitSigPolarity  = XFMC_NOR_SRAM_WAIT_SIGNAL_LOW;
    XFMC_NORSRAMInitStructure.WrapMode         = XFMC_NOR_SRAM_WRAP_DISABLE;
    XFMC_NORSRAMInitStructure.WaitSigConfig    = XFMC_NOR_SRAM_NWAIT_BEFORE_STATE;
    XFMC_NORSRAMInitStructure.WriteEnable      = XFMC_NOR_SRAM_WRITE_ENABLE;
    XFMC_NORSRAMInitStructure.WaitSigEnable    = XFMC_NOR_SRAM_NWAIT_DISABLE;
    XFMC_NORSRAMInitStructure.ExtModeEnable    = XFMC_NOR_SRAM_EXTENDED_DISABLE;
    XFMC_NORSRAMInitStructure.WriteBurstEnable = XFMC_NOR_SRAM_BURST_WRITE_DISABLE;
    XFMC_NORSRAMInitStructure.RWTimingStruct   = &readWriteTiming;
    XFMC_NORSRAMInitStructure.WTimingStruct    = &readWriteTiming;

    XFMC_InitNorSram(&XFMC_NORSRAMInitStructure);
    XFMC_EnableNorSram(bank_index, ENABLE);
}

根据原理图用了NE2,所以是XFMC_BANK1_BLOCK2,

即参数 uint8_t bank_index = 1;

3.1.1 XFMC RCC时钟使能
RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_XFMC, ENABLE);
3.1.2 XFMC 配置Block 以及MemType
XFMC_NORSRAMInitStructure.Block            = bank_index;
XFMC_NORSRAMInitStructure.DataAddrMux      = XFMC_NOR_SRAM_MUX_DISABLE;
XFMC_NORSRAMInitStructure.MemType          = XFMC_MEM_TYPE_PSRAM;
3.2 PSRAM读写 函数XFMC_Psram_Write_Buffer
void XFMC_Psram_Write_Buffer(uint16_t* pBuffer, uint8_t bank_index, uint32_t write_addr, uint32_t number)
{
    uint32_t transfer_addr;
    transfer_addr = bank_index == 0 ? Bank1_SRAM1_ADDR : Bank1_SRAM2_ADDR;
    for (; number != 0; number--) 
    {
        while(1)
        {
            
            *(__IO uint16_t*)(transfer_addr + write_addr) = *pBuffer;

            
            if(*(__IO uint16_t*)(transfer_addr + write_addr) == *pBuffer)
                break;
        }

        
        pBuffer++;
        write_addr += 2;
    }
}

#define Bank1_SRAM1_ADDR ((uint32_t)0x60000000) // 0x60000000~63FFFFFF
#define Bank1_SRAM2_ADDR ((uint32_t)0x64000000) // 0x64000000~67FFFFFF
#define Bank1_SRAM3_ADDR ((uint32_t)0x68000000)

INDEX=1 用的是Bank1_SRAM2_ADDR

  1. // 0x60000000~63FFFFFF
    #define Bank1_SRAM2_ADDR ((uint32_t)0x64000000) // 0x64000000~67FFFFFF
    #define Bank1_SRAM3_ADDR ((uint32_t)0x68000000)

INDEX=1 用的是Bank1_SRAM2_ADDR

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/928205.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号