概述
3.3 MPU例子分析
例子在TivaWare安装目录下,examplesboardsek-tm4c123gxlmpu_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(" OKn");
}
else
{
bFail = 1;
UARTprintf("NOKn");
}
解读g_ui32FaultStatus == 0x82 ,bit7==1 MMFA寄存器有效, bit1==1 访问违例
最后
以上就是超帅小白菜为你收集整理的TM4C123G开发板学习记录(八)存储和安全管理(下)的全部内容,希望文章能够帮你解决TM4C123G开发板学习记录(八)存储和安全管理(下)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复