/***************************************************************************//** * @file * @brief Memory protection unit (MPU) peripheral API * @author Energy Micro AS * @version 3.0.0 ******************************************************************************* * @section License * (C) Copyright 2012 Energy Micro AS, http://www.energymicro.com ******************************************************************************* * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. * * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Energy Micro AS has no * obligation to support this Software. Energy Micro AS is providing the * Software "AS IS", with no express or implied warranties of any kind, * including, but not limited to, any implied warranties of merchantability * or fitness for any particular purpose or warranties against infringement * of any proprietary rights of a third party. * * Energy Micro AS will not be liable for any consequential, incidental, or * special damages, or any other relief, or for any claim by any third party, * arising from your use of this Software. * ******************************************************************************/ #ifndef __EM_MPU_H #define __EM_MPU_H #include "em_part.h" #if defined(__MPU_PRESENT) && (__MPU_PRESENT == 1) #include "em_assert.h" #include #ifdef __cplusplus extern "C" { #endif /***************************************************************************//** * @addtogroup EM_Library * @{ ******************************************************************************/ /***************************************************************************//** * @addtogroup MPU * @{ ******************************************************************************/ /** @anchor MPU_CTRL_PRIVDEFENA * Argument to MPU_enable(). Enables priviledged * access to default memory map. */ #define MPU_CTRL_PRIVDEFENA MPU_CTRL_PRIVDEFENA_Msk /** @anchor MPU_CTRL_HFNMIENA * Argument to MPU_enable(). Enables MPU during hard fault, * NMI, and FAULTMASK handlers. */ #define MPU_CTRL_HFNMIENA MPU_CTRL_HFNMIENA_Msk /******************************************************************************* ******************************** ENUMS ************************************ ******************************************************************************/ /** * Size of an MPU region. */ typedef enum { mpuRegionSize32b = 4, /**< 32 byte region size. */ mpuRegionSize64b = 5, /**< 64 byte region size. */ mpuRegionSize128b = 6, /**< 128 byte region size. */ mpuRegionSize256b = 7, /**< 256 byte region size. */ mpuRegionSize512b = 8, /**< 512 byte region size. */ mpuRegionSize1Kb = 9, /**< 1K byte region size. */ mpuRegionSize2Kb = 10, /**< 2K byte region size. */ mpuRegionSize4Kb = 11, /**< 4K byte region size. */ mpuRegionSize8Kb = 12, /**< 8K byte region size. */ mpuRegionSize16Kb = 13, /**< 16K byte region size. */ mpuRegionSize32Kb = 14, /**< 32K byte region size. */ mpuRegionSize64Kb = 15, /**< 64K byte region size. */ mpuRegionSize128Kb = 16, /**< 128K byte region size. */ mpuRegionSize256Kb = 17, /**< 256K byte region size. */ mpuRegionSize512Kb = 18, /**< 512K byte region size. */ mpuRegionSize1Mb = 19, /**< 1M byte region size. */ mpuRegionSize2Mb = 20, /**< 2M byte region size. */ mpuRegionSize4Mb = 21, /**< 4M byte region size. */ mpuRegionSize8Mb = 22, /**< 8M byte region size. */ mpuRegionSize16Mb = 23, /**< 16M byte region size. */ mpuRegionSize32Mb = 24, /**< 32M byte region size. */ mpuRegionSize64Mb = 25, /**< 64M byte region size. */ mpuRegionSize128Mb = 26, /**< 128M byte region size. */ mpuRegionSize256Mb = 27, /**< 256M byte region size. */ mpuRegionSize512Mb = 28, /**< 512M byte region size. */ mpuRegionSize1Gb = 29, /**< 1G byte region size. */ mpuRegionSize2Gb = 30, /**< 2G byte region size. */ mpuRegionSize4Gb = 31 /**< 4G byte region size. */ } MPU_RegionSize_TypeDef; /** * MPU region access permission attributes. */ typedef enum { mpuRegionNoAccess = 0, /**< No access what so ever. */ mpuRegionApPRw = 1, /**< Priviledged state R/W only. */ mpuRegionApPRwURo = 2, /**< Priviledged state R/W, User state R only. */ mpuRegionApFullAccess = 3, /**< R/W in Priviledged and User state. */ mpuRegionApPRo = 5, /**< Priviledged R only. */ mpuRegionApPRo_URo = 6 /**< R only in Priviledged and User state. */ } MPU_RegionAp_TypeDef; /******************************************************************************* ******************************* STRUCTS *********************************** ******************************************************************************/ /** MPU Region init structure. */ typedef struct { bool regionEnable; /**< MPU region enable. */ uint8_t regionNo; /**< MPU region number. */ uint32_t baseAddress; /**< Region baseaddress. */ MPU_RegionSize_TypeDef size; /**< Memory region size. */ MPU_RegionAp_TypeDef accessPermission; /**< Memory access permissions. */ bool disableExec; /**< Disable execution. */ bool shareable; /**< Memory shareable attribute. */ bool cacheable; /**< Memory cacheable attribute. */ bool bufferable; /**< Memory bufferable attribute. */ uint8_t srd; /**< Memory subregion disable bits. */ uint8_t tex; /**< Memory type extension attributes. */ } MPU_RegionInit_TypeDef; /** Default configuration of MPU region init structure for flash memory. */ #define MPU_INIT_FLASH_DEFAULT \ { \ true, /* Enable MPU region. */ \ 0, /* MPU Region number. */ \ FLASH_MEM_BASE, /* Flash base address. */ \ mpuRegionSize1Mb, /* Size - Set to max. */ \ mpuRegionApFullAccess, /* Access permissions. */ \ false, /* Execution allowed. */ \ false, /* Not shareable. */ \ true, /* Cacheable. */ \ false, /* Not bufferable. */ \ 0, /* No subregions. */ \ 0 /* No TEX attributes. */ \ } /** Default configuration of MPU region init structure for sram memory. */ #define MPU_INIT_SRAM_DEFAULT \ { \ true, /* Enable MPU region. */ \ 1, /* MPU Region number. */ \ RAM_MEM_BASE, /* SRAM base address. */ \ mpuRegionSize128Kb, /* Size - Set to max. */ \ mpuRegionApFullAccess, /* Access permissions. */ \ false, /* Execution allowed. */ \ true, /* Shareable. */ \ true, /* Cacheable. */ \ false, /* Not bufferable. */ \ 0, /* No subregions. */ \ 0 /* No TEX attributes. */ \ } /** Default configuration of MPU region init structure for onchip peripherals.*/ #define MPU_INIT_PERIPHERAL_DEFAULT \ { \ true, /* Enable MPU region. */ \ 0, /* MPU Region number. */ \ 0, /* Region base address. */ \ mpuRegionSize32b, /* Size - Set to minimum */ \ mpuRegionApFullAccess, /* Access permissions. */ \ true, /* Execution not allowed. */ \ true, /* Shareable. */ \ false, /* Not cacheable. */ \ true, /* Bufferable. */ \ 0, /* No subregions. */ \ 0 /* No TEX attributes. */ \ } /******************************************************************************* ***************************** PROTOTYPES ********************************** ******************************************************************************/ void MPU_ConfigureRegion(const MPU_RegionInit_TypeDef *init); /***************************************************************************//** * @brief * Disable the MPU * @details * Disable MPU and MPU fault exceptions. ******************************************************************************/ __STATIC_INLINE void MPU_Disable(void) { SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; /* Disable fault exceptions */ MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; /* Disable the MPU */ } /***************************************************************************//** * @brief * Enable the MPU * @details * Enable MPU and MPU fault exceptions. * @param[in] flags * Use a logical OR of @ref MPU_CTRL_PRIVDEFENA and * @ref MPU_CTRL_HFNMIENA as needed. ******************************************************************************/ __STATIC_INLINE void MPU_Enable(uint32_t flags) { EFM_ASSERT(!(flags & ~(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk | MPU_CTRL_ENABLE_Msk))); MPU->CTRL = flags | MPU_CTRL_ENABLE_Msk; /* Enable the MPU */ SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; /* Enable fault exceptions */ } /** @} (end addtogroup MPU) */ /** @} (end addtogroup EM_Library) */ #ifdef __cplusplus } #endif #endif /* defined(__MPU_PRESENT) && (EBI_COUNT == 1) */ #endif /* __EM_MPU_H */