/** * @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; }
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 */ }; } }
/** * @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; }
/** * @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); }
/** * @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); }
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 */ }; }
/** * @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; }
/** * @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; }