[mw_shl_code=c,true]u32 testsram[250000] __attribute__((at(0X68000000)));//测试用数组,配置起始地址为0X68000000
int main(void)
{
u16 ts=0,temp;
FSMC_SRAM_Init(); //初始化外部SRAM
USART1_Config();//串口1初始化
// fsmc_sram_test(60,170);//▓注释1
for(ts=0;ts<256;ts++)FSMC_SRAM_WriteBuffer((u8*)&ts,ts,1);//显示测试数据
for(ts=0;ts<256;ts++)
{
printf(" %d ",(u16)testsram[ts]);//显示内存容量
}
while(1);
}[/mw_shl_code]
以上是原子大哥的程序经过我改造之后的模样。原子大哥用的是注释1的函数测试。里面有分别用了FSMC_SRAM_WriteBuffer和FSMC_SRAM_ReadBuffer测试SRAM,后来我想既然FSMC_SRAM_WriteBuffer之后那testsram数组里不就已经有了么。没必要用FSMC_SRAM_ReadBuffer再次读取,然后我就进行了尝试,将程序改成上面的样子,但是printf输出错误,然后我就把u32 testsram[250000] __attribute__((at(0X68000000)));的u32改成u8测试成功。但是改成u16后我就把
[mw_shl_code=c,true]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地址右移一位对齐(16b数据规则).
//加2相当于实际地址+1.
pBuffer++;
}
}[/mw_shl_code]
改成了这样:
[mw_shl_code=c,true]void FSMC_SRAM_WriteBuffer(u16* pBuffer,u32 WriteAddr,u32 n)
{
for(;n!=0;n--)
{
*(vu16*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;
WriteAddr+=4;
pBuffer++;
} [/mw_shl_code]
[mw_shl_code=c,true]} [/mw_shl_code]
[mw_shl_code=c,true]主函数里的
[mw_shl_code=c,true]for(ts=0;ts<256;ts++)FSMC_SRAM_WriteBuffer((u8*)&ts,ts,1);[/mw_shl_code]
[mw_shl_code=c,true]改成[/mw_shl_code]
[mw_shl_code=c,true]
[mw_shl_code=c,true]for(ts=0;ts<256;ts++)FSMC_SRAM_WriteBuffer((u16*)&ts,ts,1);[/mw_shl_code]
[/mw_shl_code]
[/mw_shl_code]
以前从来没接触过直接地址赋值,C语言只是也不充足,这也是我第一次尝试所以胡乱改的不成功。printf出错。
想请教各位大神应该怎么改才能对u16 testsram[250000] __attribute__((at(0X68000000)));有效,u32呢?
|