/** ****************************************************************************** * @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****/