123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- /***************************************************************************//**
- * @file
- * @brief Memory protection unit (MPU) peripheral API
- * @author Energy Micro AS
- * @version 3.0.0
- *******************************************************************************
- * @section License
- * <b>(C) Copyright 2012 Energy Micro AS, http://www.energymicro.com</b>
- *******************************************************************************
- *
- * 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 <stdbool.h>
- #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 */
|