1 /******************************************************************************************************************************************
2 * 文件名称: SWM320_sdram.c
3 * 功能说明: SWM320单片机的SDRAM驱动程序
4 * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
5 * 注意事项:
6 * 版本日期: V1.1.0      2017年10月25日
7 * 升级记录:
8 *
9 *
10 *******************************************************************************************************************************************
11 * @attention
12 *
13 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
14 * REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
15 * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
16 * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
17 * -ECTION WITH THEIR PRODUCTS.
18 *
19 * COPYRIGHT 2012 Synwit Technology
20 *******************************************************************************************************************************************/
21 #include "SWM320.h"
22 #include "SWM320_sdram.h"
23 
24 /******************************************************************************************************************************************
25 * 函数名称: SDRAM_Init()
26 * 功能说明: SDRAM控制器初始化
27 * 输    入: SDRAM_InitStructure * initStruct    包含 SDRAM 控制器相关设定值的结构体
28 * 输    出: 无
29 * 注意事项: 无
30 ******************************************************************************************************************************************/
SDRAM_Init(SDRAM_InitStructure * initStruct)31 void SDRAM_Init(SDRAM_InitStructure * initStruct)
32 {
33     uint32_t row_n;
34 
35     SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
36 
37     SYS->CLKDIV &= ~SYS_CLKDIV_SDRAM_Msk;
38     SYS->CLKDIV |= (1 << SYS_CLKDIV_SDRAM_Pos);     //2分频
39 
40     SDRAMC->CR0 = (2 << SDRAMC_CR0_BURSTLEN_Pos) |  //2 Burst Length为4
41                   (initStruct->CASLatency << SDRAMC_CR0_CASDELAY_Pos);
42 
43     SDRAMC->CR1 = (initStruct->CellSize << SDRAMC_CR1_CELLSIZE_Pos) |
44                   (initStruct->CellWidth << SDRAMC_CR1_CELL32BIT_Pos) |
45                   ((initStruct->CellSize == SDRAM_CELLSIZE_16Mb ? SDRAM_CELLBANK_2 : SDRAM_CELLBANK_4) << SDRAMC_CR1_BANK_Pos) |
46                   (0 << SDRAMC_CR1_32BIT_Pos) |
47                   (initStruct->TimeTMRD << SDRAMC_CR1_TMRD_Pos) |
48                   (initStruct->TimeTRRD << SDRAMC_CR1_TRRD_Pos) |
49                   (initStruct->TimeTRAS << SDRAMC_CR1_TRAS_Pos) |
50                   (initStruct->TimeTRC << SDRAMC_CR1_TRC_Pos) |
51                   (initStruct->TimeTRCD << SDRAMC_CR1_TRCD_Pos) |
52                   (initStruct->TimeTRP << SDRAMC_CR1_TRP_Pos);
53 
54     SDRAMC->LATCH = 0x02;
55 
56     switch(initStruct->CellSize)
57     {
58     case SDRAM_CELLSIZE_16Mb:  row_n = 11; break;
59     case SDRAM_CELLSIZE_64Mb:  row_n = 12; break;
60     case SDRAM_CELLSIZE_128Mb: row_n = 12; break;
61     case SDRAM_CELLSIZE_256Mb: row_n = 13; break;
62     default:                   row_n = 13; break;
63     }
64 
65     SDRAMC->REFRESH = (1 << SDRAMC_REFRESH_EN_Pos) |
66                       (((SystemCoreClock/2)/1000 * initStruct->RefreshTime / (1 << row_n)) << SDRAMC_REFRESH_RATE_Pos);
67 
68     while(SDRAMC->REFDONE == 0);
69 }
70 
71 /******************************************************************************************************************************************
72 * 函数名称: SDRAM_Enable()
73 * 功能说明: SDRAM使能,使能后可读写SDRAM
74 * 输    入: 无
75 * 输    出: 无
76 * 注意事项: 无
77 ******************************************************************************************************************************************/
SDRAM_Enable(void)78 void SDRAM_Enable(void)
79 {
80     uint32_t i;
81 
82     SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
83     SDRAMC->REFRESH |= (1 << SDRAMC_REFRESH_EN_Pos);
84 
85     for(i = 0; i < 100; i++) __NOP();
86 }
87 
88 /******************************************************************************************************************************************
89 * 函数名称: SDRAM_Disable()
90 * 功能说明: SDRAM禁能,禁能后SDRAM颗粒进入低功耗模式、并自刷新,不可读写
91 * 输    入: 无
92 * 输    出: 无
93 * 注意事项: 无
94 ******************************************************************************************************************************************/
SDRAM_Disable(void)95 void SDRAM_Disable(void)
96 {
97     uint32_t i;
98 
99     SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
100     SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
101 
102     for(i = 0; i < 100; i++) __NOP();
103 }
104