CIU32_L051_M307R/Peripheral/CIU32L051_Lib/Source/ciu32l051_std_flash.c

206 lines
5.1 KiB
C
Raw Normal View History

/************************************************************************************************/
/**
* @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 = (uint32_t)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 */
/**
* @}
*/
/**
* @}
*/