0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【GD32F303红枫派开发板使用手册】第二十五讲 EXMC-外部SRAM读写实验

聚沃科技 2024-06-25 09:39 次阅读
wKgaomZVdiiAfR9BAB3mDFhHnZc972.png

25.1实验内容

通过本实验主要学习以下内容:

  • EXMC外设原理和配置
  • EXMC NOR/SRAM模式介绍
  • 外部SRAM接口时序和操作方式

25.2实验原理

MCU的片内SRAM空间有限,在做一些大量数据处理、GUI显示等应用中片内SRAM容量无法满足应用需求,而外部SRAM器件读写速度快,不需要自刷新,工作稳定,是性能最优的外扩RAM选择之一。MCU通过EXMC接口可以实现外部SRAM的接口通信协议,同时可映射到内部地址实现和内部ram相同的操作方式。

25.2.1EXMC外设原理

EXMC是MCU的外部存储控制器,可以配置实现各类片外设备的通信协议,包括SRAM、PSRAM、NOR FLASH、NAND FLASH等,也可以通过配置实现一些其他通信协议,如8080接口的LCD驱动、FPGA通信等,可灵活的实现很多异步同步信号输入输出,时序时间可配置。更重要的是EXMC可通过地址映射方式实现MCU内部总线协议到外部器件通信的转换,实现高效的数据读取和输出能力。

  • EXMC系统架构如下图所示,外部SRAM使用NOR-Flash/PSRAM控制器实现通信协议,使用NWE、NOE、EXMC_Dx、EXMC_Ax、EXMC_NBLx、EXMC_NEx引脚和SRAM器件进行连接。
wKgaomZ6HlSAbHJ3AAEo_6A5HHE738.png

EXMC根据不同存储器类型,对应有4个BANK,每个BANK各256MB占用了不同地址空间。访问对应BANK区的地址时EXMC会自动按对应改区存储类型的时序和配置进行通信。

wKgaomZ6HmOAdwJ8AAD2ZGB1kAo603.png

25.2.2EXMC NOR/SRAM模式介绍

如SRAM/NOR类型对应区域为BANK0总计256MB空间。而BANK0其中有分了4个Regions各64MB,每个Regions分别对应NE0——NE4引脚连接的器件,可以连接4个64MB SRAM就可以组成256MB的连续SRAM地址空间,也可以连接4个NOR或者2个NOR和2个SRAM的组合方式。

wKgaomZ6HnyAQYtRAADkr7I4fUE388.png
  • 访问外部SRAM时,采用了EXMC SRAM异步访问模式A,读写开始时NE先拉低,接着地址先建立并保持,同时其他信号根据当前访问方向等进行信号对应输出,接下来MCU或器件输出数据信号建立,在输出使能的边沿进行采样,读写结束NE拉高。读写信号时序如下图:
wKgaomZ6HpiAdnZxAAEB8AqdCrs063.png

在这个时序过程中,很多参数可以进行配置调节,其中主要是地址建立和保持、数据建立的参数,一般根据速率要求、硬件信号斜率限制来平衡这个参数,目标为达到一个满足稳定性的最高速率参数。相关参数如下表所示:

wKgZomZ6HqqAfVqbAAHXO5SPTvg605.png

25.2.3外部SRAM器件原理

sram存储模型可以使用下图说明:

wKgaomZ6HrmAAf0uAAIJnhVGv8M241.png

SRAM内部包含的存储阵列,和表格查找一样,指定一个行地址和列地址,就可以精确地找到目标BIT单元格,这是SRAM芯片寻址的基本原理。这样的每个单元格被称为存储单元,而这样的表则被称为存储矩阵。地址译码器把N根地址线转换成2的N次方根信号线,每根信号线对应一行或一列存储单元,通过地址线找到具体的存储单元,实现寻址。如果存储阵列比较大,地址线会分成行和列地址,或者行、列分时复用同一地址总线,访问数据寻址时先用地址线传输行地址再传输列地址。

在外部SRAM上,列地址对应了数据宽度,如例程所用的IS62WV51216BLL为16位宽度,故而行地址范围是19,对应了IS62WV51216BLL的A0-A19引脚,主控芯片通过A0-A19引脚即可实现对行地址进行寻址访问到对应的16BIT数据。

如下图所示为外部SRAM接口信号,主控通过特定接口按时序即可时序地址发送、数据发送和读取,实现对指定地址数据的读写。

wKgZomZ6HsaALUONAAethsCDsdM552.png

25.3硬件设计

如下是IS62WV51216BLL的原理图设计,MCU通过EXMC相关对应接口连接到SRAM。

wKgZomZ6HtOAH-cWAARUkGzfwvg891.png
  • SRAM作为敏感器件,需要保证电源的稳定、减少噪声,串接了磁珠后供电,同时对sram的vdd引脚必须就近放置0.1uf去耦电容,若整个系统中存在较多其他负载,可以再增加较大电容稳定电源。
  • SRAM的CS引脚通过MCU EXMC_NEx引脚控制,由于片选信号较为关键,避免MCU在EXMC多器件时悬空信号不稳定导致误操作,需要增加上拉电阻;在这里,上拉电阻应当靠近SRAM放置,减少连接回路上的耦合干扰。

25.4代码解析

EXMC在初始化后,基本上通过程序的地址映射就可以进行操作了,需要根据外部器件的要求进行exmc相关参数配置,exmc可配置参数有很多,但选定好一个模式后实际在这个模式下需要配置的参数是有限的,一些结构体成员只需要按默认参数配置即可。

25.4.1EXMC SRAM模式初始化

  • 在sram访问时,可能会调整的exmc参数如下:
wKgaomZ6HumAGCSTAACAjtnHPqM457.png
  • 其中数据建立、地址建立、地址保持三个参数尤其关键,影响到最终的速率以及稳定性,需要根据器件、电路设计PCB设计、信号测试综合来调试选取合适的值;其单位为AHB CLK。
wKgZomZ6HviAORpPAAAOiI0Q9QY818.png
  • 整个SRAM配置过程主要包含:GPIO和EXMC外设接口时钟、GPIO配置、EXMC相关参数配置,完整代码如下:
C
/*!
* 说明 emxc nor/sram模式初始化
* 输入[1] norsram_region: @EXMC_BANK0_NORSRAM_REGION0/EXMC_BANK0_NORSRAM_REGION1/EXMC_BANK0_NORSRAM_REGION2/EXMC_BANK0_NORSRAM_REGION3
* 返回值 无
*/
void driver_exmc_sram_init(uint32_t norsram_region)
{
exmc_norsram_parameter_struct nor_init_struct;
exmc_norsram_timing_parameter_struct nor_timing_init_struct;

/* EXMC clock enable */
rcu_periph_clock_enable(RCU_EXMC);

/* EXMC enable */
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_GPIOD);
rcu_periph_clock_enable(RCU_GPIOE);
rcu_periph_clock_enable(RCU_GPIOF);
rcu_periph_clock_enable(RCU_GPIOG);

/* configure EXMC_D[0~15]*/
/* PD14(EXMC_D0), PD15(EXMC_D1),PD0(EXMC_D2), PD1(EXMC_D3), PD8(EXMC_D13), PD9(EXMC_D14), PD10(EXMC_D15) */
gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 |
GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);

/* PE7(EXMC_D4), PE8(EXMC_D5), PE9(EXMC_D6), PE10(EXMC_D7), PE11(EXMC_D8), PE12(EXMC_D9),
PE13(EXMC_D10), PE14(EXMC_D11), PE15(EXMC_D12) */
gpio_init(GPIOE, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 |
GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 |
GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);


/* configure NBL0(PE0) and NBL1(PE1) */
gpio_init(GPIOG, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_9 | GPIO_PIN_10);

/* configure NBL0(PE0) and NBL1(PE1) */
gpio_init(GPIOF, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);

exmc_norsram_struct_para_init(&nor_init_struct);

/* config timing parameter */
nor_timing_init_struct.asyn_access_mode = EXMC_ACCESS_MODE_A;
nor_timing_init_struct.syn_data_latency = EXMC_DATALAT_2_CLK;
nor_timing_init_struct.syn_clk_division = EXMC_SYN_CLOCK_RATIO_2_CLK;
nor_timing_init_struct.bus_latency = 0;
nor_timing_init_struct.asyn_data_setuptime = 8;
nor_timing_init_struct.asyn_address_holdtime = 8;
nor_timing_init_struct.asyn_address_setuptime = 8;

/* config EXMC bus parameters */
nor_init_struct.norsram_region = norsram_region;
nor_init_struct.write_mode = EXMC_ASYN_WRITE;
nor_init_struct.extended_mode = DISABLE;
nor_init_struct.asyn_wait = DISABLE;
nor_init_struct.nwait_signal = DISABLE;
nor_init_struct.memory_write = ENABLE;
nor_init_struct.nwait_config = EXMC_NWAIT_CONFIG_BEFORE;
nor_init_struct.wrap_burst_mode = DISABLE;
nor_init_struct.nwait_polarity = EXMC_NWAIT_POLARITY_LOW;
nor_init_struct.burst_mode = DISABLE;
nor_init_struct.databus_width = EXMC_NOR_DATABUS_WIDTH_16B;
nor_init_struct.memory_type = EXMC_MEMORY_TYPE_SRAM;
nor_init_struct.address_data_mux = DISABLE;
nor_init_struct.read_write_timing = &nor_timing_init_struct;
nor_init_struct.write_timing = &nor_timing_init_struct;
exmc_norsram_init(&nor_init_struct);

/* enable the EXMC bank0 NORSRAM */
exmc_norsram_enable(norsram_region);
}

25.4.2初始化调用

  • 红枫派开发板中SRAM的CS连接引脚为EXMC_NE0引脚,故而对应EXMC BANK0 Region0区,调用初始化时我们传入参数EXMC_BANK0_NORSRAM_REGION0即可。
C
//初始化exmc norsram region0
driver_exmc_norsram_init(EXMC_BANK0_NORSRAM_REGION0);

25.4.3地址映射访问方式

  • 初始化好后EXMC BANK0 Region0区的地址可以理解就和外部SRAM形成了映射关系,读写这些地址时EXMC会先拉低NE0选择SRAM进行通信和交互;

exmc驱动的头文件中定义好了BANK的4个Region地址,我们对Region0地址读写即可实现外部SRAM的数据读写。

wKgZomZ6HxCAXj_WAAAxiM8Yl3o460.png
  • 同样我们也可以直接在编译器里定义外部sram地址范围,直接让编译器把定义的变量和数组放在外部sram中,我们不用再关心其具体地址;但我们需要在main函数之前初始化好exmc,可以在启动文件中调用exmc初始化。
wKgaomZ6Hx-AEJ_YAACmBa3sSN8279.pngwKgZomZ6HySAOOMKAAAsZBnmBAk564.png

25.4.4main函数设计

mian函数中通过指针方式以8位、16位、32位写并读取校验了外部SRAM数据

C
int main(void)
{
uint32_t writereadstatus = 0;

//延时和公共驱动部分初始化
driver_init();

//打印串口初始化
bsp_uart_init(&BOARD_UART);

//初始化LED
bsp_led_group_init();
bsp_led_off(&LED0);
bsp_led_off(&LED1);

//初始化exmc norsram region0
driver_exmc_norsram_init(EXMC_BANK0_NORSRAM_REGION0);

delay_ms(100);
printf("External sram read and write examples.\r\n");


//以32位读写校验
printf("32-bit read/write check.\r\n");
writereadstatus=0;
for(uint32_t index = 0; index < EXMC_SRAM_SIZE; index++ ){
REG32(EXMC_BANK0_NORSRAM_REGION0_ADDR+index*4)=0xa55aa55a;
}
for(uint32_t index = 0; index < EXMC_SRAM_SIZE; index++ ){
if(0xa55aa55a!=REG32(EXMC_BANK0_NORSRAM_REGION0_ADDR+index*4)){
writereadstatus++;
break;
}
}
if(writereadstatus){
bsp_led_on(&LED0);
printf("\r\n32-bit read/write SRAM test failed!");
}else{
bsp_led_on(&LED1);
printf("\r\n32-bit read/write SRAM test successed!");
}


//以16位读写校验
printf("16-bit read/write check.\r\n");
writereadstatus=0;
for(uint32_t index = 0; index < EXMC_SRAM_SIZE; index++ ){
REG16(EXMC_BANK0_NORSRAM_REGION0_ADDR+index*2)=0xaaaa;
}
for(uint32_t index = 0; index < EXMC_SRAM_SIZE; index++ ){
if(0xaaaa!=REG16(EXMC_BANK0_NORSRAM_REGION0_ADDR+index*2)){
writereadstatus++;
break;
}
}
if(writereadstatus){
bsp_led_on(&LED0);
printf("\r\n16-bit read/write SRAM test failed!");
}else{
bsp_led_on(&LED1);
printf("\r\n16-bit read/write SRAM test successed!");
}


//以8位读写校验
printf("8-bit read/write check.\r\n");
writereadstatus=0;
for(uint32_t index = 0; index < EXMC_SRAM_SIZE; index++ ){
REG8(EXMC_BANK0_NORSRAM_REGION0_ADDR+index)=0x55;
}
for(uint32_t index = 0; index < EXMC_SRAM_SIZE; index++ ){
if(0x55!=REG8(EXMC_BANK0_NORSRAM_REGION0_ADDR+index)){
writereadstatus++;
break;
}
}
if(writereadstatus){
bsp_led_on(&LED0);
printf("\r\n8-bit read/write SRAM test failed!");
}else{
bsp_led_on(&LED1);
printf("\r\n8-bit read/write SRAM test successed!");
}

while (1)
{


}
}

25.5实验结果

连接USB转串口,将打印读写校验结果。

教程GD32 MCU方案商聚沃科技原创发布,了解更多GD32 MCU教程,关注聚沃科技官网

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6032

    文章

    44514

    浏览量

    632941
  • sram
    +关注

    关注

    6

    文章

    763

    浏览量

    114631
  • 开发板
    +关注

    关注

    25

    文章

    4943

    浏览量

    97188
  • GD32
    +关注

    关注

    7

    文章

    403

    浏览量

    24218
  • EXMC
    +关注

    关注

    0

    文章

    7

    浏览量

    5185
收藏 人收藏

    评论

    相关推荐

    GD32F303】星空介绍

    一、开发板介绍星空GD开发板是由旗点科技推出的一款GD32开发板,板载
    发表于 09-11 17:55

    【星空GD32F303开发板试用体验】开箱+环境搭建

    本帖最后由 lustao 于 2021-10-19 09:29 编辑 感谢 发烧友学院以及广州旗点智能科技有限公司为我和孩子提供此产品星空GD32F303开发板。收到了星空
    发表于 10-18 14:15

    【星空GD32F303开发板试用体验】开箱+环境搭建

    https://bbs.elecfans.com/jishu_2179209_1_1.html感谢 发烧友学院以及广州旗点智能科技有限公司为我和孩子提供此产品星空gd32F303开发板。收到了星空
    发表于 11-02 15:36

    【星空GD32F303开发板试用体验】+板卡概览

    本帖最后由 cooldog123pp 于 2021-11-6 21:07 编辑 星空GD开发板是由旗点科技推出的一款GD32开发板
    发表于 11-06 21:05

    星空GD32F303开发板的相关资料下载

    一、开发板介绍星空GD开发板是由旗点科技推出的一款GD32开发板,板载
    发表于 12-10 08:27

    第二十五 同步计数器

    第二十五 同步计数器 7.3.2 同步计数器一、同步二进制计数器1.同步二进制加法计数器JK触发器组成的4位同步二进制加法
    发表于 03-30 16:28 9282次阅读
    <b class='flag-5'>第二十五</b><b class='flag-5'>讲</b> 同步计数器

    STM32CUBEMX开发GD32F303(15)----外部中断EXTI

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过开发板内进行验证。 使用外部中断EXTI进行驱
    的头像 发表于 07-26 15:53 1284次阅读
    STM32CUBEMX<b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(15)----<b class='flag-5'>外部</b>中断EXTI

    GD32F303固件库开发

    /qq_24312945/article/details/124325797] GD32F303固件库开发(2)----读保护与写保护 芯片读保护以后,flash将不可以从外部读取,这样可以防止别人读取或者盗取芯片代码,如果想再
    的头像 发表于 07-27 09:27 1109次阅读
    <b class='flag-5'>GD32F303</b>固件库<b class='flag-5'>开发</b>

    GD32F303红枫开发板使用手册第二 GPIO-流水灯实验

    GD32F303系列MCU最多可支持 112 个通用I/O 引脚(GPIO),分别为 PA0 ~ PA15, PB0 ~ PB15, PC0 ~ PC15,PD0 ~ PD15, PE0
    的头像 发表于 05-29 10:02 1516次阅读
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】<b class='flag-5'>第二</b><b class='flag-5'>讲</b> GPIO-流水灯<b class='flag-5'>实验</b>

    GD32F303红枫开发板使用手册】第三 GPIO-按键查询检测实验

    GD32F303系列MCU GPIO输入配置结构如下图所示,输入可配置上下拉电阻,通过施密特触发器后可通过备用功能输入或者通过输入状态寄存器进行读取。
    的头像 发表于 05-30 10:02 788次阅读
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第三<b class='flag-5'>讲</b> GPIO-按键查询检测<b class='flag-5'>实验</b>

    GD32F303红枫开发板使用手册】第五 FMC-片内Flash擦写读实验

    MC即Flash控制器,其提供了片上Flash操作所需要的所有功能,在GD32F303系列MCU中,Flash前256K字节空间内, CPU执行指令零等待,具有相同主频下最快的代码执行效率。FMC也
    的头像 发表于 06-02 10:05 715次阅读
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第五<b class='flag-5'>讲</b> FMC-片内Flash擦写读<b class='flag-5'>实验</b>

    GD32F303红枫开发板使用手册】第十六 USART-DMA串口收发实验

    在前面ADC章节中,我们介绍了DMA的工作原理,这里就不多做介绍。从GD32F303用户手册中可以查到,各串口的TX和RX分别对应DMA的不同通道,比如USART0的TX对应DMA0的通道3,而RX对应DMA0的通道4。
    的头像 发表于 06-15 09:54 976次阅读
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第十六<b class='flag-5'>讲</b> USART-DMA串口收发<b class='flag-5'>实验</b>

    GD32F303红枫开发板使用手册第二十 SPI-SPI NAND FLASH读写实验

    通过本实验主要学习以下内容: •SPI通信协议,参考19.2.1东方红开发板使用手册GD32F303 SPI操作方式,参考19.2.2东方红
    的头像 发表于 06-20 09:50 793次阅读
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】<b class='flag-5'>第二十</b><b class='flag-5'>讲</b> SPI-SPI NAND FLASH<b class='flag-5'>读写实验</b>

    GD32F303红枫开发板使用手册第二十三讲 SDIO-SD卡读写实验

    通过本实验主要学习以下内容: •SDIO操作原理 •SD卡读写实
    的头像 发表于 06-23 10:49 545次阅读
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】<b class='flag-5'>第二十</b>三讲 SDIO-SD卡<b class='flag-5'>读写实验</b>

    GD32F303红枫开发板使用手册第二十 USB-虚拟键盘实验

    ,传输速度也很快,这些特性使支持USB接口的电子设备更易用、更大众化。GD32F303系列MCU集成了USB2.0全速设备USBD模块,可以满足作为USB设备与主机
    的头像 发表于 06-27 09:42 716次阅读
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】<b class='flag-5'>第二十</b>七<b class='flag-5'>讲</b>  USB-虚拟键盘<b class='flag-5'>实验</b>