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)31void 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)78void 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)95void 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