本帖最后由 lzh12a3nf 于 2023-9-25 18:06 编辑
#申请原创#@21小跑堂
1、前言
今日周末放假在家,但思绪来潮想调试程序,苦于没有带开发板回家。但在Keil中发现了可以进行模拟调试,同时,手上刚好收到了极海新出的APM32F411开发板,因此,此次以该系列开发板的工程,进行一次模拟调试记录。
2、APM32F411模拟调试配置
配置软件模拟调试,根据以往的经验,我仅配置Option for Target->Debug ->Use Simulator,如下图所示:
配置完成后,我便直接进入Debug模式下进行软件模拟调试,但会发下如下图问题:
图中显示错误信息,error 65: access violation at 0x40023800 : no 'read' permission 等,同时,点击Peripherals->System viewer -> RCM,查看寄存器信息是否进行置位时,发现每执行一步系统初始化函数后,RCM寄存器不会进行相应的置位操作。
3、定位问题 根据图上信息,首先我在官网找到了第一个关于这个问题的回答,链接:https://developer.arm.com/documentation/ka002225/latest。如下所示: 文中提示,当应用程序在片上外围设备进行访问时,会发生这个错误。在过去,调试器用于为片上外围设备提供模拟,但MDK5不在提供此功能吗?接着,后文提示,现在许多设备不能在片上进行模拟外围设备,如:Cortex-M4等,但一些较旧的设备,可以通过修改Option for Target-> Debug -> CPU DLL and Parameter对话框下内容进行访问调试,并且给出了这些设备模拟外围设备的信息,如F1系列MCU,但没有看到F4系列MCU,因此,继续定位问题。
接着,找到了第二个关于这个问题的回答,链接:https://developer.arm.com/documentation/ka004447/latest。如下所示:
文中提示,当尝试写入变量或者内存地址时,调试器会发出如下错误,并且当指定了这个内存区域时,仍可能收到这个错误。同时,列举了其他版本可能出现的错误信息。之后,往下翻转,查找到相关三种解决方法。
3.1、Use the Memory Map Dialog
使用Memory Map框时,当程序在进行加载时会映射所有地址范围。但在大多数情况下,不需要映射其他地址范围。只有在没有显式变量声明的情况下访问的内存区域才需要映射。当使用这个方法来验证程序是否访问无效区域时,可以通过执行读取、写入等方法。
3.2、Use the MAP Command in the Command Window 信息提示:命令窗口显示常规调试信息,并允许输入调试命令和调试函数以与程序交互。通过点击View->Command窗口,并且在命令提示下,输入信息,如下: MAP C:0xF800, C:0xF8FF READ WRITE // allow R/W access to IO space
3.3、Use a Debug Initialization File
第三种方法提示,任何内存映射更改都可能在下一次调试会话中丢失。找到正确的内存后,将所需的MAP命令放入调试器INI文件中。并且根据如下MAP命令的定义,可以编写一个INI文件,并放在Initialization File中,如下:
MAP startAddr, endAddr
READ WRITE EXEC VNM
Maps the specified memory range, from startAddr to endAddr, and defines the access rights (read, write, and execution). The memory map supports 1-byte granularity.
MAP 0x40000000, 0x4000003F READ WRITE EXEC
// allow code execution for interrupt vector fetch
4、解决方法 根据上面三种方法,我选择了第三种方法,通过Option for Target -> Debug -> Initialization file 添加ini文件,并且根据内存映射图和系统框图,结合MAP语句,编写映射的代码语句,如下。
map 0x40000000, 0x400077FF read write // APB1
map 0x40010000, 0x40014BFF read write // APB2
map 0x40020000, 0x4007FFFF read write // AHB1
map 0x50000000, 0x50060FFF read write // AHB2
5、测试工程
本次工程以APM32F411的官网源码:https://geehy.com/uploads/tool/APM32F4xx_SDK_V1.4.zip中的GPIO_Toggle工程为例,如下图:
6、附件
本次内容分享到这,如有问题在评论区一起讨论,谢谢!
|