SPI实验,把u8 SPI_FLASH_BUF[4096];放在SPI_Flash_Write函数里面为什么就有问题了,求解释

2019-10-12 13:34发布

        u8 SPI_FLASH_BUF[4096];
void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)   
{
//        u8 SPI_FLASH_BUF[4096];
        u32 secpos;
        u16 secoff;
        u16 secremain;          
        u16 i;   

        secpos=WriteAddr/4096;//扇区地址 0~511 for w25x16
        secoff=WriteAddr%4096;//在扇区内的偏移
        secremain=4096-secoff;//扇区剩余空间大小   

        if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096个字节
        while(1)
        {       
                SPI_Flash_Read(SPI_FLASH_BUF,secpos*4096,4096);//读出整个扇区的内容
                for(i=0;i<secremain;i++)//校验数据
                {
                        if(SPI_FLASH_BUF[secoff+i]!=0XFF)break;//需要擦除            
                }
                if(i<secremain)//需要擦除
                {
                        SPI_Flash_Erase_Sector(secpos);//擦除这个扇区
                        for(i=0;i<secremain;i++)           //复制
                        {
                                SPI_FLASH_BUF[i+secoff]=pBuffer[i];          
                        }
                        SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);//写入整个扇区  

                }else SPI_Flash_Write_NoCheck(pBuffer,WriteAddr,secremain);//写已经擦除了的,直接写入扇区剩余区间.                                   
                if(NumByteToWrite==secremain)break;//写入结束了
                else//写入未结束
                {
                        secpos++;//扇区地址增1
                        secoff=0;//偏移位置为0          

                           pBuffer+=secremain;  //指针偏移
                        WriteAddr+=secremain;//写地址偏移          
                           NumByteToWrite-=secremain;                                //字节数递减
                        if(NumByteToWrite>4096)secremain=4096;        //下一个扇区还是写不完
                        else secremain=NumByteToWrite;                        //下一个扇区可以写完了
                }         
        };                  
}


        把u8 SPI_FLASH_BUF[4096];放在函数里面为什么就出错了

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
holy404290384
1楼-- · 2019-10-12 18:16
局部变量占用的是栈空间(stack),你把一个4K的数组放在局部,估计是栈空间不足导致的问题。
天魂
2楼-- · 2019-10-12 19:19
if(key==WKUP_PRES)        //WK_UP 按下,写入W25Q64
                {
                        LCD_Fill(0,170,239,319,WHITE);//清除半屏   
                        LCD_ShowString(60,170,200,16,16,"Start Write W25Q64....");
                        printf("AA");
                        SPI_Flash_Write((u8*)TEXT_Buffer,10*4096,SIZE);                //从倒数第100个地址处开始,写入SIZE长度的数据
                        printf("zz");
                        LCD_ShowString(60,170,200,16,16,"W25Q64 Write Finished!");        //提示传送完成
                }


void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)   
{

        u32 secpos;
        u16 secoff;
        u16 secremain;          
        u16 i;   
        u8 SPI_FLASH_BUF[4096];
                printf("DSS");
        secpos=WriteAddr/4096;//扇区地址 0~511 for w25x16
        secoff=WriteAddr%4096;//在扇区内的偏移
        secremain=4096-secoff;//扇区剩余空间大小   
       
        printf("DSS");
        if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096个字节
        while(1)
        {       
                SPI_Flash_Read(SPI_FLASH_BUF,secpos*4096,4096);//读出整个扇区的内容
                for(i=0;i<secremain;i++)//校验数据
                {
                        printf("1");
                        if(SPI_FLASH_BUF[secoff+i]!=0XFF)break;//需要擦除            
                }
                if(i<secremain)//需要擦除
                {
                        SPI_Flash_Erase_Sector(secpos);//擦除这个扇区
                        for(i=0;i<secremain;i++)           //复制
                        {
                                printf("2");
                                SPI_FLASH_BUF[i+secoff]=pBuffer[i];          
                        }
                        printf("3");
                        SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);//写入整个扇区  

                }else SPI_Flash_Write_NoCheck(pBuffer,WriteAddr,secremain);//写已经擦除了的,直接写入扇区剩余区间.                                   
                if(NumByteToWrite==secremain)break;//写入结束了
                else//写入未结束
                {
                        printf("4");
                        secpos++;//扇区地址增1
                        secoff=0;//偏移位置为0          

                           pBuffer+=secremain;  //指针偏移
                        WriteAddr+=secremain;//写地址偏移          
                           NumByteToWrite-=secremain;                                //字节数递减
                        if(NumByteToWrite>4096)secremain=4096;        //下一个扇区还是写不完
                        else secremain=NumByteToWrite;                        //下一个扇区可以写完了
                }         
        };                  
}
串口只发送AA,后面的DSS什么的就不发送了,是因为这个数组太大了吗?感觉这已经超过我的理解范围了,求大神解释
holy404290384
3楼-- · 2019-10-13 00:30
 精彩回答 2  元偷偷看……
carryonli
4楼-- · 2019-10-13 05:27
holy404290384 发表于 2016-2-23 09:33
局部变量占用的是栈空间(stack),你把一个4K的数组放在局部,估计是栈空间不足导致的问题。

说的有道理。
天魂
5楼-- · 2019-10-13 08:20
holy404290384 发表于 2016-2-23 09:33
局部变量占用的是栈空间(stack),你把一个4K的数组放在局部,估计是栈空间不足导致的问题。

好吧,感觉好底层的感觉
天魂
6楼-- · 2019-10-13 08:54
holy404290384 发表于 2016-2-23 10:54
后面不发送的原因是进Hardfault吗?

不清楚啊,这怎么看

一周热门 更多>