[屏驱相关] 【SWDM-QFP100-34SVEA3测评】+ SDRAM测试

[复制链接]
1508|11
 楼主| tlled 发表于 2023-4-7 09:25 | 显示全部楼层 |阅读模式
按照例程来测试下SDRAM存储器配置和读写。

1、芯片内部的SDRAM结构图
001.png


2、SDRAM设备连接图
002.png

SDRAM存储器在芯片部分封装,接口也看不到,按照测试例程来学习SDARAM存储器的配置和读写。
3、sdram.c
  1. #include "SWM341.h"

  2. void MemoryInit(void)
  3. {
  4.         SDRAM_InitStructure SDRAM_InitStruct;
  5.        
  6.         PORT_Init(PORTM, PIN13, PORTM_PIN13_SDR_CLK, 0);
  7.         PORT_Init(PORTM, PIN14, PORTM_PIN14_SDR_CKE, 0);
  8.         PORT_Init(PORTB, PIN7,  PORTB_PIN7_SDR_WE,   0);
  9.         PORT_Init(PORTB, PIN8,  PORTB_PIN8_SDR_CAS,  0);
  10.         PORT_Init(PORTB, PIN9,  PORTB_PIN9_SDR_RAS,  0);
  11.         PORT_Init(PORTB, PIN10, PORTB_PIN10_SDR_CS,  0);
  12.         PORT_Init(PORTE, PIN15, PORTE_PIN15_SDR_BA0, 0);
  13.         PORT_Init(PORTE, PIN14, PORTE_PIN14_SDR_BA1, 0);
  14.         PORT_Init(PORTN, PIN14, PORTN_PIN14_SDR_A0,  0);
  15.         PORT_Init(PORTN, PIN13, PORTN_PIN13_SDR_A1,  0);
  16.         PORT_Init(PORTN, PIN12, PORTN_PIN12_SDR_A2,  0);
  17.         PORT_Init(PORTN, PIN11, PORTN_PIN11_SDR_A3,  0);
  18.         PORT_Init(PORTN, PIN10, PORTN_PIN10_SDR_A4,  0);
  19.         PORT_Init(PORTN, PIN9,  PORTN_PIN9_SDR_A5,   0);
  20.         PORT_Init(PORTN, PIN8,  PORTN_PIN8_SDR_A6,   0);
  21.         PORT_Init(PORTN, PIN7,  PORTN_PIN7_SDR_A7,   0);
  22.         PORT_Init(PORTN, PIN6,  PORTN_PIN6_SDR_A8,   0);
  23.         PORT_Init(PORTN, PIN3,  PORTN_PIN3_SDR_A9,   0);
  24.         PORT_Init(PORTN, PIN15, PORTN_PIN15_SDR_A10, 0);
  25.         PORT_Init(PORTN, PIN2,  PORTN_PIN2_SDR_A11,  0);
  26.         PORT_Init(PORTM, PIN15, PORTM_PIN15_SDR_A12, 0);
  27.         PORT_Init(PORTE, PIN7,  PORTE_PIN7_SDR_D0,   1);
  28.         PORT_Init(PORTE, PIN6,  PORTE_PIN6_SDR_D1,   1);
  29.         PORT_Init(PORTE, PIN5,  PORTE_PIN5_SDR_D2,   1);
  30.         PORT_Init(PORTE, PIN4,  PORTE_PIN4_SDR_D3,   1);
  31.         PORT_Init(PORTE, PIN3,  PORTE_PIN3_SDR_D4,   1);
  32.         PORT_Init(PORTE, PIN2,  PORTE_PIN2_SDR_D5,   1);
  33.         PORT_Init(PORTE, PIN1,  PORTE_PIN1_SDR_D6,   1);
  34.         PORT_Init(PORTE, PIN0,  PORTE_PIN0_SDR_D7,   1);
  35.         PORT_Init(PORTE, PIN8,  PORTE_PIN8_SDR_D8,   1);
  36.         PORT_Init(PORTE, PIN9,  PORTE_PIN9_SDR_D9,   1);
  37.         PORT_Init(PORTE, PIN10, PORTE_PIN10_SDR_D10, 1);
  38.         PORT_Init(PORTE, PIN11, PORTE_PIN11_SDR_D11, 1);
  39.         PORT_Init(PORTE, PIN12, PORTE_PIN12_SDR_D12, 1);
  40.         PORT_Init(PORTE, PIN13, PORTE_PIN13_SDR_D13, 1);
  41.         PORT_Init(PORTC, PIN14, PORTC_PIN14_SDR_D14, 1);
  42.         PORT_Init(PORTC, PIN15, PORTC_PIN15_SDR_D15, 1);
  43.         PORT_Init(PORTB, PIN6,  PORTB_PIN6_SDR_LDQM, 0);
  44.         PORT_Init(PORTM, PIN12, PORTM_PIN12_SDR_UDQM,0);
  45.        
  46.         SDRAM_InitStruct.Size = SDRAM_SIZE_8MB;
  47.         SDRAM_InitStruct.ClkDiv = SDRAM_CLKDIV_1;
  48.         SDRAM_InitStruct.CASLatency = SDRAM_CASLATENCY_2;
  49.         SDRAM_InitStruct.TimeTRP  = SDRAM_TRP_3;
  50.         SDRAM_InitStruct.TimeTRCD = SDRAM_TRCD_3;
  51.         SDRAM_InitStruct.TimeTRFC  = SDRAM_TRFC_15;
  52.         SDRAM_Init(&SDRAM_InitStruct);
  53. }

  54. #define SDRAM_SIZE  (0x100000 * 2)

  55. void sdram_test(void)
  56. {
  57.         uint32_t i;
  58.         uint32_t val;

  59.         /* Word Test */
  60.         for(i = 0; i < SDRAM_SIZE; i += 4)
  61.         {
  62.                 *((volatile uint32_t *)(SDRAMM_BASE + i)) = i;
  63.         }
  64.        
  65.         for(i = 0; i < SDRAM_SIZE; i += 4)
  66.         {
  67.                 val = *((volatile uint32_t *)(SDRAMM_BASE + i));
  68.                 if(val != i)
  69.                 {
  70.                         printf("Word Test Error: 0x%08X expected, 0x%08X get\r\n", i, val);
  71.                         //while(1);
  72.                 }
  73.         }
  74.         printf("Word Test Pass!\r\n");
  75. }


4、main.c
  1. #include "SWM341.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "sdram.h"

  5. int main(void)
  6. {       
  7.         SystemInit();
  8.         SerialInit();
  9.         MemoryInit();
  10.        
  11.         //GPIO_Init(GPIOA, PIN0, 0, 1, 0, 0);                        //输入,上拉使能,接KEY
  12.        
  13.         GPIO_Init(GPIOA, PIN5, 1, 0, 0, 0);                        //输出, 接LED
  14.        
  15.         sdram_test();
  16.        
  17.         while(1==1)
  18.         {
  19.                 GPIO_InvBit(GPIOA, PIN5);
  20.                 delay_us(100000);
  21.         }
  22. }

5、程序运行
程序运行后,在串口打印测试信息
003.png
mickit 发表于 2023-4-8 20:50 | 显示全部楼层
SWM341支持扩展多大的sram
nomomy 发表于 2023-4-8 21:22 | 显示全部楼层
这个是扩展的ram吗?              
dspmana 发表于 2023-4-8 21:50 | 显示全部楼层
SWM341的性能怎么样              
robertesth 发表于 2023-4-8 22:09 | 显示全部楼层
如何把变量保存到sram中呢?              
华芯微特FAE 发表于 2023-4-10 09:16 | 显示全部楼层
robertesth 发表于 2023-4-8 22:09
如何把变量保存到sram中呢?

您可以参照这个帖子”SWM在KEIL环境中实现代码在RAM中运行 “去做
华芯微特FAE 发表于 2023-4-10 09:18 | 显示全部楼层
nomomy 发表于 2023-4-8 21:22
这个是扩展的ram吗?

这是内部叠封的SDRAM
华芯微特FAE 发表于 2023-4-10 09:19 | 显示全部楼层
dspmana 发表于 2023-4-8 21:50
SWM341的性能怎么样

SWM341 内嵌 ARM Cortex®-M33 控制器,片上包含精度为 1%以内的 20MHz/40MHz 时钟,可通过 PLL 倍频到 150MHz 时钟,提供多多种内置 FLASH/SRAM 大小可供选择,支持 ISP(在系统编程)操作及 IAP(在应用编程)。
wootz 发表于 2023-10-16 17:48 | 显示全部楼层

请问,这个内部SDRAM可以作为程序的变量区域使用么,因为片内sram 64KB 太小了; 可能性能会低但是是否是   8bit 字节访问,16bit半字访问,32bit字访问都支持么?
wootz 发表于 2023-10-16 17:50 | 显示全部楼层
wootz 发表于 2023-10-16 17:48
请问,这个内部SDRAM可以作为程序的变量区域使用么,因为片内sram 64KB 太小了; 可能性能会低但是是否是 ...

貌似 swm341支持以下sdram操作,手册中有写:
接口支持 WORD HALF WORD BYTE操作

swm32 的sdram是否也支持呢?手册中没看到说明
wootz 发表于 2023-10-16 17:53 | 显示全部楼层
找到了,swm320 的sdram仅支持 WORD级别读写
wootz 发表于 2023-10-16 17:55 | 显示全部楼层
请问楼主的cpu频率是配置的150MHz么, sdram SDRAM_CLKDIV_1 意味着 也跑相同的频率,手册写只可以到144MHz,如果是这样就有点儿超频
您需要登录后才可以回帖 登录 | 注册

本版积分规则

132

主题

701

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部