完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
MPU通过对存储空间设置区域属性,控制各个区域的读/写/执行等权限; MPU0_Handle结构体存储了对MPU存储区域设置参数,包括NMI是否使能,只读,是否可执行,以及区域的基址和顶端地址, 此段代码设定区域0x20001000~0x20002000存储空间不可执行的属性,然后在MPU设置前后执行同一段指令,可见在设定了MPU之后,执行触发内存管理中断: voidAPP_MPU_Test(void) { uint32_tlu32_TempValue; /* 写入汇编指令, 功能->两数相加 */ *(uint32_t*)(0x20001000)=0x9001B082; *(uint32_t*)(0x20001004)=0x98019100; *(uint32_t*)(0x20001008)=0x44089900; *(uint32_t*)(0x2000100C)=0x4770B002; lu32_TempValue=MATH_ADD(111,222); printfS("Math Result: %d \n",lu32_TempValue); MPU0_Handle.u32_HFNMIENA=MPU_HF_NMI_ENABLE; MPU0_Handle.u32_ReadWritePermission=MPU_READ_ONLY; MPU0_Handle.u32_ExecutePermission=MPU_EXECUTE_DISABLE; MPU0_Handle.u32_BaseAddr=0x20001000; MPU0_Handle.u32_LimitAddr=0x20002000; MPU_Config(MPU_REGION_0,&MPU0_Handle); lu32_TempValue=MATH_ADD(111,222);// execute permission disabled, should go to MemManage_Handler } 注:例程(ModulesDemo_Rev2.0.2)中的MPU例程代码,main.c有一个bug,板载CMSIS-DAP调试器连接的串口是UART2,而例程使用的是UART1输出,需要稍微改动 Uart1_Init() 函数: voidUart1_Init(uint32_tfu32_Baudrate) { Uart1_Handle.Instance=UART2; 执行效果如图: * 可以通过在Keil的Peripherals –> Core Peripherals –> Memory Protection Unit(MPU),在图形化设置界面,直观地设定各个区域的属性,如图: * 在反汇编可以看到写入的汇编指令,并在寄存器窗口可以看到执行结果:
voidAPP_MPU_Test(void) { uint32_tlu32_TempValue; /* 写入汇编指令, 功能->两数相加 */ *(uint32_t*)(0x20001000)=0x9001B082; *(uint32_t*)(0x20001004)=0x98019100; *(uint32_t*)(0x20001008)=0x44089900; *(uint32_t*)(0x2000100C)=0x4770B002; lu32_TempValue=MATH_ADD(111,222); printfS("Math Result: %d \n",lu32_TempValue); MPU0_Handle.u32_HFNMIENA=MPU_HF_NMI_ENABLE; MPU0_Handle.u32_ReadWritePermission=MPU_READ_ONLY; MPU0_Handle.u32_ExecutePermission=MPU_EXECUTE_DISABLE; MPU0_Handle.u32_BaseAddr=0x20001000; MPU0_Handle.u32_LimitAddr=0x20002000; MPU_Config(MPU_REGION_0,&MPU0_Handle); lu32_TempValue=MATH_ADD(111,222);// execute permission disabled, should go to MemManage_Handler }
注:例程(ModulesDemo_Rev2.0.2)中的MPU例程代码,main.c有一个bug,板载CMSIS-DAP调试器连接的串口是UART2,而例程使用的是UART1输出,需要稍微改动 Uart1_Init() 函数:
voidUart1_Init(uint32_tfu32_Baudrate) { Uart1_Handle.Instance=UART2;
* 可以通过在Keil的Peripherals –> Core Peripherals –> Memory Protection Unit(MPU),在图形化设置界面,直观地设定各个区域的属性,如图:
* 在反汇编可以看到写入的汇编指令,并在寄存器窗口可以看到执行结果:
代码按照EFlash的擦除、写(编程)、读取进行比较,验证擦除以及写入后的EFlash数据内容的正确性。 可以通过Keil的Memory窗口观察EFlash内容: 串口输出内容:
代码按照EFlash的擦除、写(编程)、读取进行比较,验证擦除以及写入后的EFlash数据内容的正确性。 可以通过Keil的Memory窗口观察EFlash内容:
串口输出内容:
只有小组成员才能发言,加入小组>>
14个成员聚集在这个小组
【上海航芯ACM32F403开发板首发试用】ACM32F403例程学习1——GPIO、EXTI例程
5146 浏览 0 评论
[经验] 上海航芯ACM32F403RET7外设SPI测试。点亮SPI LCD屏.驱动芯片ST7735.
7685 浏览 2 评论
【上海航芯ACM32F403开发板首发试用】UART2使用
【上海航芯ACM32F403开发板首发试用】新建工程
【上海航芯ACM32F403开发板首发试用】上海航芯ACM32F403开发板试用--高级定时器
2183浏览 0评论
398浏览 0评论
418浏览 0评论
电子发烧友网
电子发烧友论坛
查看 »
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 04:17 , Processed in 0.645102 second(s), Total 70, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com