Example #1
0
/**
  * @brief  Erase the contents of the entire chip.
  * @param  None.
  * @retval FC_SUCCESS, FC_ERROR_PROTECTED, FC_ERROR_OVER_TIME.
  *
  */
FC_Result FC_EraseChip(void)
{
    FC_Result retval = FC_SUCCESS;
    volatile uint32_t *addr1 = (uint32_t *) (FLASH_START_ADDR + FC_CMD_BC1_ADDR);
    volatile uint32_t *addr2 = (uint32_t *) (FLASH_START_ADDR + FC_CMD_BC2_ADDR);
    volatile uint32_t counter = FC_ERASE_CHIP_OVER_TIME;

    FunctionalState result0 = FC_GetBlockProtectState(FC_BLOCK_0);
    FunctionalState result1 = FC_GetBlockProtectState(FC_BLOCK_1);

    if ((ENABLE == result0) && (ENABLE == result1)) {
        retval = FC_ERROR_PROTECTED;
    } else {
        *addr1 = (uint32_t) 0x000000AA; /* bus cycle 1 */
        *addr2 = (uint32_t) 0x00000055; /* bus cycle 2 */
        *addr1 = (uint32_t) 0x00000080; /* bus cycle 3 */
        *addr1 = (uint32_t) 0x000000AA; /* bus cycle 4 */
        *addr2 = (uint32_t) 0x00000055; /* bus cycle 5 */
        *addr1 = (uint32_t) 0x00000010; /* bus cycle 6 */
        __DSB();

        while (BUSY == FC_GetBusyState()) {     /* check if FLASH is busy with overtime counter */
            if (!(counter--)) { /* check overtime */
                retval = FC_ERROR_OVER_TIME;
                break;
            } else {
                /* Do nothing */
            }
        }
    }

    return retval;
}
Example #2
0
void FC_Basic(void)
{
    FunctionalState tmp_value_sec0, tmp_value_sec1, tmp_value_block;
    int ret_0 = 0U, ret_1 = 0U;
    TSB_WD_MOD_WDTE = 0U;
    TSB_WD->CR = 0x000000B1;

    while (1) {
        /* Set security function "ENABLE" */
        FC_SetSecurityBit(ENABLE);

        /* Get security register value */
        tmp_value_sec0 = FC_GetSecurityBit();
        if (tmp_value_sec0 != ENABLE) {
            ret_0 = 1U;
        }

        /* Set security function "DISABLE" */
        FC_SetSecurityBit(DISABLE);

        /* Get security register value */
        tmp_value_sec1 = FC_GetSecurityBit();
        if (tmp_value_sec1 != DISABLE) {
            ret_1 = 1U;
        }

        /* Get Block 0 Protection status */
        tmp_value_block = FC_GetBlockProtectState(FC_BLOCK_0);

        /* Wait for Ready */
        while (FC_GetBusyState() != DONE) {
        /* Do nothing */
        };
    }
}
Example #3
0
/**
  * @brief  Program the protection bit to make the specified block protected.
  * @param  BlockNum: The flash block number.
  *   This parameter can be one of the following values:
  *   FC_BLOCK_0,FC_BLOCK_1,FC_BLOCK_2,
  *   FC_BLOCK_3, FC_BLOCK_4, FC_BLOCK_5.
  * @retval FC_SUCCESS, FC_ERROR_PROTECTED, FC_ERROR_OVER_TIME.
  *
  */
FC_Result FC_ProgramBlockProtectState(uint8_t BlockNum)
{
    FC_Result retval = FC_SUCCESS;
    volatile uint32_t *addr1 = (uint32_t *) (FLASH_START_ADDR + FC_CMD_BC1_ADDR);
    volatile uint32_t *addr2 = (uint32_t *) (FLASH_START_ADDR + FC_CMD_BC2_ADDR);
    volatile uint32_t *PBA = FC_PBA_BLOCK_4;
    uint32_t counter = FC_SET_PROTECT_STATE_OVER_TIME;

    /* Check the parameters */
    assert_param(IS_FC_BLOCK_NUM(BlockNum));

    switch (BlockNum) {

    case FC_BLOCK_0:
        PBA = FC_PBA_BLOCK_0;
        break;
    case FC_BLOCK_1:
        PBA = FC_PBA_BLOCK_1;
        break;
    case FC_BLOCK_2:
        PBA = FC_PBA_BLOCK_2;
        break;
    case FC_BLOCK_3:
        PBA = FC_PBA_BLOCK_3;
        break;
    case FC_BLOCK_4:
        PBA = FC_PBA_BLOCK_4;
        break;
    case FC_BLOCK_5:
        PBA = FC_PBA_BLOCK_5;
        break;
    default:
        /* Do nothing */
        break;
    }

    if (ENABLE == FC_GetBlockProtectState(BlockNum)) {
        retval = FC_ERROR_PROTECTED;
    } else {
        *addr1 = (uint32_t) 0x000000AA; /* bus cycle 1 */
        *addr2 = (uint32_t) 0x00000055; /* bus cycle 2 */
        *addr1 = (uint32_t) 0x0000009A; /* bus cycle 3 */
        *addr1 = (uint32_t) 0x000000AA; /* bus cycle 4 */
        *addr2 = (uint32_t) 0x00000055; /* bus cycle 5 */
        *addr1 = (uint32_t) 0x0000009A; /* bus cycle 6 */
        *PBA = (uint32_t) 0x0000009A;   /* bus cycle 7 */
        __DSB();

        while (BUSY == FC_GetBusyState()) {     /* check if FLASH is busy with overtime counter */
            if (!(counter--)) { /* check overtime */
                retval = FC_ERROR_OVER_TIME;
                break;
            } else {
                /* Do nothing */
            }
        }
    }

    return retval;
}
Example #4
0
/**
  * @brief  Erase the contents of the specified block.
  * @param  BlockAddr: The block start address.
  * @retval FC_SUCCESS, FC_ERROR_PROTECTED, FC_ERROR_OVER_TIME.
  *
  */
FC_Result FC_EraseBlock(uint32_t BlockAddr)
{
    uint8_t BlockNum = FC_BLOCK_4;

    assert_param(IS_FC_ADDR(BlockAddr));        /* Check whether it is in the flash address range */

    BlockNum = FC_AddrToBlockNum(BlockAddr);

    if (ENABLE == FC_GetBlockProtectState(BlockNum)) {
        return FC_ERROR_PROTECTED;
    }
    
    return __FC_EraseBlock(BlockAddr);
}
Example #5
0
/**
  * @brief  Write data to the specified page.
  * @param  PageAddr: The page start address.
  *         Data: The pointer to data buffer to be written into the page.
  *         The data size should be 256Byte.
  * @retval FC_SUCCESS, FC_ERROR_PROTECTED, FC_ERROR_OVER_TIME.
  *
  */
FC_Result FC_WritePage(uint32_t PageAddr, uint32_t * Data)
{
    uint8_t BlockNum = FC_BLOCK_4;

    assert_param(IS_FC_ADDR(PageAddr)); /* Check whether it is in the flash address range */
    assert_param(IS_FC_PAGE_ADDR(PageAddr));    /* Check whether it is a page start address */
    assert_param(IS_POINTER_NOT_NULL(Data));

    BlockNum = FC_AddrToBlockNum(PageAddr);

    if (ENABLE == FC_GetBlockProtectState(BlockNum)) {
        return FC_ERROR_PROTECTED;
    }
    
    return __FC_WritePage(PageAddr, Data);
}
Example #6
0
void FC_Basic(void)
{
    FunctionalState tmp_value_sec0, tmp_value_sec1, tmp_value_block;
	
	UART_Configuration(UART);
	UART_Print(UART, "This is an example for FC\n\r");

	/* Set security function "ENABLE" */
	FC_SetSecurityBit(ENABLE);
	UART_Print(UART, "Enable the Security Function\n\r");
	/* Get security register value */
	tmp_value_sec0 = FC_GetSecurityBit();
	if (tmp_value_sec0 != ENABLE) {
		UART_Print(UART, "Security register value is disable\n\r");
	}else{
		UART_Print(UART, "Security register value is enable\n\r");
	}

	/* Set security function "DISABLE" */
	FC_SetSecurityBit(DISABLE);
	UART_Print(UART, "Disable the Security Function\n\r");
	/* Get security register value */
	tmp_value_sec1 = FC_GetSecurityBit();
	if (tmp_value_sec1 != DISABLE) {
		UART_Print(UART, "Security register value is enable\n\r");
	}else{
		UART_Print(UART, "Security register value is diable\n\r");
	}

	/* Get Block 0 Protection status */
	tmp_value_block = FC_GetBlockProtectState(FC_BLOCK_0);
	UART_Print(UART, "Getting Block 0 Protection status\n\r");
	if (tmp_value_block != DISABLE) {
		UART_Print(UART, "The status is enable\n\r");
	}else{
		UART_Print(UART, "The status is diable\n\r");
	}
	
	/* Wait for Ready */
	while (FC_GetBusyState() != DONE) {
		/* Do nothing */
	};

}
Example #7
0
/**
  * @brief  Write data to the specified page.
  * @param  PageAddr: The page start address.
  *         Data: The pointer to data buffer to be written into the page.
  *         The data size should be 256Byte.
  * @retval FC_SUCCESS, FC_ERROR_PROTECTED, FC_ERROR_OVER_TIME.
  *
  */
FC_Result FC_WritePage(uint32_t PageAddr, uint32_t * Data)
{
    FC_Result retval = FC_SUCCESS;
    volatile uint32_t *addr1 = (uint32_t *) (FLASH_START_ADDR + FC_CMD_BC1_ADDR);
    volatile uint32_t *addr2 = (uint32_t *) (FLASH_START_ADDR + FC_CMD_BC2_ADDR);
    volatile uint32_t *addr3 = (uint32_t *) PageAddr;
    uint32_t counter = FC_WRITE_PAGE_OVER_TIME;
    uint32_t i = 0U;
    uint32_t *source = Data;
    uint8_t BlockNum = 0U;

    assert_param(IS_FC_ADDR(PageAddr)); /* Check whether it is in the flash address range */
    assert_param(IS_FC_PAGE_ADDR(PageAddr));    /* Check whether it is a page start address */
    assert_param(IS_POINTER_NOT_NULL(Data));

    BlockNum = FC_AddrToBlockNum(PageAddr);

    if (ENABLE == FC_GetBlockProtectState(BlockNum)) {
        retval = FC_ERROR_PROTECTED;
    } else {
        *addr1 = (uint32_t) 0x000000AA; /* bus cycle 1 */
        *addr2 = (uint32_t) 0x00000055; /* bus cycle 2 */
        *addr1 = (uint32_t) 0x000000A0; /* bus cycle 3 */
        for (i = 0U; i < FC_PAGE_SIZE; i++) {   /* bus cycle 4~67 */
            *addr3 = *source;
            source++;
        }
        __DSB();

        while (BUSY == FC_GetBusyState()) {     /* check if FLASH is busy with overtime counter */
            if (!(counter--)) { /* check overtime */
                retval = FC_ERROR_OVER_TIME;
                break;
            } else {
                /* Do nothing */
            }
        }
    }

    return retval;
}
Example #8
0
/**
  * @brief  Erase the contents of the specified block.
  * @param  BlockAddr: The block start address.
  * @retval FC_SUCCESS, FC_ERROR_PROTECTED, FC_ERROR_OVER_TIME.
  *
  */
FC_Result FC_EraseBlock(uint32_t BlockAddr)
{
    FC_Result retval = FC_SUCCESS;
    uint32_t blockaddr = BlockAddr & FC_BLOCK_ADDR_MASK;
    volatile uint32_t *addr1 = (uint32_t *) (FLASH_START_ADDR + FC_CMD_BC1_ADDR);
    volatile uint32_t *addr2 = (uint32_t *) (FLASH_START_ADDR + FC_CMD_BC2_ADDR);
    volatile uint32_t *BA = (uint32_t *) blockaddr;
    volatile uint32_t counter = FC_ERASE_BLOCK_OVER_TIME;
    uint8_t BlockNum = 0U;

    assert_param(IS_FC_ADDR(BlockAddr));        /* Check whether it is in the flash address range */

    BlockNum = FC_AddrToBlockNum(BlockAddr);

    if (ENABLE == FC_GetBlockProtectState(BlockNum)) {
        retval = FC_ERROR_PROTECTED;
    } else {
        *addr1 = (uint32_t) 0x000000AA; /* bus cycle 1 */
        *addr2 = (uint32_t) 0x00000055; /* bus cycle 2 */
        *addr1 = (uint32_t) 0x00000080; /* bus cycle 3 */
        *addr1 = (uint32_t) 0x000000AA; /* bus cycle 4 */
        *addr2 = (uint32_t) 0x00000055; /* bus cycle 5 */
        *BA = (uint32_t) 0x00000030;    /* bus cycle 6 */
        __DSB();

        while (BUSY == FC_GetBusyState()) {     /* check if FLASH is busy with overtime counter */
            if (!(counter--)) { /* check overtime */
                retval = FC_ERROR_OVER_TIME;
                break;
            } else {
                /* Do nothing */
            }
        }
    }

    return retval;
}