野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 6980|回复: 3

野火STM32H743XIPro开发板外扩SDRAM读写测试出错

[复制链接]
发表于 2022-7-1 10:04:19 | 显示全部楼层 |阅读模式
34火花
本帖最后由 少年子弟江湖老 于 2022-7-5 09:24 编辑
  1. /**
  2.   * @brief  测试SDRAM是否正常
  3.   * @param  None
  4.   * @retval 正常返回1,异常返回0
  5.   */
  6. uint8_t SDRAM_Test(void)
  7. {
  8.   /*写入数据计数器*/
  9.   uint32_t counter=0;
  10.   
  11.   /* 8位的数据 */
  12.   uint8_t ubWritedata_8b = 0, ubReaddata_8b = 0;  
  13.   
  14.   /* 16位的数据 */
  15.   uint16_t uhWritedata_16b = 0, uhReaddata_16b = 0;
  16.         
  17.         /* 32位的数据 */
  18.   uint32_t uhWritedata_32b = 0, uhReaddata_32b = 0;
  19.   
  20.   SDRAM_INFO("正在检测SDRAM,以8位、16、32位的方式读写sdram...");


  21.   /*按8位格式读写数据,并校验*/
  22.   
  23.   /* 把SDRAM数据全部重置为0 ,SDRAM_SIZE是以8位为单位的 */
  24.   for (counter = 0x00; counter < SDRAM_SIZE; counter++)
  25.   {
  26.     *(__IO uint8_t*) (SDRAM_BANK_ADDR + counter) = (uint8_t)0x0;
  27.   }
  28.   
  29.   /* 向整个SDRAM写入数据  8位 */
  30.   for (counter = 0; counter < SDRAM_SIZE; counter++)
  31.   {
  32.     *(__IO uint8_t*) (SDRAM_BANK_ADDR + counter) = (uint8_t)(ubWritedata_8b + counter);
  33.   }
  34.   
  35.   /* 读取 SDRAM 数据并检测*/
  36.   for(counter = 0; counter<SDRAM_SIZE;counter++ )
  37.   {
  38.     ubReaddata_8b = *(__IO uint8_t*)(SDRAM_BANK_ADDR + counter);  //从该地址读出数据
  39.    
  40.     if(ubReaddata_8b != (uint8_t)(ubWritedata_8b + counter))      //检测数据,若不相等,跳出函数,返回检测失败结果。
  41.     {
  42.       SDRAM_ERROR("8位数据读写错误!出错位置:%d",counter);
  43.       //return 0;
  44.     }
  45.   }
  46.         
  47.   
  48.   /*按16位格式读写数据,并检测*/
  49.   
  50.   /* 把SDRAM数据全部重置为0 */
  51.   for (counter = 0x00; counter < SDRAM_SIZE/2; counter++)
  52.   {
  53.     *(__IO uint16_t*) (SDRAM_BANK_ADDR + 2*counter) = (uint16_t)0x00;
  54.   }
  55.   
  56.   /* 向整个SDRAM写入数据  16位 */
  57.   for (counter = 0; counter < SDRAM_SIZE/2; counter++)
  58.   {
  59.     *(__IO uint16_t*) (SDRAM_BANK_ADDR + 2*counter) = (uint16_t)(uhWritedata_16b + counter);
  60.   }
  61.   
  62.     /* 读取 SDRAM 数据并检测*/
  63.   for(counter = 0; counter<SDRAM_SIZE/2;counter++ )
  64.   {
  65.     uhReaddata_16b = *(__IO uint16_t*)(SDRAM_BANK_ADDR + 2*counter);  //从该地址读出数据
  66.    
  67.     if(uhReaddata_16b != (uint16_t)(uhWritedata_16b + counter))      //检测数据,若不相等,跳出函数,返回检测失败结果。
  68.     {
  69.       SDRAM_ERROR("16位数据读写错误!出错位置:%d",counter);

  70.      // return 0;
  71.     }
  72.   }

  73.         
  74.          /*按32位格式读写数据,并检测*/
  75.   
  76.   /* 把SDRAM数据全部重置为0 */
  77.   for (counter = 0x00; counter < SDRAM_SIZE/4; counter++)
  78.   {
  79.     *(__IO uint32_t*) (SDRAM_BANK_ADDR + 4*counter) = (uint32_t)0x00;
  80.   }
  81.   
  82.   /* 向整个SDRAM写入数据  32位 */
  83.   for (counter = 0; counter < SDRAM_SIZE/4; counter++)
  84.   {
  85.     *(__IO uint32_t*) (SDRAM_BANK_ADDR + 4*counter) = (uint32_t)(uhWritedata_32b + counter);
  86.   }
  87.   
  88.     /* 读取 SDRAM 数据并检测*/
  89.   for(counter = 0; counter<SDRAM_SIZE/4;counter++ )
  90.   {
  91.     uhReaddata_32b = *(__IO uint32_t*)(SDRAM_BANK_ADDR + 4*counter);  //从该地址读出数据
  92.    
  93.     if(uhReaddata_32b != (uint32_t)(uhWritedata_32b + counter))      //检测数据,若不相等,跳出函数,返回检测失败结果。
  94.     {
  95.       SDRAM_ERROR("32位数据读写错误!出错位置:%d",counter);

  96.       return 0;
  97.     }
  98.   }        
  99.         
  100.   SDRAM_INFO("SDRAM读写测试正常!");
  101.   /*检测正常,return 1 */
  102.   return 1;
  103.   

  104. }
复制代码
**1.使用野火官方例程中的SDRAM_Test()函数测试全部区域的读写,会有部分内存地址8位和16位数据读写不一致(32位读写不会出错),但是通过调试显示相应内存地址的数值是正确的, 尝试修改时序好像也没什么用.**

<<-SDRAM-ERROR->> 16位数据读写错误!出错位置:8778058

<<-SDRAM-ERROR->> 16位数据读写错误!出错位置:8822026

<<-SDRAM-ERROR->> 16位数据读写错误!出错位置:8886570

<<-SDRAM-ERROR->> 16位数据读写错误!出错位置:8889482

<<-SDRAM-ERROR->> 16位数据读写错误!出错位置:8912970

<<-SDRAM-ERROR->> 16位数据读写错误!出错位置:8935682

<<-SDRAM-ERROR->> 16位数据读写错误!出错位置:8951114

<<-SDRAM-ERROR->> 16位数据读写错误!出错位置:8992170

<<-SDRAM-ERROR->> 16位数据读写错误!出错位置:8995082

<<-SDRAM-ERROR->> 16位数据读写错误!出错位置:9003914

<<-SDRAM-ERROR->> 16位数据读写错误!出错位置:9008282

........................

回复

使用道具 举报

 楼主| 发表于 2022-7-1 10:30:25 | 显示全部楼层
使用野火官方例程中的SDRAM_Test()函数测试全部区域的读写,会有部分内存地址8位和16位数据读写不一致(32位读写不会出错),但是通过调试显示相应内存地址的数值是正确的, 尝试修改时序好像也没什么用.
回复

使用道具 举报

发表于 2024-3-10 23:04:31 | 显示全部楼层
我也是,用官方的历程也是会报错
野火论坛202403102304081449..png
回复

使用道具 举报

发表于 2024-3-11 16:13:19 | 显示全部楼层
有没有看看在初始化前加禁用NAND FLASH
回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-28 21:22 , Processed in 0.033683 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表