/**
|
******************************************************************************
|
* @file fm33a0xxev_flash.c
|
* @author FM33A0XXEV Application Team
|
* @version V1.0.0
|
* @date 16-April-2020
|
* @brief This file provides firmware functions to manage the following
|
* functionalities of....:
|
*
|
*/
|
|
/* Includes ------------------------------------------------------------------*/
|
|
#include "fm33a0xxev_flash.h"
|
|
/** @addtogroup fm33a0xxev_StdPeriph_Driver
|
* @{
|
*/
|
|
/** @defgroup FLASH
|
* @brief FLASH driver modules
|
* @{
|
*/
|
|
/* Flash¶ÁµÈ´ýÖÜÆÚÅäÖà (Wait Cycles Config)
|
00/11£º0 wait cycle
|
01£º1 wait cycle
|
10£º2 wait cycles
|
CPUÖ÷ƵСÓÚµÈÓÚ24MHzʱ£¬²»ÐèÒª¿ªÆôwait£»Ö÷Ƶ´óÓÚ24MСÓÚ48MhzʱʹÄÜ1 wait£¬Ö÷Ƶ´óÓÚ48MhzʱʹÄÜ2 wait Ïà¹Øº¯Êý */
|
void FLS_RDCR_WAIT_Set(uint32_t SetValue)
|
{
|
uint32_t tmpreg;
|
tmpreg = FLS->RDCR;
|
tmpreg &= ~(FLS_RDCR_WAIT_Msk);
|
tmpreg |= (SetValue & FLS_RDCR_WAIT_Msk);
|
FLS->RDCR = tmpreg;
|
}
|
|
uint32_t FLS_RDCR_WAIT_Get(void)
|
{
|
return (FLS->RDCR & FLS_RDCR_WAIT_Msk);
|
}
|
|
/* Ö¸ÁîԤȡָʹÄÜ£¬ÔÚWAIT==00µÄÇé¿öÏÂд1ÎÞЧ (Prefetch Enable)
|
1£ºÊ¹ÄÜPrefetch
|
0£º½ûÖ¹Prefetch Ïà¹Øº¯Êý */
|
void FLS_PFCR_PRFTEN_Setable(FunState NewState)
|
{
|
if (NewState == ENABLE)
|
{
|
FLS->PFCR |= (FLS_PFCR_PRFTEN_Msk);
|
}
|
else
|
{
|
FLS->PFCR &= ~(FLS_PFCR_PRFTEN_Msk);
|
}
|
}
|
|
FunState FLS_PFCR_PRFTEN_Getable(void)
|
{
|
if (FLS->PFCR & (FLS_PFCR_PRFTEN_Msk))
|
{
|
return ENABLE;
|
}
|
else
|
{
|
return DISABLE;
|
}
|
}
|
|
/* DBG¿ØÖƼĴæÆ÷ʹÄÜ
|
0£ºÆÁ±Î
|
1£ºÊ¹ÄÜ */
|
FunState FLS_OPTBR_DBGCFGEN_Chk(void)
|
{
|
if (FLS->OPTBR & FLS_OPTBR_DBGCFGEN_Msk)
|
{
|
return ENABLE;
|
}
|
else
|
{
|
return DISABLE;
|
}
|
}
|
|
/* Information2ÇøËø¶¨±êÖ¾ (IF2 Lock Enable)
|
0£ºÎ´Ëø¶¨
|
1£ºÒÑËø¶¨£¬Ëø¶¨ºóÈí¼þ²»¿É¸Äд±¾ÉÈÇø Ïà¹Øº¯Êý */
|
FlagStatus FLS_OPTBR_IF2LOCK_Chk(void)
|
{
|
if (FLS->OPTBR & FLS_OPTBR_IF2LOCK_Msk)
|
{
|
return SET;
|
}
|
else
|
{
|
return RESET;
|
}
|
}
|
|
/* Information1ÇøËø¶¨±êÖ¾ (IF1 Lock Enable)
|
0£ºÎ´Ëø¶¨
|
1£ºÒÑËø¶¨£¬Ëø¶¨ºóÈí¼þ²»¿É¸Äд±¾ÉÈÇø Ïà¹Øº¯Êý */
|
FlagStatus FLS_OPTBR_IF1LOCK_Chk(void)
|
{
|
if (FLS->OPTBR & FLS_OPTBR_IF1LOCK_Msk)
|
{
|
return SET;
|
}
|
else
|
{
|
return RESET;
|
}
|
}
|
|
/* DataFlashʹÄÜ (DataFlash Enable)
|
0£ºÎÞdata flash
|
1£ºÓÐdata flash Ïà¹Øº¯Êý */
|
FunState FLS_OPTBR_DFLSEN_Getable(void)
|
{
|
if (FLS->OPTBR & (FLS_OPTBR_DFLSEN_Msk))
|
{
|
return ENABLE;
|
}
|
else
|
{
|
return DISABLE;
|
}
|
}
|
|
/* BootSwap¹¦ÄÜʹÄÜ (BootSwap Enable)
|
00/01/11£º½ûÖ¹BootSwap¹¦ÄÜ
|
10£ºÔÊÐíBootSwap Ïà¹Øº¯Êý */
|
FunState FLS_OPTBR_BTSEN_Getable(void)
|
{
|
if ((FLS->OPTBR & (FLS_OPTBR_BTSEN_Msk))==(0x10<<8))
|
{
|
return ENABLE;
|
}
|
else
|
{
|
return DISABLE;
|
}
|
}
|
|
/* Ó¦ÓôúÂëȨÏÞËø¶¨Ê¹ÄÜ (AppCode Lock Enable)
|
00/01/11£ºACLOCK²»Ê¹ÄÜ
|
10£ºACLOCKʹÄÜ Ïà¹Øº¯Êý */
|
FunState FLS_OPTBR_ACLOCKEN_Getable(void)
|
{
|
if ((FLS->OPTBR & (FLS_OPTBR_ACLOCKEN_Msk))==(0x10<<2))
|
{
|
return ENABLE;
|
}
|
else
|
{
|
return DISABLE;
|
}
|
}
|
|
/* Debug Port¶ÁÈ¡±£»¤Ê¹ÄÜ (Debug Read Protection Enable)
|
00/01/11£ºDBRDP²»Ê¹ÄÜ
|
10£ºDBRDPʹÄÜ Ïà¹Øº¯Êý */
|
uint32_t FLS_OPTBR_DBRDPEN_Getable(void)
|
{
|
return (FLS->OPTBR & (FLS_OPTBR_DBRDPEN_Msk));
|
|
}
|
|
uint32_t FLS_OPTBR_Read(void)
|
{
|
return (FLS->OPTBR);
|
}
|
|
|
|
/* Flash²Á³ýÀàÐÍÅäÖà (Erase Type)
|
00/11£ºPage Erase
|
01£ºSector Erase
|
10£ºChip Erase (SWD only) Ïà¹Øº¯Êý */
|
void FLS_EPCR_ERTYPE_Set(uint32_t SetValue)
|
{
|
uint32_t tmpreg;
|
tmpreg = FLS->EPCR;
|
tmpreg &= ~(FLS_EPCR_ERTYPE_Msk);
|
tmpreg |= (SetValue & FLS_EPCR_ERTYPE_Msk);
|
FLS->EPCR = tmpreg;
|
}
|
|
uint32_t FLS_EPCR_ERTYPE_Get(void)
|
{
|
return (FLS->EPCR & FLS_EPCR_ERTYPE_Msk);
|
}
|
|
/* Program Request
|
Èí¼þÖÃλ£¬Ó²¼þÍê³É±à³Ìºó×Ô¶¯ÇåÁã Ïà¹Øº¯Êý */
|
void FLS_EPCR_PREQ_Set(uint32_t SetValue)
|
{
|
uint32_t tmpreg;
|
tmpreg = FLS->EPCR;
|
tmpreg &= ~(FLS_EPCR_PREQ_Msk);
|
tmpreg |= (SetValue & FLS_EPCR_PREQ_Msk);
|
FLS->EPCR = tmpreg;
|
}
|
|
uint32_t FLS_EPCR_PREQ_Get(void)
|
{
|
return (FLS->EPCR & FLS_EPCR_PREQ_Msk);
|
}
|
|
/* Erase Request
|
Èí¼þÖÃλ£¬Ó²¼þÍê³É²Á³ýºó×Ô¶¯ÇåÁã Ïà¹Øº¯Êý */
|
void FLS_EPCR_EREQ_Set(uint32_t SetValue)
|
{
|
uint32_t tmpreg;
|
tmpreg = FLS->EPCR;
|
tmpreg &= ~(FLS_EPCR_EREQ_Msk);
|
tmpreg |= (SetValue & FLS_EPCR_EREQ_Msk);
|
FLS->EPCR = tmpreg;
|
}
|
|
uint32_t FLS_EPCR_EREQ_Get(void)
|
{
|
return (FLS->EPCR & FLS_EPCR_EREQ_Msk);
|
}
|
|
/* Flash²ÁдKeyÊäÈë¼Ä´æÆ÷£¬Èí¼þ»òÕßSWDÔÚÆô¶¯²Áдǰ±ØÐëÕýÈ·µØÏò´ËµØÖ·Ð´ÈëºÏ·¨KEYÐòÁС£ (Flash Key) Ïà¹Øº¯Êý */
|
void FLS_KEY_Write(uint32_t SetValue)
|
{
|
FLS->KEY = (SetValue);
|
}
|
|
/* OTP±à³Ì´íÎóÖжÏʹÄÜ£¬1ÓÐЧ (OTP program error Interrupt Enable) Ïà¹Øº¯Êý */
|
void FLS_IER_OTPIE_Setable(FunState NewState)
|
{
|
if (NewState == ENABLE)
|
{
|
FLS->IER |= (FLS_IER_OTPIE_Msk);
|
}
|
else
|
{
|
FLS->IER &= ~(FLS_IER_OTPIE_Msk);
|
}
|
}
|
|
FunState FLS_IER_OTPIE_Getable(void)
|
{
|
if (FLS->IER & (FLS_IER_OTPIE_Msk))
|
{
|
return ENABLE;
|
}
|
else
|
{
|
return DISABLE;
|
}
|
}
|
|
/* Flash¶ÁдȨÏÞ´íÎóÖжÏʹÄÜ£¬1ÓÐЧ (Flash Authentication Error Interrupt Enable) Ïà¹Øº¯Êý */
|
void FLS_IER_AUTHIE_Setable(FunState NewState)
|
{
|
if (NewState == ENABLE)
|
{
|
FLS->IER |= (FLS_IER_AUTHIE_Msk);
|
}
|
else
|
{
|
FLS->IER &= ~(FLS_IER_AUTHIE_Msk);
|
}
|
}
|
|
FunState FLS_IER_AUTHIE_Getable(void)
|
{
|
if (FLS->IER & (FLS_IER_AUTHIE_Msk))
|
{
|
return ENABLE;
|
}
|
else
|
{
|
return DISABLE;
|
}
|
}
|
|
/* Flash KEY´íÎóÖжÏʹÄÜ£¬1ÓÐЧ (Flash Key Error Interrupt Enable) Ïà¹Øº¯Êý */
|
void FLS_IER_KEYIE_Setable(FunState NewState)
|
{
|
if (NewState == ENABLE)
|
{
|
FLS->IER |= (FLS_IER_KEYIE_Msk);
|
}
|
else
|
{
|
FLS->IER &= ~(FLS_IER_KEYIE_Msk);
|
}
|
}
|
|
FunState FLS_IER_KEYIE_Getable(void)
|
{
|
if (FLS->IER & (FLS_IER_KEYIE_Msk))
|
{
|
return ENABLE;
|
}
|
else
|
{
|
return DISABLE;
|
}
|
}
|
|
/* ²Áд¶¨Ê±Ê±ÖÓ´íÎóÖжÏʹÄÜ£¬1ÓÐЧ (Erase/Program Clock Error Interrupt Enable) Ïà¹Øº¯Êý */
|
void FLS_IER_CKIE_Setable(FunState NewState)
|
{
|
if (NewState == ENABLE)
|
{
|
FLS->IER |= (FLS_IER_CKIE_Msk);
|
}
|
else
|
{
|
FLS->IER &= ~(FLS_IER_CKIE_Msk);
|
}
|
}
|
|
FunState FLS_IER_CKIE_Getable(void)
|
{
|
if (FLS->IER & (FLS_IER_CKIE_Msk))
|
{
|
return ENABLE;
|
}
|
else
|
{
|
return DISABLE;
|
}
|
}
|
|
/* ±à³ÌÍê³É±êÖ¾ÖжÏʹÄÜ£¬1ÓÐЧ (Program Done Interrupt Enable) Ïà¹Øº¯Êý */
|
void FLS_IER_PRDIE_Setable(FunState NewState)
|
{
|
if (NewState == ENABLE)
|
{
|
FLS->IER |= (FLS_IER_PRDIE_Msk);
|
}
|
else
|
{
|
FLS->IER &= ~(FLS_IER_PRDIE_Msk);
|
}
|
}
|
|
FunState FLS_IER_PRDIE_Getable(void)
|
{
|
if (FLS->IER & (FLS_IER_PRDIE_Msk))
|
{
|
return ENABLE;
|
}
|
else
|
{
|
return DISABLE;
|
}
|
}
|
|
/* ²ÁдÍê³É±êÖ¾ÖжÏʹÄÜ£¬1ÓÐЧ (Erase Done Interrupt Enable) Ïà¹Øº¯Êý */
|
void FLS_IER_ERDIE_Setable(FunState NewState)
|
{
|
if (NewState == ENABLE)
|
{
|
FLS->IER |= (FLS_IER_ERDIE_Msk);
|
}
|
else
|
{
|
FLS->IER &= ~(FLS_IER_ERDIE_Msk);
|
}
|
}
|
|
FunState FLS_IER_ERDIE_Getable(void)
|
{
|
if (FLS->IER & (FLS_IER_ERDIE_Msk))
|
{
|
return ENABLE;
|
}
|
else
|
{
|
return DISABLE;
|
}
|
}
|
|
/* Flash²ÁдKEYÊäÈë״̬ (Flash Key Status)
|
000£ºFlashд±£»¤×´Ì¬£¬Î´ÊäÈëKEY
|
001£ºÈ«²Á½âËø×´Ì¬
|
010£ºÉÈÇø²Á½âËø×´Ì¬
|
011£º±à³Ì½âËø×´Ì¬
|
100£ºKEY´íÎóËø¶¨×´Ì¬£¬ÐèÒª¸´Î»²ÅÄܽâËø
|
101/110/111£ºRFU Ïà¹Øº¯Êý */
|
uint32_t FLS_ISR_KEYSTA_Get(void)
|
{
|
return (FLS->ISR & FLS_ISR_KEYSTA_Msk);
|
}
|
|
/* BootSwap±êÖ¾¼Ä´æÆ÷ (BootSwap)
|
0£ºÆô¶¯³ÌÐòÇøÎªFlashÎïÀíµØÖ·0000H~1FFFH
|
1£ºÆô¶¯³ÌÐòÇøÎªFlashÎïÀíµØÖ·2000H~3FFFH Ïà¹Øº¯Êý */
|
uint32_t FLS_ISR_BTSF_Get(void)
|
{
|
return (FLS->ISR & FLS_ISR_BTSF_Msk);
|
}
|
|
/* OTP page±à³ÌȨÏÞ´íÎó£¬Ó²¼þÖÃ룬Èí¼þд1ÇåÁã (OTP program Error Flag. Write 1 to clear)
|
1£º³¢ÊÔ¶ÔÒѱà³ÌµÄOTP×Ö½Ú½øÐбà³Ì
|
0£ºÎÞOTP±à³Ì´íÎó Ïà¹Øº¯Êý */
|
void FLS_ISR_OTPERR_Clr(void)
|
{
|
FLS->ISR = FLS_ISR_OTPERR_Msk;
|
}
|
|
FlagStatus FLS_ISR_OTPERR_Chk(void)
|
{
|
if (FLS->ISR & FLS_ISR_OTPERR_Msk)
|
{
|
return SET;
|
}
|
else
|
{
|
return RESET;
|
}
|
}
|
|
/* Flash¶ÁдȨÏÞ´íÎ󣬶ÁÈ¡LOCK¿éÊý¾Ý»ò¶ÔLOCK¿é²ÁдʱÖÃ룬Èí¼þд1ÇåÁã¡£(Flash Authentication Error Flag, write 1 to clear)
|
1£ºFlash·ÃÎÊȨÏÞ´íÎó
|
0£ºFlash·ÃÎÊûÓз¢ÉúȨÏÞ´íÎó Ïà¹Øº¯Êý */
|
void FLS_ISR_AUTHERR_Clr(void)
|
{
|
FLS->ISR = FLS_ISR_AUTHERR_Msk;
|
}
|
|
FlagStatus FLS_ISR_AUTHERR_Chk(void)
|
{
|
if (FLS->ISR & FLS_ISR_AUTHERR_Msk)
|
{
|
return SET;
|
}
|
else
|
{
|
return RESET;
|
}
|
}
|
|
/* Flash KEY´íÎó£¬Ó²¼þÖÃ룬Èí¼þд1ÇåÁã (Flash Key Error Flag, write 1 to clear) Ïà¹Øº¯Êý */
|
void FLS_ISR_KEYERR_Clr(void)
|
{
|
FLS->ISR = FLS_ISR_KEYERR_Msk;
|
}
|
|
FlagStatus FLS_ISR_KEYERR_Chk(void)
|
{
|
if (FLS->ISR & FLS_ISR_KEYERR_Msk)
|
{
|
return SET;
|
}
|
else
|
{
|
return RESET;
|
}
|
}
|
|
/* ²Áд¶¨Ê±Ê±ÖÓ´íÎó£¬NVMIF²ÁдFlashʱÈç¹ûRCHFδʹÄÜ£¬Ôò´¥·¢CKERRÖжϣ¬Èí¼þд1ÇåÁã¡£(Erase/Program Clock Error Flag, write 1 to clear) Ïà¹Øº¯Êý */
|
void FLS_ISR_CKERR_Clr(void)
|
{
|
FLS->ISR = FLS_ISR_CKERR_Msk;
|
}
|
|
FlagStatus FLS_ISR_CKERR_Chk(void)
|
{
|
if (FLS->ISR & FLS_ISR_CKERR_Msk)
|
{
|
return SET;
|
}
|
else
|
{
|
return RESET;
|
}
|
}
|
|
/* Program Done£¬±à³ÌÍê³É±êÖ¾£¬Ó²¼þÖÃ룬Èí¼þд1ÇåÁã(Program Done Flag,write 1 to clear) Ïà¹Øº¯Êý */
|
void FLS_ISR_PRD_Clr(void)
|
{
|
FLS->ISR = FLS_ISR_PRD_Msk;
|
}
|
|
FlagStatus FLS_ISR_PRD_Chk(void)
|
{
|
if (FLS->ISR & FLS_ISR_PRD_Msk)
|
{
|
return SET;
|
}
|
else
|
{
|
return RESET;
|
}
|
}
|
|
/* Erase Done£¬²ÁдÍê³É±êÖ¾£¬Ó²¼þÖÃ룬Èí¼þд1ÇåÁã(Erase Done Flag,write 1 to clear) Ïà¹Øº¯Êý */
|
void FLS_ISR_ERD_Clr(void)
|
{
|
FLS->ISR = FLS_ISR_ERD_Msk;
|
}
|
|
FlagStatus FLS_ISR_ERD_Chk(void)
|
{
|
if (FLS->ISR & FLS_ISR_ERD_Msk)
|
{
|
return SET;
|
}
|
else
|
{
|
return RESET;
|
}
|
}
|
|
|
void FLS_Deinit(void)
|
{
|
//FLS->RDCR = 0x00000000;
|
//FLS->PFCR = 0x00000000;
|
//FLS->OPTBR = 0x00000105;
|
//FLS->EPCR = 0x00000000;
|
//FLS->KEY = 0x00000000;
|
//FLS->IER = 0x00000000;
|
//FLS->ISR = 0x00000000;
|
}
|
|
/******END OF FILE****/
|