单片机读取flash数据串口输出实验遇到的问题

使用单片机遇到的一些问题记录

问题描述

使用的是自制的STM32F407板子读取flash的实验,读出的数据使用串口输出,读取的内容范围是从第0个扇区一直读到第15个扇区,其中第0个扇区只读一个数据,第1到15个扇区全部读满。其中第1到15个扇区的读取方式是一次性读取64个数据(因为读取的类型是float型数据,一个float需要4个字节存储)然后打印输出,这样的话,由于一个扇区是4096个字节,所以一个扇区可以存储1024个float型数据,一次读取64个float数据,相当于16次就可以把整个一个扇区的数据可以读完。
原始代码如下节

原始代码

int main(void)
{
uint8_t k;
uint8_t count_page = 0;
uint8_t read = 0;

// double double1_buffer[64] = {0};
// double double2_buffer[64] = {0};
double double3_buffer[64] = {0};
double double4_buffer[64] = {0};

/* 配置串口1为:115200 8-N-1 */
Debug_USART_Config();

printf("\r\n这是一个FLASH 读数据实验 \r\n");

/* 16M串行flash W25Q128初始化 */
SPI_FLASH_Init();

/* 获取 Flash Device ID */
DeviceID = SPI_FLASH_ReadDeviceID();

Delay( 200 );

/* 获取 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) 
{	
	
	printf("\r\n检测到SPI FLASH W25Q128 !\r\n");
	
    for(read = 0;read<=15;read++)
    {						
	  /*读取第三页数据*/
      SPI_FLASH_BufferRead((void*)double3_buffer, SPI_FLASH_PageSize*3 + read*256, sizeof(double3_buffer));
	  Delay( 1000 );
       			
      for( k=0; k<64; k++ )
	  {
        printf("温度 rx = %f \r\n",double3_buffer[k]);
        Delay( 500 );			  
	  }
    }
    for(count_page = 4;count_page<=15;count_page++)
	{
      for(read = 0;read<=15;read++)
      {						
	    /*读取第三页数据*/
        SPI_FLASH_BufferRead((void*)double3_buffer, SPI_FLASH_PageSize*count_page + read*256, sizeof(double3_buffer));
       			
        for( k=0; k<64; k++ )
	    {
          printf("原始数据: = %f \r\n",double3_buffer[k]);
          Delay( 500 );			  
	    }
      }        
    }
	
}// if (FlashID == sFLASH_ID)
else
{    
	printf("\r\n获取不到 W25Q128 ID!\n\r");
}	
SPI_Flash_PowerDown();  
while(1);  

}

以上代码中未提供的flash初始化和usart初始化均是野火已经写好的程序拿来用。
//	double double1_buffer[64] = {0};
//	double double2_buffer[64] = {0};
以上两行代码如果把注释去掉,板子上电后会卡在串口初始化那里不动,造成实验失败,但是把这两行注释掉,程序就可以使用了。
## 解决方法
最后把startup_stm32f40xx.s文件下面的第42行,如下代码:
Stack_Size      EQU     0x00000400
修改为如下:
Stack_Size      EQU     0x00004000
第53行代码如下:
Heap_Size       EQU     0x00000200
改为
Heap_Size       EQU     0x00002000
以上修改这两行代码是给单片机分配更大的堆栈。这样就可以解决前面的问题,但是,虽然可以解决前面的问题,但是上电之后按复位键之后过一小段时间串口才会打印输出来的信息,按照正常流程应该是复位按键按下之后串口就会打印输出信息,个人猜测应该是单片机在执行那几个float数组定义的时候占用了较长的时间引起的(单片机在分配内存)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值