stm32 guardará la matriz en la memoria flash
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 ; p>
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)) p>
{
/* 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);
}