GD32F470系列1:调用EXMC与FPGA通信实例

这篇具有很好参考价值的文章主要介绍了GD32F470系列1:调用EXMC与FPGA通信实例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、EXMC简介

EXMC是GD32单片机系列的外部并行总线接口,用来访问各种片外存储器,通过配置寄存器,EXMC可以把AMBA协议转换为专用的片外存储器通信协议,包括SRAM,ROM,NOR Flash,NAND Flash,PC Card和SDRAM。用户还可以调整相关的时间参数来提高通信效率。EXMC的访问空间被划分为许多个块(Bank),每个块支持特定的存储器类型,用户可以通过对Bank的控制寄存器配置来控制外部存储器。


本文采用EXMC的异步通信模式A配置供作参考

二、EXMC区域划分及region划分

GD32F470系列1:调用EXMC与FPGA通信实例
在本文博客中才使用的是Bank0。下面则是该bank内Region的划分。在该文中我们采用NOR/PSRAM0M存储器类型去控制,该模式最为方便控制。该区域对应Region为Region0。对应操作寄存器地址为0x60000000—0x63ff ffff。
GD32F470系列1:调用EXMC与FPGA通信实例
在该处,程序配置的寄存器类型一定要跟Region匹配,否则没法正常读写。

三、读写时序图

在该部分采用的是异步通信的模式A,其主要控制线为ne0(1,2,3),nwe, noe。我们后面在FPGA端解析协议时也是靠这几根线的变化去判断控制。

1.模式A读时序控制

GD32F470系列1:调用EXMC与FPGA通信实例
在读时序中可以看到,NEx信号在单次传输中保持为低电平,而读操作时 NOE信号线在传输后半段时间拉低,并在此时间读取数据线上数据。FPGA端则可以将这两根信号线的同时低电平作为判决条件往数据线上放数据。

2.模式A写时序控制

GD32F470系列1:调用EXMC与FPGA通信实例
写时序与读类似,只是NWE在写操作过程中拉低。

3.寄存器配置

1. 需配置寄存器

该部分为模式A时EXMC寄存器配置

/* EXMC NOR/SRAM initialize structure */
typedef struct
{
    uint32_t norsram_region;  
    /*选择读写区域,可选:EXMC_BANK0_NORSRAM_REGIONx, x=0..3 */
    uint32_t write_mode; 
    /*同步/异步写入模式控制 
    异步EXMC_ASYN_WRITE, 同步EXMC_SYN_WRITE */
    uint32_t extended_mode;                                  
    /*是否是能扩展模式,即使能EXMC_SNWTCFGx,此处未使能*/
    /*若使能扩展模式则可通过通过寄存器
    EXMC_SNTCFGx和EXMC_SNWTCFGx将读写配置成独立的时序*/
    uint32_t asyn_wait;   
    /*是否使能异步等待 */
    uint32_t nwait_signal;  
    /*等待输入信号使能 */
    uint32_t memory_write;                           
    /*写入外部存储器使能 */
    uint32_t nwait_config;                                  
    /*等待输入配置, 
    EXMC_NWAIT_CONFIG_BEFORE, EXMC_NWAIT_CONFIG_DURING*/
    uint32_t wrap_burst_mode;                                  
    /*包突发访问使能 */
    uint32_t nwait_polarity;                                 
    /*等待输入信号高低电平有效控制,
    EXMC_NWAIT_POLARITY_LOW, EXMC_NWAIT_POLARITY_HIGH */
    uint32_t burst_mode;                             
    /*突发模式使能 */
    uint32_t databus_width;                           
    /*数据传输宽度设置,可选8/16位
    EXMC_NOR_DATABUS_WIDTH_8B, EXMC_NOR_DATABUS_WIDTH_16B */
    uint32_t memory_type;     
    /*寄存器类型  EXMC_MEMORY_TYPE_SRAM, 
    EXMC_MEMORY_TYPE_PSRAM, EXMC_MEMORY_TYPE_NOR */
    uint32_t address_data_mux;        
    /*地址数据线是否复用*/
    
    exmc_norsram_timing_parameter_struct* read_write_timing;       
    /*若使能扩展模式,此结构体则为读模式时序控制;若未使能,则为读写时序统一设置 */
    exmc_norsram_timing_parameter_struct* write_timing;        
    /*使能拓展模式时写时序控制 */
}exmc_norsram_parameter_struct;

时序控制参数

/* EXMC NOR/SRAM timing initialize structure */
typedef struct
{
    uint32_t asyn_access_mode;                      
    /*异步地址访问时间 */
    uint32_t syn_data_latency;                      
    /*同步访问中获得第一个数据所需要的等待延迟 */
    uint32_t syn_clk_division;                          
    /*同步访问时钟分频系数(从HCLK中分频) */
    uint32_t bus_latency;               
    /*!< 访问总线延迟时间 */
    uint32_t asyn_data_setuptime;                              
    /*异步数据建立时间 */
    uint32_t asyn_address_holdtime;                              
    /*异步地址保持时间 */
    uint32_t asyn_address_setuptime;        
    /*异步地址建立时间 */
}exmc_norsram_timing_parameter_struct;

该处均需配置,根据是否使能拓展模式是否对读写单独配置。

2. 配置程序参考

exmc_norsram_parameter_struct norsram_init_struct;
exmc_norsram_timing_parameter_struct norsram_timing_init_struct;
//结构体重构

		rcu_periph_clock_enable(RCU_EXMC);                                                                  
		rcu_periph_clock_enable(RCU_GPIOD);
		rcu_periph_clock_enable(RCU_GPIOE);
		rcu_periph_clock_enable(RCU_GPIOB);
//时钟使能,后把相关引脚都使能,此处不详写		
		
		norsram_timing_init_struct.asyn_address_setuptime = 9;
		//地址建立时间
		norsram_timing_init_struct.asyn_address_holdtime = 1;
		//地址保持时间
		norsram_timing_init_struct.asyn_data_setuptime = 8;
		//数据建立时间
		norsram_timing_init_struct.bus_latency = 0;
		//总线延迟
		norsram_timing_init_struct.syn_clk_division = EXMC_SYN_CLOCK_RATIO_2_CLK;
		//此处同步访问时钟分频系数,实测即使异步模式也不能设置为0
		norsram_timing_init_struct.syn_data_latency = EXMC_DATALAT_2_CLK;
		//同步数据等待延迟
		norsram_timing_init_struct.asyn_access_mode = EXMC_ACCESS_MODE_A;

读写时序参数参考

		norsram_init_struct.norsram_region = EXMC_BANK0_NORSRAM_REGION0;
		//使用 region 0
		norsram_init_struct.address_data_mux = ENABLE;
		//使能地址数据复用,也可以不复用
		norsram_init_struct.memory_type = EXMC_MEMORY_TYPE_NOR;
		//存储器类型设置为NOR,我测试时SRAM不能用
		norsram_init_struct.databus_width = EXMC_NOR_DATABUS_WIDTH_16B;
		norsram_init_struct.burst_mode = DISABLE;
		//禁用突发模式
		norsram_init_struct.nwait_polarity = EXMC_NWAIT_POLARITY_LOW;
		//等待信号低有效
		norsram_init_struct.wrap_burst_mode = DISABLE;
		//禁止包突发
		norsram_init_struct.nwait_config = EXMC_NWAIT_CONFIG_BEFORE;
		norsram_init_struct.memory_write = ENABLE;
		norsram_init_struct.nwait_signal = DISABLE;
		norsram_init_struct.extended_mode = DISABLE;
		norsram_init_struct.asyn_wait = DISABLE;
		norsram_init_struct.write_mode = EXMC_ASYN_WRITE;

3. 读写时操作地址范例

void FSMC_SRAM_ReadBuffer_single(uint16_t* pBuffer)
{
		for(j=0;j<12288;j++){
			if(flag){
				*pBuffer += *(uint16_t*) (0x60000000); }
			else{
				*pBuffer = *(uint16_t*) (0x60000000);		
			}
			pBuffer++;	
		}		
}

此处代码功能为向Bank0—Region0 读取数据12288次,在读取中为固定地址读取,减小引脚变化以节省损耗。


总结

EXMC相比于FSMC基本上完全一致,完整的工程代码在底部放置了链接,有啥问题也可以在评论区一起讨论。‘
链接: GD32 调用 EXMC 与FGPA通信文章来源地址https://www.toymoban.com/news/detail-413344.html

到了这里,关于GD32F470系列1:调用EXMC与FPGA通信实例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GD32F103 硬件SPI通信

    SPI既可以做主机也可以做从机。 当做主机时。MOSI,SCK,CS都是作为输出。 而作为从机时。MOSI,SCK,CS都是作为输入。  所以SPI的硬件电路应该实现这样的功能。 1. GD32框图 如下图做主机的数据流向:   如下图做从机的数据流向:    2. STM32框图  通过一些寄存器的配置来控制

    2024年02月02日
    浏览(33)
  • 【GD32】从零开始学GD32单片机高级篇——外部存储器控制器EXMC详解+SDRAM读写例程

    外部存储器控制器EXMC,用来访问各种片外存储器,通过配置寄存器,EXMC可以把AMBA 协议转换为专用的片外存储器通信协议,包括 SRAM,ROM,NOR Flash,NAND Flash,PC Card和SDRAM 。 EXMC的工作原理其实就是把外部储存器的地址映射到内部的特定地址上,用户想访问外部的存储器,我们

    2024年02月10日
    浏览(88)
  • gd32 exmc 连接 mcu 8080TFT 驱动(8pin/16pin)ST7789,40帧每秒240*320;

    #include \\\"gd32e50x.h\\\" #if    0  //RS~A23   16根数据线 #define BANK0_LCD_D         ((uint32_t)0x61000000)    //LCD data address,RS~A23 16线  2^23*2=0x1000000  #define BANK0_LCD_C         ((uint32_t)0x60000000)    //LCD register address Alternate2: EXMC_NE0=PD7~LCD_CS #define LCD_WR_DATA(value)    ((*(__IO uint16_t*)(BANK0_LCD_D)) = (

    2024年01月17日
    浏览(36)
  • Xilinx 7系列FPGA配置(ug470)

    如果 M[2:0] 为 ”101“,则该FPGA 只支持 JTAG 进行配置。处于其余配置模式下时,依旧可以使用 JTAG 模式进行调试,并且优先级最高。 串行配置模式 接口 从-连接方式 主-连接方式 除了CCLK 连接不同,其他都和从串行模式一样 串行菊花链(非同时配置) 上升沿采样DIN数据,下降

    2024年03月22日
    浏览(42)
  • [GD32F4]基于GD32固件库移植cherryusb[STM32F4]

    [GD32F4]基于GD32固件库移植cherryusb[STM32F4] 使用开发板是淘宝买的不知名开发板,没什么好说的,具体的型号是GD32F450VET6。 使用的cherryusb版本是0.9.0版本。 使用的GD32官方固件库版本是:GD32F4xx_Firmware_Library_V3.0.4 cherryusb最牛的地方在于抛弃掉所有的依赖,只需要知道芯片的usb中断

    2024年02月06日
    浏览(44)
  • GD32F4移植STM32F4

    近期在项目中采用了GD32F407VET6替换原项目中的STM32F407VET6,网传GD的兼容性很好,之前也用F1系统的替换了一下,按照CSND各位大佬的经验一步步改进了代码,测试直接通过,现在也一直在项目中实际应用了,一直没有出问题。 所以这SMT时,嘉立创没有STM的货果断换成了GD,可换时

    2024年02月16日
    浏览(72)
  • GD32F4(9):GD32f4出现上电不工作,必须按复位程序才能跑起来

    绘制一个gd32450的pcb板子,结果烧录程序后发生下面事情: 上电程序不能正常启动或者偶尔可以正常启动一次,很随机。 当上电后程序不启动的时候,我再按一下mcu的reset按键,程序就能正常启动了。 当我debug调试的时候,回回都能正常启动,根本定位不到问题 首先在板子里

    2023年04月08日
    浏览(46)
  • 关于两个STM32F103系列单片机的蓝牙通信

       毕设做的是掌控小车,因此采用蓝牙通信作为小车和手部通信,前段时间做出实物,对其遇到的问题以及解决的方法做一些总结。一个主控芯片采用STM32F103ZET6,另一个主控芯片采用STM32F103C8T6,原因是本来准备了两个主控C8T6,不小心烧了一个。 1.两个蓝牙的配对  需要准

    2024年02月13日
    浏览(47)
  • GD32F103输入捕获

    GD32F103输入捕获程序,经过多次测试,终于完成了。本程序将TIMER2_CH2通道映射到PB0引脚,捕获PB0引脚低电平脉冲时间宽度。PB0是一个按钮,第1次按下采集一个值保存到TIMER2_CountValue1中,第2次按下采集一个值保存到TIMER2_CountValue2中,然后计算其低电平时间宽度。 网上也有人写

    2024年02月14日
    浏览(35)
  • GD32F303固件库开发

    芯片和开发板都可免费申请,暂时只能以公司名义免费申请,填下下面表格即可。 https://www.wjx.top/vm/wFGhGPF.aspx 使用GDLINK、jlink、串口下载程序到GD芯片。 https://blog.csdn.net/qq_24312945/article/details/124325797 芯片读保护以后,flash将不可以从外部读取,这样可以防止别人读取或者盗取

    2023年04月17日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包