Keil MDK 5 仿真STM32F4报错no ‘read‘ permission

news2024/12/23 5:23:48

问题描述

MDK软件模拟仿真提示没有读写权限,只能单步运行。error提示:

*** error 65: access violation at 0x40023C00 : no 'read' permission

关于Keil MDK 5 仿真STM32F4报错no ‘read’ permission的解决方法
µVision 调试器为所有 ARM7、ARM9、Cortex-M0/M0+、Cortex-M3 和 Cortex-M4 处理器内核提供完整的指令集仿真。然而,对于许多设备来说,模拟片上外设的行为是不可能的。

对于一些较旧的设备, Keil MDK 5仿真模拟仍然可用,像STM32F1系列。如果你仿真的芯片是F1系列,但还是报错,可以去配置一下Dialog DLL 和Parameter。但是要想仿真STMF4系列,单纯用Keil MDK 5仿真是不行的,还要买仿真器像ULINKpro。

这是官方给出的解决方法:
https://developer.arm.com/documentation/ka002225/latest

官方给的只有一些f1型号的,f4的没有

找到的一些解决方法:

[STM32] STM32F407软件仿真提示error 65: access violation at 0x40023C00 : no ‘read‘ permission

https://blog.csdn.net/kouxi1/article/details/123164766

方法一

修改工程配置选项中的debug选项卡,STM32F1系列芯片验证可以正常使用。F4系列芯片不能正常使用

在这里插入图片描述

 方法二

直接在调试页面修改map地址权限映射,正常修改后程序可正常运行。退出调试时需要重新设置,操作不方便。

调试页面下,在DEBUG选项卡下选择Memory Map 选项如下图:

在这里插入图片描述

可根据错误提示进行map地址映射添加,选中ReadWrite,然后点击Map Range

方法三

我是只用了这方式,然后就可以了,并没有去尝试其他的方式。使用ini的时候,编译后才会生效。

在工程配置选项中的debug选项卡,添加自定义的Initialization file。(推荐使用
工程文件中新建debug.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
map 0x60000000, 0xA0000FFF read write 	// AHB3
map 0xE0000000, 0xFFFFFFFF read write   // CORTEX-M4 internal peripherals

 在这里插入图片描述

 在这里插入图片描述

参考:

STM32F4 MDK5软件仿真 error : no 'read' permission
UVISION DEBUGGER: Simulation of Cortex-M Devices
UVISION DEBUGGER: Error 65: Access Violation

方法四

MDK软件不能模拟仿真STM32的问题解决方法-电子工程世界

MDK软件在模拟仿真时,不能很好地支持各种STM32系列芯片,目前对STM32F103系列芯片支持模拟仿真,但对于其他系列芯片不支持或只是部分支持。主要存在的问题是:PC和SP不能自动装载,存储器不能访问,中断服务程序不能执行或触发,外设寄存器不能修改或观察。要解决上述问题,必须通过相应的设置和相关的操作,才能完成模拟仿真。
1 模拟仿真的实现及PC和SP的自动装载
  在MDK软件中,只有部分STM32芯片支持模拟仿真(如STM32F103),大部分芯片都不支持模拟仿真。主要的问题是,当进入调试界面后,R15 (PC)的值为0x00000000,不能进行调试操作(如单步、全速等)。要能对STM32进行模拟仿真,必须使PC的值不能为0。通过分析STM32芯片的存储器结构可知,在存储器地址0x00000000处保存的是堆栈指针SP的值,程序加载时自动把该值送给SP,在存储器地址0x00000004处保存的是程序指针PC的值,程序加载时自动把该值送给PC,程序从该PC值取指令执行程序,而不是从地址0x00000000处执行程序。而STM32芯片的Flash程序存储器地址是从0x08000000处开始的,当进入模拟仿真时,MDK软件不能把Flash的地址送给PC和SP。可通过以下操作步骤完成PC和SP的自动装载。
①打开MDK自带的工程文件,如C:\Keil\ARM\Boards\ST\STM3240GEVAL\Blinky\Blinky.uvproj。
②单击“编译”工具栏上面的下拉菜单,选择“STM32F407 Flash”。
③单击,打开“Options”对话框,切换到“Output”选项卡,勾选“Debug Information”和“Browse Information”,用以产生调试信息。再切换到“Debug”选项卡,单击“Use Simulator”,选择模拟仿真,确保勾选“Load Application at Startup”,其他为默认设置。
④单击,编译程序,并保证编译成功。
⑤单击,开始调试,进入调试界面后,观察“Registers”寄存器选项卡中的R15 (PC)的值,如果值为0,则说明不能进行模拟仿真,“单步”调试等无效,须进行步骤⑥的操作,否则可不进行步骤⑥的操作。
⑥停止调试,再次单击,打开“Options”对话框,切换到“Target”选项卡,将IROM1的值[0x08000000,0x100000]修改为[0x0,0x100000],以使Flash的起始地址从0x0开始。单击重新编译程序,再次单击,开始调试,PC的值将不再为0,即可进入模拟仿真,“单步”调试等有效。
2 存储器的访问
  当进入模拟仿真界面后,按“全速”F5或“单步”F10调试键后,在“command”窗口中将会出现类似如下的错误提示:“***  error 65: access violation at 0x40023800 : no ′read′ permission”,意思是在地址0x40023800处访问违例,没有“读”的权限。地址0x40023800是外设寄存器地址。要使外设寄存器地址具有相应的“读”、“写”、“执行”权限,可在命令窗口中输入MAP命令(不区分大小写)。命令格式为:
  MAP 起始地址,结束地址 READ WRITE EXEC其中,READ表示“读”权限,WRITE表示“写”权限,EXEC表示“执行”权限,结束地址与起始地址的空间尺寸不超过128 MB,即不超过0x08000000字节。外设寄存器的存储空间分布较广,不可能在每次调试时都通过命令窗口输入MAP指令,可通过如下的操作步骤进行。
①新建一个文本文件,打开该文件,执行文件菜单命令“另存为”,在打开的“另存为”对话框中,文件名输入为initmap.ini,保存类型选择为“所有文件”,并保存。在文件中输入如下内容并保存:
map 0x40000000,0x47ffffffreadwrite
map 0x50000000,0x57ffffffreadwrite
map 0xa0000000,0xa7ffffffreadwrite
map 0xf0000000,0xf7f00000 readwrite
根据需要,可在该文件中输入包含所有外设寄存器的MAP命令,使所有外设寄存器都具有“读”、“写”权限。但注意映射空间不要超过0x08000000,否则调试时会提示错误:“***  error 129: MapMemmap size truncated to 128MB”。
②单击,打开“Options”对话框,切换到“Debug”,在“Initialization File”的右边单击,打开“选择仿真初始化文件”对话框,选择上一步保存的initmap.ini文件。单击“Edit”按扭,可打开文件再次修改。
3 中断服务程序的执行与触发
  当解决以上的两个问题后,可以进行模拟仿真调试。但这时中断服务程序不能执行,如系统定时中断程序;或者不能触发中断,如不能自动触发SPI中断程序等。由于已经把Flash存储器的起始地址调到了0x00000000处,所以也需要把中断向量偏移量地址设为0x00000000,即把SCB-﹥VTOR设为0。可通过如下方法解决。
①对于通过访问SCB-﹥VTOR寄存器来修改中断向量的,可通过“Edit”菜单命令中的“Find in Files”命令查找SCB-﹥VTOR,查找并修改宏定义FLASH_BASE的值为0X00000000。
②如果不能通过以上的方法修改SCB-﹥VTOR,可以在进入仿真界面后,执行中断程序前,选择“Peripherals”→“Core Peripherals”→“Nested Vectored Interrupt Controller”命令,打开中断向量对话框,修改VTO的值为0x00000000。当然也可以通过如下的方法完成对外设寄存器SCB-﹥VTOR的修改,使它的值为0x00000000:当进入仿真后,在主函数main()前设置一个断点,全速运行程序,程序在断点处暂停执行,通过下节介绍的方法把外设寄存器SCB-﹥VTOR添加到观察窗口1,修改SCB-﹥VTOR外设寄存器的值,使它的值为0x00000000即可。
③对于SysTick定时器,可以自动触发中断,并执行中断程序,但对于其他的中断则不能自动触发中断。可按如下方法操作:在中断程序中设一个断点,并“全速”运行程序,通过选择“Peripherals”→“Core Peripherals”→“Nested Vectored Interrupt Controller”命令,打开中断向量对话框,单击选择相应的中断,然后勾选Pending复选框,此时会自动执行相应的中断服务程序,并在断点处暂停执行程序。
4 外设寄存器的修改
  在模拟仿真时,一般要对外设寄存器进行修改,有些外设寄存器可直接修改,有些外设寄存器不能直接修改,如只读位不能直接修改。要实现对外设寄存器的修改,可通过如下的方法进行操作。
①对于要修改的寄存器,可通过鼠标选择外设寄存器,如选择RCC-﹥CR,然后再鼠标右键,弹出右键菜单,执行“Add‘RCC-﹥CR ’to…”→“Watch 1”菜单命令,把RCC-﹥CR外设寄存器添加到观察窗口1中,如下所示。
  此时可在编辑框中修改该外设寄存器的值。当然也可在观察窗口中,直接输入外设寄存器的名称“RCC-﹥CR”,但此种方法对某些芯片会失效。
②用以上方法也不能完成外设寄存器的修改时,可通过如下方法完成修改。停止仿真,单击,打开“Options”对话框,切换到“Target”选项卡,确保特殊功能寄存器(sfr)文件已被添加。然后单击的下拉箭头,选择并添加所要观察的外设,如RCC等,可添加观察多个外设。单击添加的外设寄存器,可在下方显示该外设寄存器的存储器地址,如RCC-﹥CR外设寄存器的地址为0x40023800。最后再选择“ View”→“Memory Windows”→“Memory 1”打开存储器观察窗口,在地址栏中输入地址“0x40023800”,按回车键确认输入,在数据区双击数据可直接修改。STM32的存储器采用小端模式,即低地址存放数据的低位,高地址存放数据的高位。在存储器窗口中,可通过右键修改显示方式。
结语
  目前最新的MDK版本也未能解决在模拟仿真时出现的上述问题,通过本文介绍的方法则可以解决,这对于学习STM32,以及使用MDK软件都有一定的帮助。以上介绍的方法是一个全面的描述,不是所有的芯片都需要通过以上步骤来完成,有的只需要部分操作即可完成。

Keil V5仿真出现*** error 65: access violation at 0x40021000 : no ‘read‘ permission 解决办法_进击的蜗牛_QJ的博客-CSDN博客

其他相关链接   KEIL 调试的 ini 文件有什么用?KEIL 调试的 ini 文件有什么用? - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/713820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎样在文章末尾添加尾注(将尾注的数字变为方括号加数字)

在进行文章编写或者需要添加注解时,需要进行尾注的添加,下面将详细说明如何进行尾注的添加 操作 首先打开需要进行添加尾注的文档,将光标移动至需要进行添加尾注的文字后。 紧接着在上方工具栏中,选择引用,在引用页…

4.FreeRTOS系统配置文件详解(FreeRTOSConfig.h)

目录 一、基础配置选项 二、内存分配相关定义 三、钩子函数的相关定义 四、运行时间和任务状态统计相关定义 五、软件定时器相关配置 FreeRTOSConfig.h配置文件的作用: 对FreeRTOS进行功能配合和裁剪,以及API函数的使能 对于FreeRTOS配置文件主要…

如果制作投票选举投票制作制作一个投票在线制作投票

用户在使用微信投票的时候,需要功能齐全,又快捷方便的投票小程序。 而“活动星投票”这款软件使用非常的方便,用户可以随时使用手机微信小程序获得线上投票服务,很多用户都很喜欢“活动星投票”这款软件。 “活动星投票”小程序在…

CORS如何实现跨域(前端+后端代码实例讲解)

书接上回,上一篇文章讲解了用 jsonp 来解决跨域问题,这篇文章讲解另外一种方法也可以解决跨域问题,那就是CORS(跨源资源共享)。 什么是CORS? 下面是官方的解释:跨源资源共享(CORS&a…

刚去了家新公司,发现个个都是卷王 , 想离职了。。

个个都说想躺平了,可是有一说一,该卷的还是卷。这不,前段时间我们公司来了个00后,才工作一年,跳槽到我们公司起薪15K,都快接近我了。后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。…

性能测试什么时候开始?性能测试流程介绍

目录 性能测试什么时候开始? 一、制定性能测试目标 二、性能测试场景获取 三、性能测试数据确定 四、性能测试用例设计 五、性能测试环境准备与搭建 六、做脚本 七、跑场景 八、做监控 九、分析调优 十、回归测试 十一、出图写报告 总结: 性能测试什么…

STM32——建工程

文章目录 一、建工程步骤1. 创建一个工程文件2. 里面创建四个文件3. Lib:存放标准库的.c和.h文件,其中inc放置.h文件,src放置.c文件4. Startup中存放驱动文件5.User文件中包含以下路径以下文件6.创建工程Project 一、建工程步骤 以STM32F10X…

若依不分离,弹层自定义按钮

记录下遇到的两种情况 第一种:点击按钮,打开第三方链接去支付,因为只需要显示一个关闭按钮 代码: // 表格操作列 {title: 操作,align: center,formatter: function (value, row, index) {var actions [];if (row.status1) {acti…

NAMD分子动力学模拟在生物及材料计算中的应用专题

第一天 时间 :第一天上午 内容:一:分子动力学相关软件及Linux入门 目标:了解NAMD软件,掌握NAMD安装环境,了解Linux语言 二:VMD可视化软件的安装和使用 三:研究对象模型获取,构建以及优化 主要…

7-WebApis-5

Web APIs - 5 目标: 能够利用JS操作浏览器,具备利用本地存储实现学生就业表的能力 BOM操作综合案例 js组成 JavaScript的组成 ECMAScript: 规定了js基础语法核心知识。比如:变量、分支语句、循环语句、对象等等 Web APIs : DOM 文档对象模型&#xff…

LeetCode 445.两数相加 II

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。 https://leetcode.cn/problems/add-two-numbers-ii/description/ c…

Elasticsearch全⽂检索

以下说明&#xff1a;其中比喻都是以mysql为模板进行比较说明 一.lucene 1.jar包环境准备 <!-- 引入Lucene核心包及分词器包 --><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-core</artifactId><version>…

82、基于stm32单片机音乐喷泉设计播放器频谱彩灯系统设计(程序+原理图+参考论文+开题报告+任务书+设计资料+元器件清单等)

摘 要 随着人们生活水平的提高和建立绿色城市的向往&#xff0c;音乐喷泉以其独特的魅力和特殊的功能&#xff0c;愈来愈成为休闲娱乐产业中的一项重要产品,音乐喷泉的兴建也越来越多。 根据目前音乐喷泉的发展现状&#xff0c;介绍了一个以STM32单片机为核心的小型音乐喷泉控…

Fiddler过滤器 Filters 详解

目录 前言&#xff1a; 一、 Hosts 过滤 &#xff08;较常用&#xff09; 二、Client Process 过滤&#xff08;客户端进程过滤&#xff0c;通过配置只过滤/不过滤哪些进程的请求。用的不多&#xff09; 三、Request Headers &#xff08;根据请求头信息进行过滤。常用&…

wireshark抓包工具实战

目录 参考一、关于Wireshark二、下载及安装三、基本概念每层类型Ethernet以太网层&#xff08;MAC地址&#xff09;协议目的地址 Internet网络层协议报文 Transmission传输层协议 三、tcp抓包三次握手连接四次握手断开http协议请求协议包应答协议包文件类型 参考 网络抓包工具…

Docker容器技术 详解!!!

目录 一、概述 &#xff08;一&#xff09;docker介绍 &#xff08;二&#xff09;为什么使用Docker &#xff08;三&#xff09;docker优势 1、运行环境的一致性&#xff1a; 2、更快速地启动部署&#xff1a; 3、更好的隔离性&#xff1a; 4、弹性伸缩、快速扩展&…

FreeRTOS_任务切换

目录 1. RendSV 异常 2. FreeRTOS 任务切换场合 2.1 执行系统调用 2.2 系统滴答定时器&#xff08;SysTick&#xff09;中断 3. PendSV 中断服务函数 4. 查找下一个要运行的任务 4.1 通用方法 4.2 硬件方法 5. FreeRTOS 的时间片调度 6. 时间片调度实验 6.1 实验程序…

Pushgetway安装和使用

1、Pushgetway安装和使用 1.1 Pushgateway是什么 pushgateway 是另一种数据采集的方式&#xff0c;采用被动推送来获取监控数据的prometheus插件&#xff0c;它可以单独运行在 任何节点上&#xff0c;并不一定要运行在被监控的客户端。 首先通过用户自定义编写的脚本把需要监…

ClickHouse浅谈

文章目录 前置知识什么是OLAP与OLTP行式数据库与列式数据库什么是行式和列式&#xff1f;行式和列式的优缺点 ClickHouse什么是clickhouse&#xff1f;clickhouse的使用架构clickhouse的优点和缺点clickhouse的功能特性计算层服务层向量化引擎 clickhouse的使用案例与其他OLAP相…

如何打开远程电脑的任务管理器?

关于任务管理器 任务管理器可以显示远程计算机后台运行的进程和应用程序及其使用状态。通过任务管理器提供的信息&#xff0c;您可以了解是否有程序或进程占用过多的CPU和内存&#xff0c;然后您可以选择结束应用程序或结束进程以提高远程电脑的运行速度。 如何访问远程电脑上…