*
This commit is contained in:
@@ -0,0 +1,639 @@
|
||||
/****************************************Copyright (c)****************************************************
|
||||
**
|
||||
** http://www.powermcu.com
|
||||
**
|
||||
**--------------File Info---------------------------------------------------------------------------------
|
||||
** File name: fsmc_nand.c
|
||||
** Descriptions: The FSMC Nand application function
|
||||
**
|
||||
**--------------------------------------------------------------------------------------------------------
|
||||
** Created by: AVRman
|
||||
** Created date: 2011-12-30
|
||||
** Version: v1.0
|
||||
** Descriptions: The original version
|
||||
**
|
||||
**--------------------------------------------------------------------------------------------------------
|
||||
** Modified by:
|
||||
** Modified date:
|
||||
** Version:
|
||||
** Descriptions:
|
||||
**
|
||||
*********************************************************************************************************/
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "fsmc_nand.h"
|
||||
|
||||
/* Private define ------------------------------------------------------------*/
|
||||
#define NAND_FLASH_START_ADDR ((uint32_t)0x70000000)
|
||||
|
||||
#define ROW_ADDRESS (Address.Page + (Address.Block + (Address.Zone * NAND_ZONE_SIZE)) * NAND_BLOCK_SIZE)
|
||||
|
||||
/* Private variables ---------------------------------------------------------*/
|
||||
static uint8_t TxBuffer [NAND_PAGE_SIZE];
|
||||
static uint8_t RxBuffer [NAND_PAGE_SIZE];
|
||||
|
||||
/*******************************************************************************
|
||||
* Function Name : FSMC_NAND_Init
|
||||
* Description : Configures the FSMC and GPIOs to interface with the NAND memory.
|
||||
* This function must be called before any write/read operation
|
||||
* on the NAND.
|
||||
* Input : None
|
||||
* Output : None
|
||||
* Return : None
|
||||
* Attention : None
|
||||
*******************************************************************************/
|
||||
void FSMC_NAND_Init(void)
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
|
||||
FSMC_NANDInitTypeDef FSMC_NANDInitStructure;
|
||||
FSMC_NAND_PCCARDTimingInitTypeDef p;
|
||||
|
||||
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE , ENABLE);
|
||||
|
||||
|
||||
|
||||
/*-- GPIO Configuration ------------------------------------------------------*/
|
||||
/* CLE, ALE, D0->D3, NOE, NWE and NCE2 NAND pin configuration */
|
||||
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
|
||||
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);
|
||||
|
||||
/* D0->D3,*/
|
||||
GPIO_PinAFConfig(GPIOD, GPIO_PinSource14 , GPIO_AF_FSMC);
|
||||
GPIO_PinAFConfig(GPIOD, GPIO_PinSource15 , GPIO_AF_FSMC);
|
||||
GPIO_PinAFConfig(GPIOD, GPIO_PinSource0 , GPIO_AF_FSMC);
|
||||
GPIO_PinAFConfig(GPIOD, GPIO_PinSource1 , GPIO_AF_FSMC);
|
||||
|
||||
/* D4->D7 NAND pin configuration */
|
||||
GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FSMC);
|
||||
GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FSMC);
|
||||
GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FSMC);
|
||||
GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FSMC);
|
||||
|
||||
|
||||
|
||||
/*-- GPIO Configuration ------------------------------------------------------*/
|
||||
/* CLE, ALE, D0->D7, NOE, NWE and NCE2 NAND pin configuration */
|
||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 |GPIO_Pin_14 | GPIO_Pin_15;
|
||||
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
|
||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
|
||||
|
||||
GPIO_Init(GPIOD, &GPIO_InitStructure);
|
||||
|
||||
|
||||
/* D4->D7 NAND pin configuration */
|
||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
|
||||
GPIO_Init(GPIOE, &GPIO_InitStructure);
|
||||
|
||||
|
||||
/*CLE, ALE */
|
||||
GPIO_PinAFConfig(GPIOD, GPIO_PinSource11 , GPIO_AF_FSMC);
|
||||
GPIO_PinAFConfig(GPIOD, GPIO_PinSource12 , GPIO_AF_FSMC);
|
||||
|
||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
|
||||
GPIO_Init(GPIOD, &GPIO_InitStructure);
|
||||
|
||||
/*NOE, NWE*/
|
||||
GPIO_PinAFConfig(GPIOD, GPIO_PinSource4 , GPIO_AF_FSMC);
|
||||
GPIO_PinAFConfig(GPIOD, GPIO_PinSource5 , GPIO_AF_FSMC);
|
||||
|
||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
|
||||
GPIO_Init(GPIOD, &GPIO_InitStructure);
|
||||
|
||||
/*PD7 -> NCE2 PG9 -> NCE3*/
|
||||
GPIO_PinAFConfig(GPIOD, GPIO_PinSource7 , GPIO_AF_FSMC);
|
||||
//GPIO_PinAFConfig(GPIOG, GPIO_PinSource9 , GPIO_AF_FSMC);
|
||||
|
||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
|
||||
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
|
||||
GPIO_Init(GPIOD, &GPIO_InitStructure);
|
||||
//GPIO_Init(GPIOG, &GPIO_InitStructure);
|
||||
|
||||
/*NWAIT*/
|
||||
GPIO_PinAFConfig(GPIOD, GPIO_PinSource6 , GPIO_AF_FSMC);
|
||||
|
||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN ;
|
||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
|
||||
GPIO_Init(GPIOD, &GPIO_InitStructure);
|
||||
|
||||
/*-- FSMC Configuration ------------------------------------------------------*/
|
||||
p.FSMC_SetupTime = 0xf5;
|
||||
p.FSMC_WaitSetupTime = 0xf3;
|
||||
p.FSMC_HoldSetupTime = 0xf2;
|
||||
p.FSMC_HiZSetupTime = 0xf5;
|
||||
|
||||
FSMC_NANDInitStructure.FSMC_Bank = FSMC_Bank2_NAND;
|
||||
FSMC_NANDInitStructure.FSMC_Waitfeature = FSMC_Waitfeature_Disable;
|
||||
FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;
|
||||
FSMC_NANDInitStructure.FSMC_ECC = FSMC_ECC_Enable;
|
||||
FSMC_NANDInitStructure.FSMC_ECCPageSize = FSMC_ECCPageSize_512Bytes;
|
||||
FSMC_NANDInitStructure.FSMC_TCLRSetupTime = 0xa1;
|
||||
FSMC_NANDInitStructure.FSMC_TARSetupTime = 0x15;
|
||||
FSMC_NANDInitStructure.FSMC_CommonSpaceTimingStruct = &p;
|
||||
FSMC_NANDInitStructure.FSMC_AttributeSpaceTimingStruct = &p;
|
||||
|
||||
FSMC_NANDInit(&FSMC_NANDInitStructure);
|
||||
|
||||
/* FSMC NAND Bank Cmd Test */
|
||||
FSMC_NANDCmd(FSMC_Bank2_NAND, ENABLE);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Function Name : FSMC_NAND_ReadID
|
||||
* Description : Reads NAND memory's ID.
|
||||
* Input : - NAND_ID: pointer to a NAND_IDTypeDef structure which will hold
|
||||
* the Manufacturer and Device ID.
|
||||
* Output : None
|
||||
* Return : None
|
||||
* Attention : None
|
||||
*******************************************************************************/
|
||||
void FSMC_NAND_ReadID(NAND_IDTypeDef* NAND_ID)
|
||||
{
|
||||
uint32_t data = 0;
|
||||
|
||||
/* Send Command to the command area */
|
||||
*(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = 0x90;
|
||||
*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0x00;
|
||||
|
||||
/* Sequence to read ID from NAND flash */
|
||||
data = *(vu32 *)(NAND_FLASH_START_ADDR | DATA_AREA);
|
||||
|
||||
NAND_ID->Maker_ID = ADDR_1st_CYCLE (data);
|
||||
NAND_ID->Device_ID = ADDR_2nd_CYCLE (data);
|
||||
NAND_ID->Third_ID = ADDR_3rd_CYCLE (data);
|
||||
NAND_ID->Fourth_ID = ADDR_4th_CYCLE (data);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Function Name : FSMC_NAND_WriteSmallPage
|
||||
* Description : This routine is for writing one or several 512 Bytes Page size.
|
||||
* Input : - pBuffer: pointer on the Buffer containing data to be written
|
||||
* - Address: First page address
|
||||
* - NumPageToWrite: Number of page to write
|
||||
* Output : None
|
||||
* Return : New status of the NAND operation. This parameter can be:
|
||||
* - NAND_TIMEOUT_ERROR: when the previous operation generate
|
||||
* a Timeout error
|
||||
* - NAND_READY: when memory is ready for the next operation
|
||||
* And the new status of the increment address operation. It can be:
|
||||
* - NAND_VALID_ADDRESS: When the new address is valid address
|
||||
* - NAND_INVALID_ADDRESS: When the new address is invalid address
|
||||
* Attention : None
|
||||
*******************************************************************************/
|
||||
uint32_t FSMC_NAND_WriteSmallPage(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumPageToWrite)
|
||||
{
|
||||
uint32_t index = 0x00, numpagewritten = 0x00, addressstatus = NAND_VALID_ADDRESS;
|
||||
uint32_t status = NAND_READY, size = 0x00;
|
||||
|
||||
while((NumPageToWrite != 0x00) && (addressstatus == NAND_VALID_ADDRESS) && (status == NAND_READY))
|
||||
{
|
||||
/* Page write command and address */
|
||||
*(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_PAGEPROGRAM;
|
||||
|
||||
*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0x00;
|
||||
*(vu8 *)(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_2nd_CYCLE(ROW_ADDRESS);
|
||||
|
||||
/* Calculate the size */
|
||||
size = NAND_PAGE_SIZE + (NAND_PAGE_SIZE * numpagewritten);
|
||||
|
||||
/* Write data */
|
||||
for(index=0; index < size; index++)
|
||||
{
|
||||
*(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA) = pBuffer[index];
|
||||
}
|
||||
|
||||
*(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_PAGEPROGRAM_TRUE;
|
||||
|
||||
/* 뗍챈신 */
|
||||
while( GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_6) == 0 );
|
||||
|
||||
/* Check status for successful operation */
|
||||
status = FSMC_NAND_GetStatus();
|
||||
|
||||
if(status == NAND_READY)
|
||||
{
|
||||
numpagewritten++;
|
||||
|
||||
NumPageToWrite--;
|
||||
|
||||
/* Calculate Next small page Address */
|
||||
addressstatus = FSMC_NAND_AddressIncrement(&Address);
|
||||
}
|
||||
}
|
||||
|
||||
return (status | addressstatus);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Function Name : FSMC_NAND_ReadSmallPage
|
||||
* Description : This routine is for sequential read from one or several
|
||||
* 512 Bytes Page size.
|
||||
* Input : - pBuffer: pointer on the Buffer to fill
|
||||
* - Address: First page address
|
||||
* - NumPageToRead: Number of page to read
|
||||
* Output : None
|
||||
* Return : New status of the NAND operation. This parameter can be:
|
||||
* - NAND_TIMEOUT_ERROR: when the previous operation generate
|
||||
* a Timeout error
|
||||
* - NAND_READY: when memory is ready for the next operation
|
||||
* And the new status of the increment address operation. It can be:
|
||||
* - NAND_VALID_ADDRESS: When the new address is valid address
|
||||
* - NAND_INVALID_ADDRESS: When the new address is invalid address
|
||||
* Attention : None
|
||||
*******************************************************************************/
|
||||
uint32_t FSMC_NAND_ReadSmallPage(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumPageToRead)
|
||||
{
|
||||
uint32_t index = 0x00, numpageread = 0x00, addressstatus = NAND_VALID_ADDRESS;
|
||||
uint32_t status = NAND_READY, size = 0x00;
|
||||
|
||||
while((NumPageToRead != 0x0) && (addressstatus == NAND_VALID_ADDRESS))
|
||||
{
|
||||
/* Page Read command and page address */
|
||||
*(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;
|
||||
*(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;
|
||||
|
||||
/* 뗍챈신 */
|
||||
//while( GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_6) == 0 );
|
||||
|
||||
/* Calculate the size */
|
||||
size = NAND_PAGE_SIZE + (NAND_PAGE_SIZE * numpageread);
|
||||
|
||||
for(index=0; index < 0x690; index++);//儺珂
|
||||
|
||||
/* Get Data into Buffer */
|
||||
for(index=0; index < size; index++)
|
||||
{
|
||||
pBuffer[index]= *(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA);
|
||||
}
|
||||
|
||||
numpageread++;
|
||||
|
||||
NumPageToRead--;
|
||||
|
||||
/* Calculate page address */
|
||||
addressstatus = FSMC_NAND_AddressIncrement(&Address);
|
||||
}
|
||||
|
||||
status = FSMC_NAND_GetStatus();
|
||||
|
||||
return (status | addressstatus);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Function Name : FSMC_NAND_WriteSpareArea
|
||||
* Description : This routine write the spare area information for the specified
|
||||
* pages addresses.
|
||||
* Input : - pBuffer: pointer on the Buffer containing data to be written
|
||||
* - Address: First page address
|
||||
* - NumSpareAreaTowrite: Number of Spare Area to write
|
||||
* Output : None
|
||||
* Return : New status of the NAND operation. This parameter can be:
|
||||
* - NAND_TIMEOUT_ERROR: when the previous operation generate
|
||||
* a Timeout error
|
||||
* - NAND_READY: when memory is ready for the next operation
|
||||
* And the new status of the increment address operation. It can be:
|
||||
* - NAND_VALID_ADDRESS: When the new address is valid address
|
||||
* - NAND_INVALID_ADDRESS: When the new address is invalid address
|
||||
* Attention : None
|
||||
*******************************************************************************/
|
||||
uint32_t FSMC_NAND_WriteSpareArea(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumSpareAreaTowrite)
|
||||
{
|
||||
uint32_t index = 0x00, numsparesreawritten = 0x00, addressstatus = NAND_VALID_ADDRESS;
|
||||
uint32_t status = NAND_READY, size = 0x00;
|
||||
|
||||
while((NumSpareAreaTowrite != 0x00) && (addressstatus == NAND_VALID_ADDRESS) && (status == NAND_READY))
|
||||
{
|
||||
/* Page write Spare area command and address */
|
||||
*(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_PAGEPROGRAM;
|
||||
|
||||
*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0x00;
|
||||
*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0x08;
|
||||
*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS);
|
||||
*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS);
|
||||
|
||||
/* Calculate the size */
|
||||
size = NAND_SPARE_AREA_SIZE + (NAND_SPARE_AREA_SIZE * numsparesreawritten);
|
||||
|
||||
/* Write the data */
|
||||
for(; index < size; index++)
|
||||
{
|
||||
*(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA) = pBuffer[index];
|
||||
}
|
||||
|
||||
*(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_PAGEPROGRAM_TRUE;
|
||||
|
||||
/* 뗍챈신 */
|
||||
while( GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_6) == 0 );
|
||||
|
||||
/* Check status for successful operation */
|
||||
status = FSMC_NAND_GetStatus();
|
||||
|
||||
if(status == NAND_READY)
|
||||
{
|
||||
numsparesreawritten++;
|
||||
|
||||
NumSpareAreaTowrite--;
|
||||
|
||||
/* Calculate Next page Address */
|
||||
addressstatus = FSMC_NAND_AddressIncrement(&Address);
|
||||
}
|
||||
}
|
||||
|
||||
return (status | addressstatus);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Function Name : FSMC_NAND_ReadSpareArea
|
||||
* Description : This routine read the spare area information from the specified
|
||||
* pages addresses.
|
||||
* Input : - pBuffer: pointer on the Buffer to fill
|
||||
* - Address: First page address
|
||||
* - NumSpareAreaToRead: Number of Spare Area to read
|
||||
* Output : None
|
||||
* Return : New status of the NAND operation. This parameter can be:
|
||||
* - NAND_TIMEOUT_ERROR: when the previous operation generate
|
||||
* a Timeout error
|
||||
* - NAND_READY: when memory is ready for the next operation
|
||||
* And the new status of the increment address operation. It can be:
|
||||
* - NAND_VALID_ADDRESS: When the new address is valid address
|
||||
* - NAND_INVALID_ADDRESS: When the new address is invalid address
|
||||
* Attention : None
|
||||
*******************************************************************************/
|
||||
uint32_t FSMC_NAND_ReadSpareArea(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumSpareAreaToRead)
|
||||
{
|
||||
uint32_t numsparearearead = 0x00, index = 0x00, addressstatus = NAND_VALID_ADDRESS;
|
||||
uint32_t status = NAND_READY, size = 0x00;
|
||||
|
||||
while((NumSpareAreaToRead != 0x0) && (addressstatus == NAND_VALID_ADDRESS))
|
||||
{
|
||||
/* Page Read command and page address */
|
||||
*(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) = 0x08;
|
||||
*(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;
|
||||
|
||||
/* 뗍챈신 */
|
||||
while( GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_6) == 0 );
|
||||
|
||||
/* Data Read */
|
||||
size = NAND_SPARE_AREA_SIZE + (NAND_SPARE_AREA_SIZE * numsparearearead);
|
||||
|
||||
/* Get Data into Buffer */
|
||||
for ( ;index < size; index++)
|
||||
{
|
||||
pBuffer[index] = *(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA);
|
||||
}
|
||||
|
||||
numsparearearead++;
|
||||
|
||||
NumSpareAreaToRead--;
|
||||
|
||||
/* Calculate page address */
|
||||
addressstatus = FSMC_NAND_AddressIncrement(&Address);
|
||||
}
|
||||
|
||||
status = FSMC_NAND_GetStatus();
|
||||
|
||||
return (status | addressstatus);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Function Name : FSMC_NAND_EraseBlock
|
||||
* Description : This routine erase complete block from NAND FLASH
|
||||
* Input : - Address: Any address into block to be erased
|
||||
* Output : None
|
||||
* Return : New status of the NAND operation. This parameter can be:
|
||||
* - NAND_TIMEOUT_ERROR: when the previous operation generate
|
||||
* a Timeout error
|
||||
* - NAND_READY: when memory is ready for the next operation
|
||||
* Attention : None
|
||||
*******************************************************************************/
|
||||
uint32_t FSMC_NAND_EraseBlock(NAND_ADDRESS Address)
|
||||
{
|
||||
*(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_ERASE0;
|
||||
|
||||
*(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_ERASE1;
|
||||
|
||||
|
||||
//while( GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_6) == 0 );
|
||||
|
||||
return (FSMC_NAND_GetStatus());
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Function Name : FSMC_NAND_Reset
|
||||
* Description : This routine reset the NAND FLASH
|
||||
* Input : None
|
||||
* Output : None
|
||||
* Return : NAND_READY
|
||||
* Attention : None
|
||||
*******************************************************************************/
|
||||
uint32_t FSMC_NAND_Reset(void)
|
||||
{
|
||||
*(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_RESET;
|
||||
|
||||
return (NAND_READY);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Function Name : FSMC_NAND_GetStatus
|
||||
* Description : Get the NAND operation status
|
||||
* Input : None
|
||||
* Output : None
|
||||
* Return : New status of the NAND operation. This parameter can be:
|
||||
* - NAND_TIMEOUT_ERROR: when the previous operation generate
|
||||
* a Timeout error
|
||||
* - NAND_READY: when memory is ready for the next operation
|
||||
* Attention : None
|
||||
*******************************************************************************/
|
||||
uint32_t FSMC_NAND_GetStatus(void)
|
||||
{
|
||||
uint32_t timeout = 0x1000000, status = NAND_READY;
|
||||
|
||||
status = FSMC_NAND_ReadStatus();
|
||||
|
||||
/* Wait for a NAND operation to complete or a TIMEOUT to occur */
|
||||
while ((status != NAND_READY) &&( timeout != 0x00))
|
||||
{
|
||||
status = FSMC_NAND_ReadStatus();
|
||||
timeout --;
|
||||
}
|
||||
|
||||
if(timeout == 0x00)
|
||||
{
|
||||
status = NAND_TIMEOUT_ERROR;
|
||||
}
|
||||
|
||||
/* Return the operation status */
|
||||
return (status);
|
||||
}
|
||||
/******************************************************************************
|
||||
* Function Name : FSMC_NAND_ReadStatus
|
||||
* Description : Reads the NAND memory status using the Read status command
|
||||
* Input : None
|
||||
* Output : None
|
||||
* Return : The status of the NAND memory. This parameter can be:
|
||||
* - NAND_BUSY: when memory is busy
|
||||
* - NAND_READY: when memory is ready for the next operation
|
||||
* - NAND_ERROR: when the previous operation gererates error
|
||||
* Attention : None
|
||||
*******************************************************************************/
|
||||
uint32_t FSMC_NAND_ReadStatus(void)
|
||||
{
|
||||
uint32_t data = 0x00, status = NAND_BUSY;
|
||||
|
||||
/* Read status operation ------------------------------------ */
|
||||
*(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_STATUS;
|
||||
data = *(vu8 *)(NAND_FLASH_START_ADDR);
|
||||
|
||||
if((data & NAND_ERROR) == NAND_ERROR)
|
||||
{
|
||||
status = NAND_ERROR;
|
||||
}
|
||||
else if((data & NAND_READY) == NAND_READY)
|
||||
{
|
||||
status = NAND_READY;
|
||||
}
|
||||
else
|
||||
{
|
||||
status = NAND_BUSY;
|
||||
}
|
||||
|
||||
return (status);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Function Name : NAND_AddressIncrement
|
||||
* Description : Increment the NAND memory address
|
||||
* Input : - Address: address to be incremented.
|
||||
* Output : None
|
||||
* Return : The new status of the increment address operation. It can be:
|
||||
* - NAND_VALID_ADDRESS: When the new address is valid address
|
||||
* - NAND_INVALID_ADDRESS: When the new address is invalid address
|
||||
* Attention : None
|
||||
*******************************************************************************/
|
||||
uint32_t FSMC_NAND_AddressIncrement(NAND_ADDRESS* Address)
|
||||
{
|
||||
uint32_t status = NAND_VALID_ADDRESS;
|
||||
|
||||
Address->Page++;
|
||||
|
||||
if(Address->Page == NAND_BLOCK_SIZE)
|
||||
{
|
||||
Address->Page = 0;
|
||||
Address->Block++;
|
||||
|
||||
if(Address->Block == NAND_ZONE_SIZE)
|
||||
{
|
||||
Address->Block = 0;
|
||||
Address->Zone++;
|
||||
|
||||
if(Address->Zone == NAND_MAX_ZONE)
|
||||
{
|
||||
status = NAND_INVALID_ADDRESS;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (status);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Function Name : FSMC_NAND_Test
|
||||
* Description : NAND test
|
||||
* Input : None
|
||||
* Output : None
|
||||
* Return : None
|
||||
* Attention : None
|
||||
*******************************************************************************/
|
||||
void FSMC_NAND_Test(void)
|
||||
{
|
||||
uint16_t index;
|
||||
uint16_t j;
|
||||
NAND_IDTypeDef NAND_ID;
|
||||
NAND_ADDRESS WriteReadAddr;
|
||||
|
||||
FSMC_NANDDeInit(FSMC_Bank2_NAND);
|
||||
FSMC_NAND_Init();
|
||||
|
||||
/* 쇱꿎NAND Flash */
|
||||
FSMC_NAND_ReadID(&NAND_ID);
|
||||
printf("Nand Flash ID = %02X,%02X,%02X,%02X ",NAND_ID.Maker_ID, NAND_ID.Device_ID,
|
||||
NAND_ID.Third_ID, NAND_ID.Fourth_ID );
|
||||
if ((NAND_ID.Maker_ID == 0xEC) && (NAND_ID.Device_ID == 0xF1)
|
||||
&& (NAND_ID.Third_ID == 0x80) && (NAND_ID.Fourth_ID == 0x15))
|
||||
{
|
||||
printf("Type = K9F1G08U0A\r\n");
|
||||
}
|
||||
else if ((NAND_ID.Maker_ID == 0xEC) && (NAND_ID.Device_ID == 0xF1)
|
||||
&& (NAND_ID.Third_ID == 0x00) && (NAND_ID.Fourth_ID == 0x95))
|
||||
{
|
||||
printf("Type = K9F1G08U0B\r\n");
|
||||
}
|
||||
else if ((NAND_ID.Maker_ID == 0xAD) && (NAND_ID.Device_ID == 0xF1)
|
||||
&& (NAND_ID.Third_ID == 0x80) && (NAND_ID.Fourth_ID == 0x1D))
|
||||
{
|
||||
printf("Type = HY27UF081G2A\r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Type = Unknow\r\n");
|
||||
}
|
||||
|
||||
/* NAND memory address to write to */
|
||||
WriteReadAddr.Zone = 0x00;
|
||||
WriteReadAddr.Block = 0x00;
|
||||
WriteReadAddr.Page = 0x00;
|
||||
|
||||
|
||||
/* Erase the NAND first Block */
|
||||
FSMC_NAND_EraseBlock(WriteReadAddr);
|
||||
|
||||
/* Write data to FSMC NOR memory */
|
||||
/* Fill the buffer to send */
|
||||
for (index = 0; index < NAND_PAGE_SIZE; index++ )
|
||||
{
|
||||
TxBuffer[index] = index;
|
||||
}
|
||||
|
||||
FSMC_NAND_WriteSmallPage(TxBuffer, WriteReadAddr, 1);
|
||||
printf("\r\nWritten to the number of: \r\n");
|
||||
for(j = 0; j < 128; j++)
|
||||
printf("%x \r",TxBuffer[j]);
|
||||
|
||||
/* Read back the written data */
|
||||
FSMC_NAND_ReadSmallPage (RxBuffer, WriteReadAddr, 1);
|
||||
printf("\r\nRead several: \r\n");
|
||||
for(j = 0; j < 128; j++)
|
||||
printf("%x \r",RxBuffer[j]);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/*********************************************************************************************************
|
||||
END FILE
|
||||
*********************************************************************************************************/
|
||||
@@ -0,0 +1,129 @@
|
||||
/****************************************Copyright (c)****************************************************
|
||||
**
|
||||
** http://www.powermcu.com
|
||||
**
|
||||
**--------------File Info---------------------------------------------------------------------------------
|
||||
** File name: fsmc_nand.h
|
||||
** Descriptions: The FSMC NAND application function
|
||||
**
|
||||
**--------------------------------------------------------------------------------------------------------
|
||||
** Created by: AVRman
|
||||
** Created date: 2011-2-16
|
||||
** Version: v1.0
|
||||
** Descriptions: The original version
|
||||
**
|
||||
**--------------------------------------------------------------------------------------------------------
|
||||
** Modified by:
|
||||
** Modified date:
|
||||
** Version:
|
||||
** Descriptions:
|
||||
**
|
||||
*********************************************************************************************************/
|
||||
|
||||
#ifndef __FSMC_NAND_H
|
||||
#define __FSMC_NAND_H
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "stm32f4xx.h"
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
uint8_t Maker_ID;
|
||||
uint8_t Device_ID;
|
||||
uint8_t Third_ID;
|
||||
uint8_t Fourth_ID;
|
||||
}
|
||||
NAND_IDTypeDef;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint16_t Zone;
|
||||
uint16_t Block;
|
||||
uint16_t Page;
|
||||
}
|
||||
NAND_ADDRESS;
|
||||
|
||||
/* Private define ------------------------------------------------------------*/
|
||||
|
||||
/* NAND Area definition for STM3210E-EVAL Board RevD */
|
||||
#define CMD_AREA (uint32_t)(1<<17) /* A17 = CLE high */
|
||||
#define ADDR_AREA (uint32_t)(1<<16) /* A16 = ALE high */
|
||||
|
||||
#define DATA_AREA ((uint32_t)0x00000000)
|
||||
|
||||
/* FSMC NAND memory command */
|
||||
#define NAND_CMD_READ_1 ((uint8_t)0x00)
|
||||
#define NAND_CMD_READ_TRUE ((uint8_t)0x30)
|
||||
|
||||
#define NAND_CMD_RDCOPYBACK ((uint8_t)0x00)
|
||||
#define NAND_CMD_RDCOPYBACK_TRUE ((uint8_t)0x35)
|
||||
|
||||
#define NAND_CMD_PAGEPROGRAM ((uint8_t)0x80)
|
||||
#define NAND_CMD_PAGEPROGRAM_TRUE ((uint8_t)0x10)
|
||||
|
||||
#define NAND_CMD_COPYBACKPGM ((uint8_t)0x85)
|
||||
#define NAND_CMD_COPYBACKPGM_TRUE ((uint8_t)0x10)
|
||||
|
||||
#define NAND_CMD_ERASE0 ((uint8_t)0x60)
|
||||
#define NAND_CMD_ERASE1 ((uint8_t)0xD0)
|
||||
|
||||
#define NAND_CMD_READID ((uint8_t)0x90)
|
||||
#define NAND_CMD_STATUS ((uint8_t)0x70)
|
||||
#define NAND_CMD_RESET ((uint8_t)0xFF)
|
||||
|
||||
#define NAND_CMD_CACHEPGM ((uint8_t)0x80)
|
||||
#define NAND_CMD_CACHEPGM_TRUE ((uint8_t)0x15)
|
||||
|
||||
#define NAND_CMD_RANDOMIN ((uint8_t)0x85)
|
||||
#define NAND_CMD_RANDOMOUT ((uint8_t)0x05)
|
||||
#define NAND_CMD_RANDOMOUT_TRUE ((uint8_t)0xE0)
|
||||
|
||||
#define NAND_CMD_CACHERD_START ((uint8_t)0x00)
|
||||
#define NAND_CMD_CACHERD_START2 ((uint8_t)0x31)
|
||||
#define NAND_CMD_CACHERD_EXIT ((uint8_t)0x34)
|
||||
|
||||
/* NAND memory status */
|
||||
#define NAND_VALID_ADDRESS ((uint32_t)0x00000100)
|
||||
#define NAND_INVALID_ADDRESS ((uint32_t)0x00000200)
|
||||
#define NAND_TIMEOUT_ERROR ((uint32_t)0x00000400)
|
||||
#define NAND_BUSY ((uint32_t)0x00000000)
|
||||
#define NAND_ERROR ((uint32_t)0x00000001)
|
||||
#define NAND_READY ((uint32_t)0x00000040)
|
||||
|
||||
/* FSMC NAND memory parameters */
|
||||
/* for K9F1G08 */
|
||||
#define NAND_PAGE_SIZE ((uint16_t)0x0800) /* 2 * 1024 bytes per page w/o Spare Area */
|
||||
#define NAND_BLOCK_SIZE ((uint16_t)0x0040) /* 64 pages per block */
|
||||
#define NAND_ZONE_SIZE ((uint16_t)0x0400) /* 1024 Block per zone */
|
||||
#define NAND_SPARE_AREA_SIZE ((uint16_t)0x0040) /* last 64 bytes as spare area */
|
||||
#define NAND_MAX_ZONE ((uint16_t)0x0001) /* 1 zones of 1024 block */
|
||||
|
||||
/* FSMC NAND memory address computation */
|
||||
#define ADDR_1st_CYCLE(ADDR) (uint8_t)((ADDR)& 0xFF) /* 1st addressing cycle */
|
||||
#define ADDR_2nd_CYCLE(ADDR) (uint8_t)(((ADDR)& 0xFF00) >> 8) /* 2nd addressing cycle */
|
||||
#define ADDR_3rd_CYCLE(ADDR) (uint8_t)(((ADDR)& 0xFF0000) >> 16) /* 3rd addressing cycle */
|
||||
#define ADDR_4th_CYCLE(ADDR) (uint8_t)(((ADDR)& 0xFF000000) >> 24) /* 4th addressing cycle */
|
||||
|
||||
/* Private function prototypes -----------------------------------------------*/
|
||||
void FSMC_NAND_Init(void);
|
||||
void FSMC_NAND_Test(void);
|
||||
void FSMC_NAND_ReadID(NAND_IDTypeDef* NAND_ID);
|
||||
uint32_t FSMC_NAND_WriteSmallPage(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumPageToWrite);
|
||||
uint32_t FSMC_NAND_ReadSmallPage (uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumPageToRead);
|
||||
uint32_t FSMC_NAND_WriteSpareArea(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumSpareAreaTowrite);
|
||||
uint32_t FSMC_NAND_ReadSpareArea(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumSpareAreaToRead);
|
||||
uint32_t FSMC_NAND_EraseBlock(NAND_ADDRESS Address);
|
||||
uint32_t FSMC_NAND_Reset(void);
|
||||
uint32_t FSMC_NAND_GetStatus(void);
|
||||
uint32_t FSMC_NAND_ReadStatus(void);
|
||||
uint32_t FSMC_NAND_AddressIncrement(NAND_ADDRESS* Address);
|
||||
|
||||
|
||||
#endif /* __FSMC_NAND_H */
|
||||
|
||||
/*********************************************************************************************************
|
||||
END FILE
|
||||
*********************************************************************************************************/
|
||||
@@ -0,0 +1,147 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file main.c
|
||||
* @author MCD Application Team
|
||||
* @version V1.0.0
|
||||
* @date 30-12-2011
|
||||
* @brief Main program body
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "stm32f4xx.h"
|
||||
#include "fsmc_nand.h"
|
||||
#include "usart.h"
|
||||
|
||||
/** @addtogroup STM32F2xx_StdPeriph_Examples
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @addtogroup IOToggle
|
||||
* @{
|
||||
*/
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
|
||||
void GPIO_Configuration(void);
|
||||
void Delay(__IO uint32_t nCount);
|
||||
|
||||
/* Private define ------------------------------------------------------------*/
|
||||
/* Private macro -------------------------------------------------------------*/
|
||||
/* Private variables ---------------------------------------------------------*/
|
||||
/* Private function prototypes -----------------------------------------------*/
|
||||
/* Private functions ---------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* @brief Main program
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
int main(void)
|
||||
{
|
||||
/*!< At this stage the microcontroller clock setting is already configured,
|
||||
this is done through SystemInit() function which is called from startup
|
||||
file (startup_stm32f2xx.s) before to branch to application main.
|
||||
To reconfigure the default setting of SystemInit() function, refer to
|
||||
system_stm32f2xx.c file
|
||||
*/
|
||||
|
||||
USART_Configuration();
|
||||
USART_NVIC_Config();
|
||||
printf("\n\rWelcome to use NAND FLASH modules\r\n");
|
||||
printf("****************************************************************\r\n");
|
||||
|
||||
FSMC_NAND_Test();
|
||||
|
||||
GPIO_Configuration();
|
||||
while (1)
|
||||
{
|
||||
GPIO_SetBits(GPIOD , GPIO_Pin_12);
|
||||
Delay(0x5fffff);
|
||||
GPIO_SetBits(GPIOD , GPIO_Pin_13);
|
||||
Delay(0x5fffff);
|
||||
GPIO_SetBits(GPIOD , GPIO_Pin_14);
|
||||
Delay(0x5fffff);
|
||||
GPIO_SetBits(GPIOD , GPIO_Pin_15);
|
||||
Delay(0x5fffff);
|
||||
|
||||
|
||||
GPIO_ResetBits(GPIOD , GPIO_Pin_12);
|
||||
Delay(0x5fffff);
|
||||
GPIO_ResetBits(GPIOD , GPIO_Pin_13);
|
||||
Delay(0x5fffff);
|
||||
GPIO_ResetBits(GPIOD , GPIO_Pin_14);
|
||||
Delay(0x5fffff);
|
||||
GPIO_ResetBits(GPIOD , GPIO_Pin_15);
|
||||
Delay(0x5fffff);
|
||||
}
|
||||
}
|
||||
void GPIO_Configuration(void)
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
|
||||
|
||||
//LED1 (PC9) LED2 (PC10) LED3 (PC11) LED4 (PC12)
|
||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14 | GPIO_Pin_15;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
|
||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
||||
GPIO_Init(GPIOD, &GPIO_InitStructure);
|
||||
|
||||
}
|
||||
/**
|
||||
* @brief Delay Function.
|
||||
* @param nCount:specifies the Delay time length.
|
||||
* @retval None
|
||||
*/
|
||||
void Delay(__IO uint32_t nCount)
|
||||
{
|
||||
while(nCount--)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef USE_FULL_ASSERT
|
||||
|
||||
/**
|
||||
* @brief Reports the name of the source file and the source line number
|
||||
* where the assert_param error has occurred.
|
||||
* @param file: pointer to the source file name
|
||||
* @param line: assert_param error line source number
|
||||
* @retval None
|
||||
*/
|
||||
void assert_failed(uint8_t* file, uint32_t line)
|
||||
{
|
||||
/* User can add his own implementation to report the file name and line number,
|
||||
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
|
||||
|
||||
/* Infinite loop */
|
||||
while (1)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
||||
@@ -0,0 +1,88 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file I2C/EEPROM/stm32f4xx_conf.h
|
||||
* @author MCD Application Team
|
||||
* @version V1.0.0
|
||||
* @date 30-September-2011
|
||||
* @brief Library configuration file.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __STM32F4xx_CONF_H
|
||||
#define __STM32F4xx_CONF_H
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
/* Uncomment the line below to enable peripheral header file inclusion */
|
||||
#include "stm32f4xx_adc.h"
|
||||
#include "stm32f4xx_can.h"
|
||||
#include "stm32f4xx_crc.h"
|
||||
#include "stm32f4xx_cryp.h"
|
||||
#include "stm32f4xx_dac.h"
|
||||
#include "stm32f4xx_dbgmcu.h"
|
||||
#include "stm32f4xx_dcmi.h"
|
||||
#include "stm32f4xx_dma.h"
|
||||
#include "stm32f4xx_exti.h"
|
||||
#include "stm32f4xx_flash.h"
|
||||
#include "stm32f4xx_fsmc.h"
|
||||
#include "stm32f4xx_hash.h"
|
||||
#include "stm32f4xx_gpio.h"
|
||||
#include "stm32f4xx_i2c.h"
|
||||
#include "stm32f4xx_iwdg.h"
|
||||
#include "stm32f4xx_pwr.h"
|
||||
#include "stm32f4xx_rcc.h"
|
||||
#include "stm32f4xx_rng.h"
|
||||
#include "stm32f4xx_rtc.h"
|
||||
#include "stm32f4xx_sdio.h"
|
||||
#include "stm32f4xx_spi.h"
|
||||
#include "stm32f4xx_syscfg.h"
|
||||
#include "stm32f4xx_tim.h"
|
||||
#include "stm32f4xx_usart.h"
|
||||
#include "stm32f4xx_wwdg.h"
|
||||
#include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */
|
||||
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
/* Exported constants --------------------------------------------------------*/
|
||||
|
||||
/* If an external clock source is used, then the value of the following define
|
||||
should be set to the value of the external clock source, else, if no external
|
||||
clock is used, keep this define commented */
|
||||
/*#define I2S_EXTERNAL_CLOCK_VAL 12288000 */ /* Value of the external clock in Hz */
|
||||
|
||||
|
||||
/* Uncomment the line below to expanse the "assert_param" macro in the
|
||||
Standard Peripheral Library drivers code */
|
||||
/* #define USE_FULL_ASSERT 1 */
|
||||
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
#ifdef USE_FULL_ASSERT
|
||||
|
||||
/**
|
||||
* @brief The assert_param macro is used for function's parameters check.
|
||||
* @param expr: If expr is false, it calls assert_failed function
|
||||
* which reports the name of the source file and the source
|
||||
* line number of the call that failed.
|
||||
* If expr is true, it returns no value.
|
||||
* @retval None
|
||||
*/
|
||||
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
|
||||
/* Exported functions ------------------------------------------------------- */
|
||||
void assert_failed(uint8_t* file, uint32_t line);
|
||||
#else
|
||||
#define assert_param(expr) ((void)0)
|
||||
#endif /* USE_FULL_ASSERT */
|
||||
|
||||
#endif /* __STM32F4xx_CONF_H */
|
||||
|
||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
||||
@@ -0,0 +1,178 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file I2C/EEPROM/stm32f4xx_it.c
|
||||
* @author MCD Application Team
|
||||
* @version V1.0.0
|
||||
* @date 30-September-2011
|
||||
* @brief Main Interrupt Service Routines.
|
||||
* This file provides template for all exceptions handler and
|
||||
* peripherals interrupt service routine.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "stm32f4xx_it.h"
|
||||
#include "usart.h"
|
||||
|
||||
#define USARTx_IRQHANDLER USART1_IRQHandler
|
||||
/** @addtogroup STM32F4xx_StdPeriph_Examples
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @addtogroup I2C_EEPROM
|
||||
* @{
|
||||
*/
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
/* Private define ------------------------------------------------------------*/
|
||||
/* Private macro -------------------------------------------------------------*/
|
||||
/* Private variables ---------------------------------------------------------*/
|
||||
/* Private function prototypes -----------------------------------------------*/
|
||||
/* Private functions ---------------------------------------------------------*/
|
||||
|
||||
/******************************************************************************/
|
||||
/* Cortex-M4 Processor Exceptions Handlers */
|
||||
/******************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief This function handles NMI exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void NMI_Handler(void)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles Hard Fault exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void HardFault_Handler(void)
|
||||
{
|
||||
/* Go to infinite loop when Hard Fault exception occurs */
|
||||
while (1)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles Memory Manage exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void MemManage_Handler(void)
|
||||
{
|
||||
/* Go to infinite loop when Memory Manage exception occurs */
|
||||
while (1)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles Bus Fault exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void BusFault_Handler(void)
|
||||
{
|
||||
/* Go to infinite loop when Bus Fault exception occurs */
|
||||
while (1)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles Usage Fault exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void UsageFault_Handler(void)
|
||||
{
|
||||
/* Go to infinite loop when Usage Fault exception occurs */
|
||||
while (1)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles SVCall exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void SVC_Handler(void)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles Debug Monitor exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void DebugMon_Handler(void)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles PendSVC exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void PendSV_Handler(void)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles SysTick Handler.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void SysTick_Handler(void)
|
||||
{
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* STM32F4xx Peripherals Interrupt Handlers */
|
||||
/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
|
||||
/* available peripheral interrupt handler's name please refer to the startup */
|
||||
/* file (startup_stm32f4xx.s). */
|
||||
/******************************************************************************/
|
||||
void USARTx_IRQHANDLER(void)
|
||||
{
|
||||
unsigned char usart_value;
|
||||
if(USART_GetITStatus(Open_USART, USART_IT_RXNE) != RESET)
|
||||
{
|
||||
usart_value=USART_ReceiveData(Open_USART);
|
||||
printf("\n\rUSART Hyperterminal Interrupts Receive a word: %c\n\r",usart_value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles PPP interrupt request.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
/*void PPP_IRQHandler(void)
|
||||
{
|
||||
}*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
||||
@@ -0,0 +1,54 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file I2C/EEPROM/stm32f4xx_it.h
|
||||
* @author MCD Application Team
|
||||
* @version V1.0.0
|
||||
* @date 30-September-2011
|
||||
* @brief This file contains the headers of the interrupt handlers.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __STM32F4xx_IT_H
|
||||
#define __STM32F4xx_IT_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "stm32f4xx.h"
|
||||
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
/* Exported constants --------------------------------------------------------*/
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
/* Exported functions ------------------------------------------------------- */
|
||||
|
||||
void NMI_Handler(void);
|
||||
void HardFault_Handler(void);
|
||||
void MemManage_Handler(void);
|
||||
void BusFault_Handler(void);
|
||||
void UsageFault_Handler(void);
|
||||
void SVC_Handler(void);
|
||||
void DebugMon_Handler(void);
|
||||
void PendSV_Handler(void);
|
||||
void SysTick_Handler(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __STM32F4xx_IT_H */
|
||||
|
||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
||||
@@ -0,0 +1,118 @@
|
||||
#include "usart.h"
|
||||
|
||||
#ifdef __GNUC__
|
||||
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
|
||||
set to 'Yes') calls __io_putchar() */
|
||||
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
|
||||
#else
|
||||
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
|
||||
#endif /* __GNUC__ */
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* Function Name : USART_Configuration
|
||||
* Description : Configure Open_USART
|
||||
* Input : None
|
||||
* Output : None
|
||||
* Return : None
|
||||
* Attention : None
|
||||
*******************************************************************************/
|
||||
void USART_Configuration(void)
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
USART_InitTypeDef USART_InitStructure;
|
||||
|
||||
RCC_AHB1PeriphClockCmd(Open_USART_TX_GPIO_CLK,ENABLE);
|
||||
RCC_AHB1PeriphClockCmd(Open_USART_RX_GPIO_CLK,ENABLE);
|
||||
|
||||
RCC_APB1PeriphClockCmd(Open_USART_CLK,ENABLE);
|
||||
|
||||
|
||||
GPIO_PinAFConfig(Open_USART_TX_GPIO_PORT, Open_USART_TX_SOURCE, Open_USART_TX_AF);
|
||||
GPIO_PinAFConfig(Open_USART_RX_GPIO_PORT, Open_USART_RX_SOURCE, Open_USART_RX_AF);
|
||||
|
||||
/*
|
||||
* Open_USART_TX -> PA9 , Open_USART_RX -PA10
|
||||
*/
|
||||
GPIO_InitStructure.GPIO_Pin = Open_USART_TX_PIN;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||||
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
|
||||
GPIO_Init(Open_USART_TX_GPIO_PORT, &GPIO_InitStructure);
|
||||
|
||||
GPIO_InitStructure.GPIO_Pin = Open_USART_RX_PIN;
|
||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
||||
GPIO_Init(Open_USART_RX_GPIO_PORT, &GPIO_InitStructure);
|
||||
|
||||
/*
|
||||
USARTx configured as follow:
|
||||
- BaudRate = 115200 baud
|
||||
- Word Length = 8 Bits
|
||||
- One Stop Bit
|
||||
- No parity
|
||||
- Hardware flow control disabled (RTS and CTS signals)
|
||||
- Receive and transmit
|
||||
*/
|
||||
|
||||
USART_InitStructure.USART_BaudRate = 115200;
|
||||
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
|
||||
USART_InitStructure.USART_StopBits = USART_StopBits_1;
|
||||
USART_InitStructure.USART_Parity = USART_Parity_No;
|
||||
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
|
||||
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
|
||||
USART_Init(Open_USART, &USART_InitStructure);
|
||||
/* Enable the Open_USART Transmit interrupt: this interrupt is generated when the
|
||||
Open_USART transmit data register is empty */
|
||||
USART_ITConfig(Open_USART,USART_IT_RXNE,ENABLE);
|
||||
|
||||
USART_Cmd(Open_USART, ENABLE);
|
||||
|
||||
}
|
||||
|
||||
void USART_NVIC_Config(void)
|
||||
{
|
||||
NVIC_InitTypeDef NVIC_InitStructure;
|
||||
|
||||
/* Enable the USARTx Interrupt */
|
||||
NVIC_InitStructure.NVIC_IRQChannel = Open_USART_IRQn;
|
||||
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
|
||||
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
||||
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
||||
NVIC_Init(&NVIC_InitStructure);
|
||||
}
|
||||
|
||||
/* Use no semihosting */
|
||||
#if 1
|
||||
#pragma import(__use_no_semihosting)
|
||||
struct __FILE
|
||||
{
|
||||
int handle;
|
||||
};
|
||||
FILE __stdout;
|
||||
|
||||
_sys_exit(int x)
|
||||
{
|
||||
x = x;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Retargets the C library printf function to the USART.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
PUTCHAR_PROTOTYPE
|
||||
{
|
||||
/* Place your implementation of fputc here */
|
||||
/* e.g. write a character to the USART */
|
||||
USART_SendData(Open_USART, (uint8_t) ch);
|
||||
|
||||
/* Loop until the end of transmission */
|
||||
while (USART_GetFlagStatus(Open_USART, USART_FLAG_TC) == RESET)
|
||||
{}
|
||||
|
||||
return ch;
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
#ifndef _USART_H
|
||||
#define _USART_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include "stm32f4xx.h"
|
||||
|
||||
/**
|
||||
* @brief Definition for COM port1, connected to USART3
|
||||
*/
|
||||
#define Open_USART USART3
|
||||
#define Open_USART USART3
|
||||
#define Open_USART_CLK RCC_APB1Periph_USART3
|
||||
|
||||
#define Open_USART_TX_PIN GPIO_Pin_10
|
||||
#define Open_USART_TX_GPIO_PORT GPIOC
|
||||
#define Open_USART_TX_GPIO_CLK RCC_AHB1Periph_GPIOC
|
||||
#define Open_USART_TX_SOURCE GPIO_PinSource10
|
||||
#define Open_USART_TX_AF GPIO_AF_USART3
|
||||
|
||||
|
||||
#define Open_USART_RX_PIN GPIO_Pin_11
|
||||
#define Open_USART_RX_GPIO_PORT GPIOC
|
||||
#define Open_USART_RX_GPIO_CLK RCC_AHB1Periph_GPIOC
|
||||
#define Open_USART_RX_SOURCE GPIO_PinSource11
|
||||
#define Open_USART_RX_AF GPIO_AF_USART3
|
||||
|
||||
#define Open_USART_IRQn USART3_IRQn
|
||||
void USART_Configuration(void);
|
||||
void USART_NVIC_Config(void);
|
||||
|
||||
#endif /*_USART_H*/
|
||||
Reference in New Issue
Block a user