Red de conocimiento informático - Problemas con los teléfonos móviles - stm32 guardará la matriz en la memoria flash

stm32 guardará la matriz en la memoria flash

Primero inicialice FSMC

void FSMC_NAND_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure

FSMC_NANDInitTypeDef FSMC_ NANDInitStructure

FSMC_NAND_PCCARDTimingInitTypeDef p;

/* Habilitar relojes FSMC, GPIOD, GPIOE y AFIO*/

RCC_ AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE

RCC_ APB2Periph_GPIOG | RCC_APB2Periph_AFIO, ENABLE

/*-- Configuración de GPIO-------------------- ----------------------------------*/

/* CLE , ALE, D0-gt; D3, NOE, NWE y NCE2 Configuración de pines NAND*/

GPIO_InitStructure.

GPIO_Pin_11 | GPIO_Pin_14 | GPIO_Pin_14 | GPIO_Pin_1 | IO_Pin_9 | GPIO_Pin_10;

GPIO_Init(GPIOE, amp; GPIO_InitStructure);

/* Configuración de pines CS NAND*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9

GPIO_Init(GPIOG) , & GPIO_InitStructure);

/* Configuración de pines NWAIT*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6

GPIO_InitStructure = GPIO_Speed_50MHz

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

GPIO_Init(GPIOD, amp; GPIO_InitStructure);

/* -- Configuración FSMC---- ------ -------------------------------------- */

p.FSMC_SetupTime = 0x1;

p.FSMC_WaitSetupTime = 0x3;

p.FSMC_HoldSetupTime = 0x2

p. p>

FSMC_NANDInitStructure.FSMC_Bank = FSMC_Bank3_NAND;

FSMC_NANDInitStructure.FSMC_Waitfeature = FSMC_Waitfeature_Enable

FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_ MemoryDataWid th_8b;

FSMC_NANDInitStructure.FSMC_ECC = FSMC_Bank3_NAND;

FSMC_NANDInitStructure.FSMC_CommonSpaceTimingStruct = &p;

FSMC_NANDInitStructure.

FSMC_AttributeSpaceTimingStruct = amp; p;

FSMC_NANDInit(amp; FSMC_NANDCmd);

/* Prueba de cmd del banco FSMC NAND*/

FSMC_NANDCmd(FSMC_Bank3_NAND, ENABLE);

}

Definir una función de escritura

uint32_t FSMC_NAND_WriteSmallPage(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumPageToWrite)

{

índice uint32_t = 0x00, número de página escrita = 0x00, estado de dirección = NAND_VALID_ADDRESS;

estado uint32_t = NAND_READY, tamaño = 0x00

uint8 _t Página = 0x37;

while((NumPageToWrite != 0x00) & (addressstatus == NAND_VALID_ADDRESS) & (status == NAND_READY))

{

/* Dirección y comando de escritura de página */

*(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_PAGEPROGRAM;

*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0x00; *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0X00;

*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS

*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS);

*(vu8 * )(NAND_FLASH_START_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS

/* Tamaño de cálculo*/

tamaño); = Página (Página * numpagewriting);

/* Escribir datos */

for(; index lt; size; index)

{

*(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA) = pBuffer[index];

}

*(vu8 * )(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_PAGEPROGRAM_TRUE ;

/* Leer pin ocupado*/

// while( GPIO_Re

adInputDataBit(GPIOG, GPIO_Pin_6) == 0);

// while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_6) == 0);

/* Verifique el estado de la operación exitosa*/

/* Verifique el estado de la operación exitosa*/< Calcular la siguiente dirección de página pequeña*/

Addressstatus = FSMC_NAND_AddressIncrement(amp; Dirección);

}

p>

}

}

retorno (estado | estado de dirección

}

); Defina la matriz TxBuffer y escriba la matriz en la memoria flash

FSMC_NAND_WriteSmallPage(TxBuffer, WriteAddr, 1);

El proceso de lectura es opuesto a esto, defina la función de lectura

uint32_t FSMC_NAND_ReadSmallPage(uint8_t *pBuffer, Dirección NAND_ADDRESS, uint32_t NumPageToRead)

{

uint32_t índice = 0x00, numpageread = 0x00, estado de dirección = NAND_VALID_ADDRESS;

uint32_t estado = NAND_READY, tamaño = 0x00;

uint8_t Página = 0x37;

while((NumPageToRead != 0x0) amp; amp; (addressstatus == NAND_VALID_ADDRESS))

{

/* Comando de lectura de página y dirección de página*/

*(vu8 *)(NAND_FLASH_START _ADDR | CMD_AREA) = NAND_CMD_READ_1

*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0x00;

*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0X00; ) = 0X00 ÁREA) = 0X00;

*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS

*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE; (ROW_ADDRESS);

*(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_READ_TRUE;

/* Leer pin ocupado*

/// while( GPIO_ReadInputDataBit (GPIOG, GPIO_Pin_6) == 0);

// while( GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_6) == 0

/* Calcular tamaño*/

tamaño = NAND_CMD_READ_TRUE

tamaño = Página (Página * numpageread);

/* Poner datos en el buffer*/

for(; index lt; size; index)

{

pBuffer[index]= *( vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA);

}

numpageread

NumPageToRead--;

/* Calcular dirección de página*/

Addressstatus = FSMC_NAND_AddressIncrement(amp; Dirección);

}

status = FSMC_NAND_GetStatus(); > p>

retorno (estado | estado de dirección);

}