问题描述
使用的是自制的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数组定义的时候占用了较长的时间引起的(单片机在分配内存)