你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32f746gdiscovery SDRAM 驱动

[复制链接]
STMCU小助手 发布时间:2021-12-15 11:00
STM32f746gdiscovery 开发板使用的是16MB的SDRAM,由于少了一根地址线,只有8MB可用。

20200203105659315.png



  1. /*************************************************************************************************************
  2. * 文件名                :        stm32f7_sdram.c
  3. * 功能                        :        STM32F7 外部SDRAM驱动
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  5. * 创建时间                :        2019-09-08
  6. * 最后修改时间        :        2019-09-08
  7. * 详细                        :        2019-10-31 设置突发长度:4(可以是1/2/4/8)-测试过1/2/4发现都正常,唯独8的时候,屏幕会出现随机噪点
  8. *************************************************************************************************************/        
  9. #include "stm32f7_sdram.h"
  10. #include "SYSTEM.H"



  11. //BANK选择
  12. typedef enum
  13. {
  14.         SDRAM_CMD_BANK1 = 2,        //命令模板存储区域1
  15.         SDRAM_CMD_BANK2 = 1,        //命令模板存储区域2
  16.         SDRAM_CMD_BANK1_2 = 3,        //命令模板存储区域1与2
  17. }SDRAM_CMD_BANK_SELECT;


  18. //命令
  19. typedef enum
  20. {
  21.         SDRAM_CMD_NORMAL                 = 0,        //正常模式
  22.         SDRAM_CMD_CLOCK_CONFIG         = 1,        //时钟配置使能
  23.         SDRAM_CMD_PALL                         = 2,        //预充电所有存储区域
  24.         SDRAM_CMD_AR                         = 3,        //自刷新命令
  25.         SDRAM_CMD_LOAD_MODE         = 4,        //加载模式寄存器
  26.         //SDRAM_CMD_AR = 5,        //自刷新命令
  27.         SDRAM_CMD_POWER_DOWN         = 6,        //掉电命令
  28. }SDRAM_CMD_TYPE;


  29. bool SDRAM_SendCmd(SDRAM_CMD_BANK_SELECT BankSelect, u16 mode, u8 AutoRefresh, SDRAM_CMD_TYPE cmd);//SDRAM 命令模式设置


  30. /*************************************************************************************************************************
  31. * 函数        :                        void SDRAM_Init(void)
  32. * 功能        :                        SDRAM 接口初始化
  33. * 参数        :                        无
  34. * 返回        :                        无
  35. * 依赖        :                        底层宏定义
  36. * 作者        :                        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  37. * 时间        :                        2019-09-08
  38. * 最后修改时间 :         2019-09-08
  39. * 说明        :                         用于初始化STM32F7 SDRAM 接口
  40. *************************************************************************************************************************/  
  41. void SDRAM_Init(void)
  42. {
  43.         u32 temp;
  44.         
  45.         SYS_DeviceClockEnable(DEV_FSMC, TRUE);        //FSMC时钟使能
  46.         SYS_DeviceClockEnable(DEV_GPIOC, TRUE);        //使能GPIOC时钟
  47.         SYS_DeviceClockEnable(DEV_GPIOD, TRUE);        //使能GPIOD时钟
  48.         SYS_DeviceClockEnable(DEV_GPIOE, TRUE);        //使能GPIOE时钟
  49.         SYS_DeviceClockEnable(DEV_GPIOF, TRUE);        //使能GPIOF时钟
  50.         SYS_DeviceClockEnable(DEV_GPIOG, TRUE);        //使能GPIOG时钟
  51.         SYS_DeviceClockEnable(DEV_GPIOH, TRUE);        //使能GPIOH时钟
  52.         
  53.         //初始化IO
  54.         SYS_GPIOx_Init(GPIOC, BIT3, AF_PP_OPU, SPEED_100M);                                                                                                        //PC3                        
  55.         SYS_GPIOx_Init(GPIOD, BIT0|BIT1|BIT8|BIT9|BIT10|BIT14|BIT15, AF_PP_OPU, SPEED_100M);                                                        //PD0/1/8/9/10/14/15               
  56.         SYS_GPIOx_Init(GPIOE, BIT0|BIT1|(0X1FF<<7), AF_PP_OPU, SPEED_100M);                                                                                                //PE0/1/7~15        
  57.         SYS_GPIOx_Init(GPIOF, BIT0|BIT1|BIT2|BIT3|BIT4|BIT5|BIT11|BIT12|BIT13|BIT14|BIT15, AF_PP_OPU, SPEED_100M);                //PF0~5/11~15                                       
  58.         SYS_GPIOx_Init(GPIOG, BIT0|BIT1|BIT4|BIT5|BIT8|BIT15, AF_PP_OPU, SPEED_100M);                                                                //PG0/1/4/5/8/15
  59.         SYS_GPIOx_Init(GPIOH, BIT3|BIT5, AF_PP_OPU, SPEED_100M);
  60.         
  61.          SYS_GPIOx_SetAF(GPIOC, 3, AF12_FSMC);        //PC3,AF12
  62.         
  63.          SYS_GPIOx_SetAF(GPIOD, 0, AF12_FSMC);        //PD0,AF12
  64.          SYS_GPIOx_SetAF(GPIOD, 1, AF12_FSMC);        //PD1,AF12
  65.          SYS_GPIOx_SetAF(GPIOD, 8, AF12_FSMC);        //PD8,AF12
  66.          SYS_GPIOx_SetAF(GPIOD, 9, AF12_FSMC);        //PD9,AF12
  67.          SYS_GPIOx_SetAF(GPIOD, 10, AF12_FSMC);        //PD10,AF12  
  68.          SYS_GPIOx_SetAF(GPIOD, 14, AF12_FSMC);        //PD14,AF12
  69.          SYS_GPIOx_SetAF(GPIOD, 15, AF12_FSMC);        //PD15,AF12
  70.         
  71.          SYS_GPIOx_SetAF(GPIOE, 0, AF12_FSMC);        //PE0,AF12
  72.          SYS_GPIOx_SetAF(GPIOE, 1, AF12_FSMC);        //PE1,AF12
  73.          SYS_GPIOx_SetAF(GPIOE, 7, AF12_FSMC);        //PE7,AF12
  74.          SYS_GPIOx_SetAF(GPIOE, 8, AF12_FSMC);        //PE8,AF12
  75.          SYS_GPIOx_SetAF(GPIOE, 9, AF12_FSMC);        //PE9,AF12
  76.          SYS_GPIOx_SetAF(GPIOE, 10, AF12_FSMC);        //PE10,AF12
  77.          SYS_GPIOx_SetAF(GPIOE, 11, AF12_FSMC);        //PE11,AF12
  78.          SYS_GPIOx_SetAF(GPIOE, 12, AF12_FSMC);        //PE12,AF12
  79.          SYS_GPIOx_SetAF(GPIOE, 13, AF12_FSMC);        //PE13,AF12
  80.          SYS_GPIOx_SetAF(GPIOE, 14, AF12_FSMC);        //PE14,AF12
  81.          SYS_GPIOx_SetAF(GPIOE, 15, AF12_FSMC);        //PE15,AF12

  82.          SYS_GPIOx_SetAF(GPIOF, 0, AF12_FSMC);        //PF0,AF12
  83.          SYS_GPIOx_SetAF(GPIOF, 1, AF12_FSMC);        //PF1,AF12
  84.          SYS_GPIOx_SetAF(GPIOF, 2, AF12_FSMC);        //PF2,AF12
  85.          SYS_GPIOx_SetAF(GPIOF, 3, AF12_FSMC);        //PF3,AF12
  86.          SYS_GPIOx_SetAF(GPIOF, 4, AF12_FSMC);        //PF4,AF12
  87.          SYS_GPIOx_SetAF(GPIOF, 5, AF12_FSMC);        //PF5,AF12
  88.          SYS_GPIOx_SetAF(GPIOF, 11, AF12_FSMC);        //PF11,AF12
  89.          SYS_GPIOx_SetAF(GPIOF, 12, AF12_FSMC);        //PF12,AF12
  90.          SYS_GPIOx_SetAF(GPIOF, 13, AF12_FSMC);        //PF13,AF12
  91.          SYS_GPIOx_SetAF(GPIOF, 14, AF12_FSMC);        //PF14,AF12
  92.          SYS_GPIOx_SetAF(GPIOF, 15, AF12_FSMC);        //PF15,AF12
  93.         
  94.          SYS_GPIOx_SetAF(GPIOG, 0, AF12_FSMC);        //PG0,AF12
  95.          SYS_GPIOx_SetAF(GPIOG, 1, AF12_FSMC);        //PG1,AF12
  96.          SYS_GPIOx_SetAF(GPIOG, 4, AF12_FSMC);        //PG4,AF12
  97.          SYS_GPIOx_SetAF(GPIOG, 5, AF12_FSMC);        //PG5,AF12  
  98.          SYS_GPIOx_SetAF(GPIOG, 8, AF12_FSMC);        //PG8,AF12
  99.          SYS_GPIOx_SetAF(GPIOG, 15, AF12_FSMC);        //PG15,AF12
  100.         
  101.         SYS_GPIOx_SetAF(GPIOH, 3, AF12_FSMC);        //PH3,AF12
  102.          SYS_GPIOx_SetAF(GPIOH, 5, AF12_FSMC);        //PH5,AF12  
  103.         

  104.         temp = 0;
  105.         temp |= 0<<0;                                        //8位列地址
  106.         temp |= 1<<2;                                        //12位行地址
  107.         temp |= 1<<4;                                        //16位数据位宽
  108.         temp |= 1<<6;                                        //4个内部存区(4 BANKS)
  109.         temp |= 2<<7;                                        //2个CAS延迟
  110.         temp |= 0<<9;                                        //允许写访问
  111.         temp |= 2<<10;                                        //SDRAM时钟=HCLK/2
  112.         temp |= 1<<12;                                        //使能突发访问
  113.         temp |= 0<<13;                                        //读通道延迟0个HCLK
  114.          FMC_Bank5_6->SDCR[0] = temp;        //设置FMC BANK5 SDRAM控制寄存器(BANK5和6用于管理SDRAM).

  115.         temp = 0;
  116.         temp|=1<<0;                                                //加载模式寄存器到激活时间的延迟为2个时钟周期
  117.         temp|=5<<4;                                                //退出自刷新延迟为6个时钟周期
  118.         temp|=3<<8;                                                //自刷新时间为4个时钟周期
  119.         temp|=5<<12;                                        //行循环延迟为6个时钟周期
  120.         temp|=1<<16;                                        //恢复延迟为2个时钟周期
  121.         temp|=1<<20;                                        //行预充电延迟为2个时钟周期
  122.         temp|=1<<24;                                        //行到列延迟为2个时钟周期
  123.          FMC_Bank5_6->SDTR[0] = temp;        //设置FMC BANK5 SDRAM时序寄存器

  124.         SDRAM_SendCmd(SDRAM_CMD_BANK1, 0, 1, SDRAM_CMD_CLOCK_CONFIG);        //时钟配置使能        
  125.         Delay_US(300);                                        //至少延迟200us.
  126.         SDRAM_SendCmd(SDRAM_CMD_BANK1,0, 1, SDRAM_CMD_PALL);                        //对所有存储区预充电
  127.         SDRAM_SendCmd(SDRAM_CMD_BANK1,0, 8, SDRAM_CMD_AR);                                //设置自刷新次数
  128.         
  129.         temp = 0;
  130.         temp |= 2<<0;                                        //设置突发长度:4(可以是1/2/4/8)        -测试过1/2/4发现都正常,唯独8的时候,屏幕会出现随机噪点
  131.         temp |= 0<<3;                                        //设置突发类型:连续(可以是连续/交错)
  132.         temp |= 2<<4;                                        //设置CAS值:2
  133.         temp |= 0<<7;                                        //设置操作模式:0,标准模式
  134.         temp |= 1<<9;                                        //设置突发写模式:1,单点访问
  135.         SDRAM_SendCmd(SDRAM_CMD_BANK1,temp, 1, SDRAM_CMD_LOAD_MODE);                                //设置SDRAM模式
  136.         
  137.         //COUNT=SDRAM刷新周期/行数-20
  138.         //SDRAM刷新周期为64ms,SDCLK=AHB/2=100Mhz,行数为4096.
  139.         //计算方法为64*1000*AHB/2/4096-20
  140.         temp = 64*1000*(SYS_GetAHBClockSpeed()/1000000/2)/4096-20;
  141.         FMC_Bank5_6->SDRTR = temp<<1;                //设置刷新频率计数器
  142. }


  143. /*************************************************************************************************************************
  144. * 函数        :                        bool SDRAM_SendCmd(SDRAM_CMD_BANK_SELECT BankSelect, u16 mdr, u8 AutoRefresh, SDRAM_CMD_TYPE mode)
  145. * 功能        :                        SDRAM 命令模式设置
  146. * 参数        :                        BankSelect:bank选择;mdr:模式;AutoRefresh:自刷新设置;mode:模式命令
  147. * 返回        :                        TRUE:成功;FALSE:失败
  148. * 依赖        :                        底层宏定义
  149. * 作者        :                        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  150. * 时间        :                        2019-09-08
  151. * 最后修改时间 :         2019-09-08
  152. * 说明        :                        
  153. *************************************************************************************************************************/  
  154. bool SDRAM_SendCmd(SDRAM_CMD_BANK_SELECT BankSelect, u16 mdr, u8 AutoRefresh, SDRAM_CMD_TYPE mode)
  155. {
  156.         u32 retry=0;
  157.         u32 temp = 0;
  158.         
  159.         temp |= mode<<0;                                        //设置指令
  160.         temp |= BankSelect<<3;                                //设置发送指令到bank5还是6
  161.         temp |= (AutoRefresh&0xf)<<5;                //设置自刷新次数
  162.         temp |= mdr<<9;                                                //设置模式寄存器的值
  163.         FMC_Bank5_6->SDCMR = temp;                        //配置寄存器
  164.         
  165.         //temp = FMC_Bank5_6->SDCMR;
  166.         //uart_printf("FMC_Bank5_6->SDCMR=%X\r\n", temp);
  167.         while((FMC_Bank5_6->SDSR&(1<<5)))        //等待指令发送完成
  168.         {
  169.                 retry++;
  170.                 Delay_US(1);
  171.                 if(retry > 50000)return FALSE;
  172.         }
  173.         
  174.         
  175.         return TRUE;
  176. }
复制代码


        
  1. /*************************************************************************************************************
  2. * 文件名                :        stm32f7_sdram.h
  3. * 功能                        :        STM32F7 外部SDRAM驱动
  4. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  5. * 创建时间                :        2019-09-08
  6. * 最后修改时间        :        2019-09-08
  7. * 详细:        
  8. *************************************************************************************************************/               
  9. #ifndef __STM32F7_SDRAM_H_
  10. #define        __STM32F7_SDRAM_H_           
  11. #include "system.h"


  12. //========================================================================
  13. // SRAM硬件相关配置
  14. //------------------------------------------------------------------------
  15. #define         Bank5_SDRAM_ADDR    ((u32)0XC0000000)
  16.         
  17. void SDRAM_Init(void);        //SDRAM初始化


  18. #endif //__STM32F7_SDRAM_H_
复制代码


收藏 评论0 发布时间:2021-12-15 11:00

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版