野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10590|回复: 8

2-W25Q64存储小数和整数的N NumByteToWrite写入数组元素个数不能大于32个请老师测试

[复制链接]
发表于 2017-8-28 22:53:21 | 显示全部楼层 |阅读模式
本帖最后由 dczjn 于 2017-8-29 10:04 编辑

include "stm32f10x.h"
#include "./led/bsp_led.h"
#include "./usart/bsp_usart.h"
#include "./flash/bsp_spi_flash.h"
#include <stdlib.h>
#include "sram.h"


#define number 33
/*定义变量到外部SRAM*/
//        long double double_buffer[number] __attribute__((section("EXRAM"))) = {0};
//        int int_bufffer[number] __attribute__((section("EXRAM"))) = {0};

__IO uint32_t DeviceID = 0;
__IO uint32_t FlashID = 0;


void Delay(__IO uint32_t nCount);


int main(void)
{         
        uint8_t cal_flag = 0;
        uint8_t k;
        
/*定义局部变量,如果实验数据太大内存溢出时,可用main函数外的两个变量定义到外部SRAM*/
        long double double_buffer[ number] = {0};
        int int_bufffer[ number] = {0};
        
        LED_GPIO_Config();
        LED_BLUE;
        

        USART_Config();

        printf("\r\n这是一个FLASH 读写小数和长整数实验 \r\n");
        
        
        SPI_FLASH_Init();
        
        /* &#187;&#241;è&#161; Flash Device ID */
        DeviceID = SPI_FLASH_ReadDeviceID();
        
        Delay( 200 );
        
        /* &#187;获取 SPI Flash ID */
        FlashID = SPI_FLASH_ReadID();
        
        printf("\r\nFlashID is 0x%X,  Manufacturer Device ID is 0x%X\r\n", FlashID, DeviceID);

        /* 检验 SPI Flash ID */
        if (FlashID == sFLASH_ID)
        {        
                LED_GREEN;
               
                printf("\r\n&#188;ì2aμ&#189;SPI FLASH W25Q64 !\r\n");
//                /*读取数据标志位*/
    SPI_FLASH_BufferRead(&cal_flag, SPI_FLASH_PageSize*0, 1);

                if( cal_flag == 0xCD )        /*标志位等于0xcd,表示之前已写入数据*/
    {
                          printf("\r\n检测到数据标志\r\n");

                                /*读取小数数据*/
        SPI_FLASH_BufferRead((void*)double_buffer, SPI_FLASH_PageSize*1, sizeof(double_buffer));
                                
                                /*读取整数数据*/
        SPI_FLASH_BufferRead((void*)int_bufffer, SPI_FLASH_PageSize*2, sizeof(int_bufffer));
        
                        
                                printf("\r\n从芯片读到数据\r\n");                        
        for( k=0; k<number; k++ )
                                {
                                        printf("小数 rx = %LF \r\n",double_buffer[k]);
                                        printf("整数 rx = %d \r\n",int_bufffer[k]);                                
                                }
    }   
    else
    {
      printf("\r\n没有检测到数据标志,FLASH没有存储数据,即将进行小数写入实验\r\n");
                        cal_flag =0xCD;
                        /*擦除扇区*/
      SPI_FLASH_SectorErase(0);
                        
                        /*写入标志到0页*/
      SPI_FLASH_BufferWrite(&cal_flag, SPI_FLASH_PageSize*0, 1);

                        /*生成要写入的数据*/
      for( k=0; k<number; k++ )
                        {
                           double_buffer[k] = k +0.1;
                                 int_bufffer[k]=k*500+1 ;
                        }

                        /*写入小数数据到第一页*/
      SPI_FLASH_BufferWrite((void*)double_buffer, SPI_FLASH_PageSize*1, sizeof(double_buffer));
                        /*写入整数数据到第二页*/
      SPI_FLASH_BufferWrite((void*)int_bufffer, SPI_FLASH_PageSize*2, sizeof(int_bufffer));
                              
                        printf("向芯片写入数据");
                        /*打印到串口*/
      for( k=0; k<number; k++ )
                        {
        printf("小数tx = %LF\r\n",double_buffer[k]);
                                printf("整数tx = %d\r\n",int_bufffer[k]);
                        }
                        
                        printf("\r\n请复位开发板,以读取数据进行检验\r\n");
    }   

        }// if (FlashID == sFLASH_ID)
        else
        {   
                LED_RED;
                printf("\r\n获取不到 W25Q64 ID!\n\r");
        }
        
//        SPI_Flash_PowerDown();  
        while(1);  
}



void Delay(__IO uint32_t nCount)
{
  for(; nCount != 0; nCount--);
}


/*********************************************END OF FILE**********************/
请老师测试


回复

使用道具 举报

发表于 2017-8-29 09:34:13 | 显示全部楼层
不要把数据变量定义在main函数里,定义到外面用全局变量吧,太大了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-29 09:58:34 | 显示全部楼层
随风 发表于 2017-8-29 09:34
不要把数据变量定义在main函数里,定义到外面用全局变量吧,太大了

变量定义到外扩SRAM也是这样,我试验了,main函数外有我屏蔽的变量,就是定义到外部SRAM 的实验  //        long double double_buffer[number] __attribute__((section("EXRAM"))) = {0};
//        int int_bufffer[number] __attribute__((section("EXRAM"))) = {0};
回复 支持 反对

使用道具 举报

发表于 2017-8-29 10:14:47 | 显示全部楼层
因为例程里写double类型的数据写在一页,int类型写在后面的一页,
long double类型数据每个8字节,8*32=256,再大就超出一页的大小了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-29 10:32:30 | 显示全部楼层
本帖最后由 dczjn 于 2017-8-29 10:35 编辑
flyleaf 发表于 2017-8-29 10:14
因为例程里写double类型的数据写在一页,int类型写在后面的一页,
long double类型数据每个8字节,8*32=25 ...

如何修改呢?这个 SPI_FLASH_BufferWrite((void*)double_buffer, SPI_FLASH_PageSize*1, sizeof(double_buffer))函数不是可以自动对齐换页吗?
回复 支持 反对

使用道具 举报

发表于 2017-8-29 11:47:12 | 显示全部楼层
dczjn 发表于 2017-8-29 10:32
如何修改呢?这个 SPI_FLASH_BufferWrite((void*)double_buffer, SPI_FLASH_PageSize*1, siz ...

因为同样的地址写入了两次:


                       /*写入小数数据到第一页*/
      SPI_FLASH_BufferWrite((void*)double_buffer, SPI_FLASH_PageSize*1, sizeof(double_buffer));
                        /*写入整数数据到第二页*/
      SPI_FLASH_BufferWrite((void*)int_bufffer, SPI_FLASH_PageSize*2, sizeof(int_bufffer));

把下面那个改成PageSize*3

回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-29 17:24:13 | 显示全部楼层
flyleaf 发表于 2017-8-29 11:47
因为同样的地址写入了两次:

请问能向外部FLASH写入大于一个FLASH块(65536)的图片数组吗,例程的写入和读入函数还要修改吗?我试验的不行,读出的数据不对
回复 支持 反对

使用道具 举报

发表于 2017-8-29 17:37:08 | 显示全部楼层
dczjn 发表于 2017-8-29 17:24
请问能向外部FLASH写入大于一个FLASH块(65536)的图片数组吗,例程的写入和读入函数还要修改吗?我试验的 ...

可以啊,我们的程序里还有写入几M的数据,注意写入前要擦除,
管理好地址,不要同一个地址写入两个数据,像上面写入了double数据又写了int数据
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-29 22:03:07 | 显示全部楼层
本帖最后由 dczjn 于 2017-8-30 09:34 编辑
flyleaf 发表于 2017-8-29 17:37
可以啊,我们的程序里还有写入几M的数据,注意写入前要擦除,
管理好地址,不要同一个地址写入两个数据 ...

以下程序写入65536个元素的数组,读到16348个后就全是零,为何?已整片擦除了,即使没写进去也应该读出的是1呀?
include "stm32f10x.h"
#include "./led/bsp_led.h"
#include "./usart/bsp_usart.h"
#include "./flash/bsp_spi_flash.h"
#include <stdlib.h>
#include "sram.h"


#define number 65536
/*定义变量到外部SRAM*/
//        long double double_buffer[number] __attribute__((section("EXRAM"))) = {0};
        int int_bufffer[number] __attribute__((section("EXRAM"))) = {0};

__IO uint32_t DeviceID = 0;
__IO uint32_t FlashID = 0;


void Delay(__IO uint32_t nCount);


int main(void)
{         
        uint8_t cal_flag = 0;
        int k;
        
/*定义局部变量,如果实验数据太大内存溢出时,可用main函数外的两个变量定义到外部SRAM*/
//       long double double_buffer[ number] = {0};
//        int int_bufffer[ number] = {0};
        
        LED_GPIO_Config();
        LED_BLUE;
        

        USART_Config();

        printf("\r\n这是一个FLASH 读写小数和长整数实验 \r\n");
        
        
        SPI_FLASH_Init();
        
        /* &#187;&#241;è&#161; Flash Device ID */
        DeviceID = SPI_FLASH_ReadDeviceID();
        
        Delay( 200 );
        
        /* &#187;获取 SPI Flash ID */
        FlashID = SPI_FLASH_ReadID();
        
        printf("\r\nFlashID is 0x%X,  Manufacturer Device ID is 0x%X\r\n", FlashID, DeviceID);

        /* 检验 SPI Flash ID */
        if (FlashID == sFLASH_ID)
        {        
                LED_GREEN;
               
                printf("\r\n&#188;ì2aμ&#189;SPI FLASH W25Q64 !\r\n");
        //  SPI_FLASH_SectorErase(0);//从新写入新的数据时,用于擦除标志位,

//                /*读取数据标志位*/
    SPI_FLASH_BufferRead(&cal_flag, SPI_FLASH_PageSize*0, 1);

                if( cal_flag == 0xCD )        /*标志位等于0xcd,表示之前已写入数据*/
    {
                          printf("\r\n检测到数据标志\r\n");


                                
                                /*读取整数数据*/
        SPI_FLASH_BufferRead((void*)int_bufffer, SPI_FLASH_PageSize*1, sizeof(int_bufffer));
        
                        
                                printf("\r\n从芯片读到数据\r\n");                        
        for( k=0; k<number; k++ )
                                {
                                    
                                        printf("整数 rx = %d \r\n",int_bufffer[k]);                                
                                }
    }   
    else
    {
      printf("\r\n没有检测到数据标志,FLASH没有存储数据,即将进行小数写入实验\r\n");
                        cal_flag =0xCD;
                        /*擦除*/
    SPI_FLASH_BulkErase();//
                        
                        /*写入标志到0页*/
      SPI_FLASH_BufferWrite(&cal_flag, SPI_FLASH_PageSize*0, 1);

                        /*生成要写入的数据*/
      for( k=0; k<number; k++ )
                        {
                     
                                 int_bufffer[k]=k+1 ;
                        }

         
                        /*写入整数数据到第1页*/
      SPI_FLASH_BufferWrite((void*)int_bufffer, SPI_FLASH_PageSize*1, sizeof(int_bufffer));
                              
                        printf("向芯片写入数据");
                        /*打印到串口*/
      for( k=0; k<number; k++ )
                        {
        printf("小数tx = %LF\r\n",double_buffer[k]);
                                printf("整数tx = %d\r\n",int_bufffer[k]);
                        }
                        
                        printf("\r\n请复位开发板,以读取数据进行检验\r\n");
    }   

        }// if (FlashID == sFLASH_ID)
        else
        {   
                LED_RED;
                printf("\r\n获取不到 W25Q64 ID!\n\r");
        }
        
//        SPI_Flash_PowerDown();  
        while(1);  
}



void Delay(__IO uint32_t nCount)
{
  for(; nCount != 0; nCount--);
}


/*********************************************END OF FILE**********************/
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-15 08:54 , Processed in 0.048696 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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