208 lines
5.1 KiB
C
208 lines
5.1 KiB
C
|
/************************************************************************************************/
|
|||
|
/**
|
|||
|
* @file ciu32l051_std_flash.c
|
|||
|
* @author MCU Ecosystem Development Team
|
|||
|
* @brief FLASH STD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* ʵ<EFBFBD><EFBFBD>FLASH<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>API<EFBFBD><EFBFBD>
|
|||
|
*
|
|||
|
*
|
|||
|
**************************************************************************************************
|
|||
|
* @attention
|
|||
|
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
|
|||
|
*
|
|||
|
**************************************************************************************************
|
|||
|
*/
|
|||
|
|
|||
|
/************************************************************************************************/
|
|||
|
/**
|
|||
|
* @addtogroup CIU32L051_STD_Driver
|
|||
|
* @{
|
|||
|
*/
|
|||
|
|
|||
|
/**
|
|||
|
* @addtogroup FLASH
|
|||
|
* @{
|
|||
|
*
|
|||
|
*/
|
|||
|
/************************************************************************************************/
|
|||
|
|
|||
|
|
|||
|
/*------------------------------------------includes--------------------------------------------*/
|
|||
|
#include "ciu32l051_std.h"
|
|||
|
|
|||
|
#ifdef STD_FLASH_PERIPHERAL_USED
|
|||
|
|
|||
|
/*-------------------------------------------functions------------------------------------------*/
|
|||
|
|
|||
|
/************************************************************************************************/
|
|||
|
/**
|
|||
|
* @addtogroup FLASH_External_Functions
|
|||
|
* @{
|
|||
|
*
|
|||
|
*/
|
|||
|
/************************************************************************************************/
|
|||
|
|
|||
|
/**
|
|||
|
* @brief Flashҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param page_index <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD>
|
|||
|
* @retval std_status_t APIִ<EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
std_status_t std_flash_page_erase(uint32_t page_index)
|
|||
|
{
|
|||
|
return std_flash_erase(FLASH_ERASE_PAGE, page_index);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief FLASH<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @retval std_status_t APIִ<EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
std_status_t std_flash_mass_erase(void)
|
|||
|
{
|
|||
|
return std_flash_erase(FLASH_ERASE_MASS, 0);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief Flash<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param mode <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
|
|||
|
* @arg FLASH_ERASE_PAGE
|
|||
|
* @arg FLASH_ERASE_MASS
|
|||
|
* @param index <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD>
|
|||
|
* @note <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽΪFLASH_ERASE_MASSʱ<EFBFBD><EFBFBD>index<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
|
|||
|
* @note ʹ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD>std_flash_unlock()<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>flash
|
|||
|
* @retval std_status_t APIִ<EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
std_status_t std_flash_erase(uint32_t mode, uint32_t index)
|
|||
|
{
|
|||
|
std_status_t status;
|
|||
|
uint32_t wait_time = FLASH_WAIT_MASS_ERASE;
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD>Flash<73><68>һ<EFBFBD>β<EFBFBD><CEB2><EFBFBD>æ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ */
|
|||
|
status = std_flash_wait_for_last_operation(FLASH_WAIT_PAGE_ERASE);
|
|||
|
if (status == STD_OK)
|
|||
|
{
|
|||
|
/* <20><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>ģʽ */
|
|||
|
std_flash_set_erase_mode(mode);
|
|||
|
|
|||
|
if (mode == FLASH_ERASE_PAGE)
|
|||
|
{
|
|||
|
/* <20><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>ҳ<EFBFBD><D2B3> */
|
|||
|
std_flash_set_erase_index(index);
|
|||
|
wait_time = FLASH_WAIT_PAGE_ERASE;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD>Flash<73><68><EFBFBD><EFBFBD> */
|
|||
|
std_flash_erase_start();
|
|||
|
|
|||
|
/* <20><>ѯFlashæ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
status = std_flash_wait_for_last_operation(wait_time);
|
|||
|
|
|||
|
/* <20>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>ģʽ */
|
|||
|
std_flash_set_erase_mode(FLASH_ERASE_DISABLE);
|
|||
|
}
|
|||
|
|
|||
|
return (status);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief User Flash<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Option Byte<EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param address <EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD>ַ
|
|||
|
* @param prog_data <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>4<EFBFBD>ֽڣ<EFBFBD>
|
|||
|
* @note Option Byte<EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><EFBFBD><EFBFBD>std_flash_opt_unlock()<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
|
|||
|
* @retval std_status_t APIִ<EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
std_status_t std_flash_word_program(uint32_t address, uint32_t prog_data)
|
|||
|
{
|
|||
|
std_status_t status;
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD>Flash<73><68>һ<EFBFBD>β<EFBFBD><CEB2><EFBFBD>æ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ */
|
|||
|
status = std_flash_wait_for_last_operation(FLASH_WAIT_PROGRAM);
|
|||
|
if (status == STD_OK)
|
|||
|
{
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ */
|
|||
|
std_flash_program_enable();
|
|||
|
|
|||
|
/* <20><>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>ַд<D6B7><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
*(uint32_t *)address = prog_data;
|
|||
|
|
|||
|
/* <20><>ѯFlashæ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
status = std_flash_wait_for_last_operation(FLASH_WAIT_PROGRAM);
|
|||
|
|
|||
|
/* <20>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>ģʽ */
|
|||
|
std_flash_program_disable();
|
|||
|
}
|
|||
|
|
|||
|
return (status);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief Flash Option Bytes<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @retval std_status_t APIִ<EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
std_status_t std_flash_opt_erase(void)
|
|||
|
{
|
|||
|
std_status_t status;
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD>Flash<73><68>һ<EFBFBD>β<EFBFBD><CEB2><EFBFBD>æ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ */
|
|||
|
status = std_flash_wait_for_last_operation(FLASH_WAIT_PAGE_ERASE);
|
|||
|
if (status == STD_OK)
|
|||
|
{
|
|||
|
/* <20><><EFBFBD><EFBFBD>Flashѡ<68><D1A1><EFBFBD>ֽڲ<D6BD><DAB2><EFBFBD> */
|
|||
|
std_flash_opt_erase_start();
|
|||
|
|
|||
|
/* <20><>ѯFlashæ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
status = std_flash_wait_for_last_operation(FLASH_WAIT_PAGE_ERASE);
|
|||
|
}
|
|||
|
|
|||
|
return (status);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD>ȴ<EFBFBD>Flash<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
|
|||
|
* @param timeout <EFBFBD><EFBFBD>ʱ<EFBFBD>ȴ<EFBFBD>ʱ<EFBFBD>䣬<EFBFBD><EFBFBD>λ:ms
|
|||
|
* @arg FLASH_WAIT_PROGRAM
|
|||
|
* @arg FLASH_WAIT_PAGE_ERASE
|
|||
|
* @arg FLASH_WAIT_MASS_ERASE
|
|||
|
* @retval std_status_t APIִ<EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
std_status_t std_flash_wait_for_last_operation(uint32_t timeout)
|
|||
|
{
|
|||
|
std_status_t status = STD_OK;
|
|||
|
uint32_t count;
|
|||
|
count = timeout *(SystemCoreClock / 1000U);
|
|||
|
|
|||
|
/* <20><>ѯ<EFBFBD>ȴ<EFBFBD>BSY<53><59>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
while (std_flash_get_flag(FLASH_FLAG_BSY))
|
|||
|
{
|
|||
|
if (count == 0U)
|
|||
|
{
|
|||
|
return STD_ERR_TIMEOUT;
|
|||
|
}
|
|||
|
count--;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD>Flash<73><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־ */
|
|||
|
if((FLASH->SR & FLASH_FLAG_ALL_ERR) != 0x00000000U)
|
|||
|
{
|
|||
|
status = STD_ERR;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD>Flash<73><68>־ */
|
|||
|
std_flash_clear_flag(FLASH_FLAG_ALL_ERR | FLASH_SR_EOP);
|
|||
|
|
|||
|
return status;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @}
|
|||
|
*/
|
|||
|
|
|||
|
#endif /* STD_FLASH_PERIPHERAL_USED */
|
|||
|
|
|||
|
/**
|
|||
|
* @}
|
|||
|
*/
|
|||
|
|
|||
|
/**
|
|||
|
* @}
|
|||
|
*/
|