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

[复制链接]
1056|0
 楼主| lzh12a3nf 发表于 2023-9-21 19:43 | 显示全部楼层 |阅读模式
本帖最后由 lzh12a3nf 于 2023-9-25 18:06 编辑

#申请原创#@21小跑堂
1、前言
    今日周末放假在家,但思绪来潮想调试程序,苦于没有带开发板回家。但在Keil中发现了可以进行模拟调试,同时,手上刚好收到了极海新出的APM32F411开发板,因此,此次以该系列开发板的工程,进行一次模拟调试记录。

2、APM32F411模拟调试配置
    配置软件模拟调试,根据以往的经验,我仅配置Option for Target->Debug ->Use Simulator,如下图所示:
软件模拟调试图1.png


    配置完成后,我便直接进入Debug模式下进行软件模拟调试,但会发下如下图问题:

软件模拟调试图2.png

    图中显示错误信息,error 65: access violation at 0x40023800 : no 'read' permission 等,同时,点击Peripherals->System viewer -> RCM,查看寄存器信息是否进行置位时,发现每执行一步系统初始化函数后,RCM寄存器不会进行相应的置位操作。

3、定位问题
    根据图上信息,首先我在官网找到了第一个关于这个问题的回答,链接:https://developer.arm.com/documentation/ka002225/latest。如下所示:
    软件模拟调试图3.png
    文中提示,当应用程序在片上外围设备进行访问时,会发生这个错误。在过去,调试器用于为片上外围设备提供模拟,但MDK5不在提供此功能吗?接着,后文提示,现在许多设备不能在片上进行模拟外围设备,如:Cortex-M4等,但一些较旧的设备,可以通过修改Option for Target-> Debug -> CPU DLL and Parameter对话框下内容进行访问调试,并且给出了这些设备模拟外围设备的信息,如F1系列MCU,但没有看到F4系列MCU,因此,继续定位问题。

    接着,找到了第二个关于这个问题的回答,链接:https://developer.arm.com/documentation/ka004447/latest。如下所示:
软件模拟调试图4.png
    文中提示,当尝试写入变量或者内存地址时,调试器会发出如下错误,并且当指定了这个内存区域时,仍可能收到这个错误。同时,列举了其他版本可能出现的错误信息。之后,往下翻转,查找到相关三种解决方法。


3.1、Use the Memory Map Dialog

软件模拟调试图5.png

    使用Memory Map框时,当程序在进行加载时会映射所有地址范围。但在大多数情况下,不需要映射其他地址范围。只有在没有显式变量声明的情况下访问的内存区域才需要映射。当使用这个方法来验证程序是否访问无效区域时,可以通过执行读取、写入等方法。

3.2、Use the MAP Command in the Command Window
软件模拟调试图4.png
    信息提示:命令窗口显示常规调试信息,并允许输入调试命令和调试函数以与程序交互。通过点击View->Command窗口,并且在命令提示下,输入信息,如下:
  1. MAP  C:0xF800, C:0xF8FF  READ WRITE  // allow R/W access to IO space

3.3、Use a Debug Initialization File
软件模拟调试图5.png

    第三种方法提示,任何内存映射更改都可能在下一次调试会话中丢失。找到正确的内存后,将所需的MAP命令放入调试器INI文件中。并且根据如下MAP命令的定义,可以编写一个INI文件,并放在Initialization File中,如下:

  1. MAP startAddr, endAddr
  2. READ WRITE EXEC VNM        
  3. 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.
  1. MAP  0x40000000, 0x4000003F  READ WRITE EXEC
  2. // allow code execution for interrupt vector fetch

4、解决方法
     根据上面三种方法,我选择了第三种方法,通过Option for Target -> Debug -> Initialization file 添加ini文件,并且根据内存映射图和系统框图,结合MAP语句,编写映射的代码语句,如下。
软件模拟调试图8.png

  1. map 0x40000000, 0x400077FF read write         // APB1
  2. map 0x40010000, 0x40014BFF read write         // APB2
  3. map 0x40020000, 0x4007FFFF read write         // AHB1
  4. map 0x50000000, 0x50060FFF read write         // AHB2

5、测试工程

    本次工程以APM32F411的官网源码:https://geehy.com/uploads/tool/APM32F4xx_SDK_V1.4.zip中的GPIO_Toggle工程为例,如下图:

软件模拟调试图7.png


6、附件
     ini文件: debug.rar (165 Bytes, 下载次数: 3)

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




您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

37

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部