硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1609|回复: 10
收起左侧

HAL库SDRAM读写操作的几点疑问

[复制链接]

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2018-12-19 09:38:18 | 显示全部楼层 |阅读模式
原本想着SDRAM初始化完成后,就可以像操作内存那样操作SDRAM,但实际发现以下几点疑问:
1、HAL库每次操作SDRAM前后都有一次上锁和解锁操作,这么做的目的是什么?访问内存时可没见过这个操作啊;2、上锁之后,紧接着又判断SDRAM句柄的状态,状态异常直接返回错误,合着每次读写SDRAM后我还得再判断一次是否读写成功了?
3、SDRAM需要STM32的控制器不断的发送刷新指令去自我刷新,仿真时打了断点似乎SDRAM中的数据并没有丢失,难道停在断点的时候STM32还在给SDRAM发生刷新命令?
HAL_StatusTypeDef HAL_SDRAM_Write_8b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint8_t *pSrcBuffer, uint32_t BufferSize)
{
  __IO uint8_t *pSdramAddress = (uint8_t *)pAddress;
  uint32_t tmp = 0U;

  /* Process Locked */
  __HAL_LOCK(hsdram);

  /* Check the SDRAM controller state */
  tmp = hsdram->State;

  if(tmp == HAL_SDRAM_STATE_BUSY)
  {
    return HAL_BUSY;
  }
  else if((tmp == HAL_SDRAM_STATE_PRECHARGED) || (tmp == HAL_SDRAM_STATE_WRITE_PROTECTED))
  {
    return  HAL_ERROR;
  }

  /* Write data to memory */
  for(; BufferSize != 0U; BufferSize--)
  {
    *(__IO uint8_t *)pSdramAddress = *pSrcBuffer;
    pSrcBuffer++;
    pSdramAddress++;
  }

  /* Process Unlocked */
  __HAL_UNLOCK(hsdram);   

  return HAL_OK;   
}

回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2018-12-19 09:51:27 | 显示全部楼层
HAL库的这个函数可以忽略,没有使用价值。
1、HAL这种锁是保证中断内和中断外操作只有1个。
2、是的。
3、断点只CPU停了,外设可以自动执行的并没有停
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

4

主题

139

回帖

151

积分

初级会员

积分
151
QQ
发表于 2018-12-19 11:09:32 | 显示全部楼层
sdram 用hal库初始化就行了,不需要用他提供的读写函数
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2018-12-19 13:18:29 | 显示全部楼层
byccc 发表于 2018-12-19 09:51
HAL库的这个函数可以忽略,没有使用价值。
1、HAL这种锁是保证中断内和中断外操作只有1个。
2、是的。

关键是第二条,关键读出来的数不知道是读错了还是没读错,
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2018-12-19 13:19:21 | 显示全部楼层
qgyhd1234 发表于 2018-12-19 11:09
sdram 用hal库初始化就行了,不需要用他提供的读写函数

那怎么保证读写正确?默认每次读操作正确了?
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2018-12-19 13:40:57 | 显示全部楼层
云琴箫龙 发表于 2018-12-19 13:18
关键是第二条,关键读出来的数不知道是读错了还是没读错,

这就想多了,这就好比你操作内部SRAM,还真有出错的可能,因为很多STM32系列的FLASH和SRAM都不带ECC
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2018-12-19 13:47:19 | 显示全部楼层
byccc 发表于 2018-12-19 13:40
这就想多了,这就好比你操作内部SRAM,还真有出错的可能,因为很多STM32系列的FLASH和SRAM都不带ECC

只是不知道正常情况下SDRAM出错的几率是多少,若跟内部基本无差别倒也可以忽略了。
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2018-12-19 14:17:40 | 显示全部楼层
云琴箫龙 发表于 2018-12-19 13:47
只是不知道正常情况下SDRAM出错的几率是多少,若跟内部基本无差别倒也可以忽略了。

一般只有超高等级的安全认证项目才需要考虑这个。航空航天,宇宙飞船这些。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2018-12-19 21:24:12 | 显示全部楼层
byccc 发表于 2018-12-19 14:17
一般只有超高等级的安全认证项目才需要考虑这个。航空航天,宇宙飞船这些。

OK,懂了,以后直接操作SDRAM即可
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2018-12-19 21:24:12 | 显示全部楼层
byccc 发表于 2018-12-19 14:17
一般只有超高等级的安全认证项目才需要考虑这个。航空航天,宇宙飞船这些。

OK,懂了,以后直接操作SDRAM即可
回复

使用道具 举报

4

主题

139

回帖

151

积分

初级会员

积分
151
QQ
发表于 2018-12-20 10:02:19 | 显示全部楼层
云琴箫龙 发表于 2018-12-19 13:18
关键是第二条,关键读出来的数不知道是读错了还是没读错,

你用hal库的api也是不知道读出来的数据是对的还是错的啊,他只是加了个锁而已
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-1 20:08 , Processed in 0.182528 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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