初级会员

- 积分
- 76
- 金钱
- 76
- 注册时间
- 2013-7-23
- 在线时间
- 1 小时
|
发现寄存器版本和库函数版本关于外部SRAM的实验,读写SRAM的函数不一样。
库函数:
//在指定地址开始,连续写入n个字节.
//pBuffer:字节指针
//WriteAddr:要写入的地址
//n:要写入的字节数
void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n)
{
for(;n!=0;n--)
{
*(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;
WriteAddr+=2;//这里需要加2,是因为STM32的FSMC地址右移一位对其.加2相当于加1.
pBuffer++;
}
}
寄存器:
void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n)
{
for(;n!=0;n--)
{
*(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;
WriteAddr++;
pBuffer++;
}
}
设置是一样的:mode A, 16bit位宽。问题来了,位宽是16位,每次写操作数据总线送出的是16bit,应该将地址和数据强制转换为指向16bit数据的指针吧?
*(vu16*)(Bank1_SRAM3_ADDR+WriteAddr)=*(u16*)pBuffer;
后面的地址+2,
这样操作才对吧。
pdf手册有一段话,寄存器和库函数版本均一样,也不是很理解:如何操作UB和LB来控制高低字节位??FSMC控制器自动操作吗??貌似在RM里面没找到相关操作。
这里需要注意的是:FSMC 当位宽为 16 位的时候,HADDR 右移一位同地址对其,但是 ReadAddr 我
们这里却没有加 2,而是加 1,是因为我们这里用的数据为宽是 8 位,通过 UB 和 LB 来控制高
低字节位,所以地址在这里是可以只加 1 的。 |
|