1368|3

2943

帖子

4

TA的资源

五彩晶圆(中级)

楼主
 

STM32 SDRAM奇怪的读写问题 [复制链接]

斥巨资买了一块STM32F746G-DISCO开发板,上电工作正常。应该不存在硬件或PCB布线问题。我想仔细的研究一下STM32的所有硬件接口,就开始做实验,但是就是一个SDRAM的实验就让我很崩溃。

过程如下:使用STM32CubeMX最新版6.10.0,参考BOARD Selector的设计,设置了一个简单应用。

 

参数于参考相同。GPIO的设置也相同,这点很重要,因为默认的GPIO和板子的设计是有出入的。需要修改PC3的引脚。

 

修改完成后,需要修改CLOCK的设置也要与开发板相同。

 

因为很多的外设没有设置,所以和参考设计有些出入。但是基本是相同的。接下来就是程序了。代码如下:

  • int main(void)
  • {
  • /* USER CODE BEGIN 1 */
  • uint16_t sdramv[1000] __attribute__ ((at(0xC0000000)));
  • /* USER CODE END 1 */
  • /* MCU Configuration--------------------------------------------------------*/
  • /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  • HAL_Init();
  • /* USER CODE BEGIN Init */
  • /* USER CODE END Init */
  • /* Configure the system clock */
  • SystemClock_Config();
  • /* USER CODE BEGIN SysInit */
  • /* USER CODE END SysInit */
  • /* Initialize all configured peripherals */
  • MX_GPIO_Init();
  • MX_FMC_Init();
  • MX_USART1_UART_Init();
  • /* USER CODE BEGIN 2 */
  • printf("\n\r UART Printf Example: retarget the C library printf function to the UART\n\r");
  • /* USER CODE END 2 */
  • sdramv[0] = 1000;
  • sdramv[1] = 2000;
  • // for(int16_t i=2;i<2000;i++)
  • // {
  • // sdramv[i]=(int16_t)i;
  • // }
  • printf("value=%d\n",sdramv[0]);
  • printf("value=%d\n",sdramv[1]);
  • // for(int16_t i=0;i<2;i++)
  • // {
  • // printf("value=%d\n",sdramv[i]);
  • // }
  • /* Infinite loop */
  • /* USER CODE BEGIN WHILE */
  • while (1)
  • {
  • /* USER CODE END WHILE */
  • HAL_Delay(100);
  • /* USER CODE BEGIN 3 */
  • }
  • /* USER CODE END 3 */
  • }

代码主要是使用一个数组读写数据和printf输出内存数据,检验程序是否成功。

 

这个程序运行结果与预期相同。但是将程序修改成循环就不一样了。

  • int main(void)
  • {
  • /* USER CODE BEGIN 1 */
  • uint16_t sdramv[1000] __attribute__ ((at(0xC0000000)));
  • /* USER CODE END 1 */
  • /* MCU Configuration--------------------------------------------------------*/
  • /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  • HAL_Init();
  • /* USER CODE BEGIN Init */
  • /* USER CODE END Init */
  • /* Configure the system clock */
  • SystemClock_Config();
  • /* USER CODE BEGIN SysInit */
  • /* USER CODE END SysInit */
  • /* Initialize all configured peripherals */
  • MX_GPIO_Init();
  • MX_FMC_Init();
  • MX_USART1_UART_Init();
  • /* USER CODE BEGIN 2 */
  • printf("\n\r UART Printf Example: retarget the C library printf function to the UART\n\r");
  • /* USER CODE END 2 */
  • // sdramv[0] = 1000;
  • // sdramv[1] = 2000;
  • for(int16_t i=0;i<2;i++)
  • {
  • sdramv[i]=(int16_t)i;
  • }
  • // printf("value=%d\n",sdramv[0]);
  • // printf("value=%d\n",sdramv[1]);
  • for(int16_t i=0;i<2;i++)
  • {
  • printf("value=%d\n",sdramv[i]);
  • }
  • /* Infinite loop */
  • /* USER CODE BEGIN WHILE */
  • while (1)
  • {
  • /* USER CODE END WHILE */
  • HAL_Delay(100);
  • /* USER CODE BEGIN 3 */
  • }
  • /* USER CODE END 3 */
  • }

 

  程序就卡在这里无法继续。程序根本就到不了循环。

  程序逻辑上应该没有什么不一样的。请知道的高手给指导。

 

 

此帖出自stm32/stm8论坛

最新回复

学习!感谢楼主的分享,楼主的分享很不错!  详情 回复 发表于 2023-11-29 02:45
点赞 关注
 

回复
举报

2943

帖子

4

TA的资源

五彩晶圆(中级)

沙发
 

后面的程序连初始化都进入不了。

此帖出自stm32/stm8论坛
 
 

回复

25

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

学习!感谢楼主的分享,楼主的分享很不错!


此帖出自stm32/stm8论坛
 
 

回复

2943

帖子

4

TA的资源

五彩晶圆(中级)

4
 

这个问题搞定了,是因为除了MX_FMC_Init外还需要启动SDRAM外设的操作。

  • static void BSP_SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command)
  • {
  • __IO uint32_t tmpmrd =0;
  • /* Step 3: Configure a clock configuration enable command */
  • Command->CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;
  • Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
  • Command->AutoRefreshNumber = 1;
  • Command->ModeRegisterDefinition = 0;
  • /* Send the command */
  • HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);
  • /* Step 4: Insert 100 us minimum delay */
  • /* Inserted delay is equal to 1 ms due to systick time base unit (ms) */
  • HAL_Delay(1);
  • /* Step 5: Configure a PALL (precharge all) command */
  • Command->CommandMode = FMC_SDRAM_CMD_PALL;
  • Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
  • Command->AutoRefreshNumber = 1;
  • Command->ModeRegisterDefinition = 0;
  • /* Send the command */
  • HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);
  • /* Step 6 : Configure a Auto-Refresh command */
  • Command->CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
  • Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
  • Command->AutoRefreshNumber = 8;
  • Command->ModeRegisterDefinition = 0;
  • /* Send the command */
  • HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);
  • /* Step 7: Program the external memory mode register */
  • tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1 |
  • SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL |
  • SDRAM_MODEREG_CAS_LATENCY_2 |
  • SDRAM_MODEREG_OPERATING_MODE_STANDARD |
  • SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;
  • Command->CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
  • Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
  • Command->AutoRefreshNumber = 1;
  • Command->ModeRegisterDefinition = tmpmrd;
  • /* Send the command */
  • HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);
  • /* Step 8: Set the refresh rate counter */
  • /* (15.62 us x Freq) - 20 */
  • /* Set the device refresh counter */
  • hsdram->Instance->SDRTR |= ((uint32_t)((1292)<< 1));
  • }

否则无法使用FMC外设。

此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条
有奖直播报名| TI 面向楼宇和工厂自动化行业的毫米波雷达解决方案
【内容简介】TI 60GHz IWRL6432和 IWRL1432毫米波雷达传感器如何帮助解决楼宇和工厂自动化应用中的感应难题
【直播时间】5月28日(周三)上午10:00
【直播礼品】小米双肩包、contigo水杯、胶囊伞、安克充电器

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 14

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表