打印
[APM32F4]

基于APM32F411 软件模拟调试配置及问题解决

[复制链接]
585|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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、附件
     ini文件: debug.rar (165 Bytes)

本次内容分享到这,如有问题在评论区一起讨论,谢谢!




使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

37

帖子

0

粉丝