TM4C123G开发板学习记录(八)存储和安全管理(下)

3.3 MPU例子分析

例子在TivaWare安装目录下,examples\boards\ek-tm4c123gxl\mpu_fault,支持多种开发环境,CCS,Keil uVision,GCC等。

This example application demonstrates the use of the MPU to protect a region of memory from access,

and to generate a memory management fault when there is an access violation.

开始之前,建议阅读datasheet2.4节memory model,对memory map有个大概了解,

Table 2-4. Memory Map

3.3.1调用ROM_MPURegionSet()

代码中共设置6个区域,我们以第一个为例,参考SW-TM4C-DRL-UG-2.1.4.178.pdf 19.2.2.9 MPURegionSet

#define FLASH_BASE              0x00000000  // FLASH memory in hw_memmap.h

ROM_MPURegionSet(0,  //配置区域0 (第一个)

                     FLASH_BASE,   //它的起始地址

                     MPU_RGN_SIZE_16K | MPU_RGN_PERM_EXEC |     //大小16K,可执行

                     MPU_RGN_PERM_PRV_RO_USR_RO |    //特权和非特权都是只读

                     MPU_SUB_RGN_DISABLE_7 |    //禁用子区域7(其实是第八个,最末尾,因为子区域0-7)

                     MPU_RGN_ENABLE);   //开启

结果如下

uVision5 debug core peripherals

参考下表解读字段含义

 

3.3.2 清状态寄存器及开中断

//清除NVIC fault status register

    g_ui32FaultStatus = HWREG(NVIC_FAULT_STAT);

    HWREG(NVIC_FAULT_STAT) = g_ui32FaultStatus;

//见hw_int.h,NVIC开MPU错误中断

    ROM_IntEnable(FAULT_MPU);

//MPU生效

    ROM_MPUEnable(MPU_CONFIG_HARDFLT_NMI);

3.3.3 测试中断ISR

// MPU Fault ISR

void

MPUFaultHandler(void)

{

    g_ui32MMAR = HWREG(NVIC_MM_ADDR);//MMAR寄存器获得错误地址

    g_ui32FaultStatus = HWREG(NVIC_FAULT_STAT);//错误状态寄存器内容,

    HWREG(NVIC_FAULT_STAT) = g_ui32FaultStatus; //然后清除

    g_ui32MPUFaultCount++;

    ROM_MPUDisable();

}

....

    g_ui32MPUFaultCount = 0;

    HWREG(0x100) = 0x12345678;//故意向第一个可执行区域写入,造成MPU Fault

 

//检查中断返回,获得预期值

    if((g_ui32MPUFaultCount == 1) && (g_ui32FaultStatus == 0x82) &&

       (g_ui32MMAR == 0x100))

    {

        UARTprintf(" OK\n");

    }

    else

    {

        bFail = 1;

        UARTprintf("NOK\n");

    }

解读g_ui32FaultStatus == 0x82 ,bit7==1 MMFA寄存器有效, bit1==1 访问违例