1227|3

2942

帖子

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
点赞 关注
 

回复
举报

2942

帖子

4

TA的资源

五彩晶圆(中级)

沙发
 

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

此帖出自stm32/stm8论坛
 
 

回复

27

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

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


此帖出自stm32/stm8论坛
 
 

回复

2942

帖子

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/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街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
快速回复 返回顶部 返回列表