一、MDK5编译例程 二、串口下载程序
三、DAP下载程序
四、DAP调试程序
五、总结
一、MDK5编译例程
在嵌入式系统中,存储器通常分为Flash和SRAM,而数据类型的存储位置和特性也因此而有所不同。以下是常见的数据类型及其在Flash和SRAM中的存储情况:
Code(代码):
存储位置: Flash说明: 代码段存储程序的执行指令,通常包括可执行程序的机器指令。特性: 只读,不可修改。程序在运行时从Flash中读取指令执行。 RO-Data(只读数据):
存储位置: Flash说明: 只读数据,通常是由 const
修饰的常量数据。特性: 只读,不可修改。这些数据在程序运行期间不会被修改。 RW-Data(可读可写数据):
存储位置: Flash(用于存储初始值)和SRAM(运行时修改)说明: 初值为非0的可读可写数据。包括全局变量等。特性: 具有初始值,可以在程序运行时被修改。初始值存储在Flash中,而运行时修改的数据存储在SRAM中。 ZI-Data(初值为0的可读可写数据):
存储位置: SRAM说明: 初值为0的可读可写数据。通常是未显式初始化的全局变量,它们在程序开始执行时被初始化为0。特性: 具有初始值(0),可以在程序运行时被修改。这些数据只存在于SRAM中。
在典型的嵌入式系统中,Flash用于存储程序的代码和只读数据,而SRAM用于存储可读可写数据。这种划分有助于有效地利用系统资源。请注意,具体的存储器分配可能会受到编译器、链接器和目标硬件平台的影响。
二、串口下载程序
2.1、串口下载程序须知
M3、M4、M7开发板支持串口下载程序, 但是ATK-XISP.exe软件只支持下载到内部FLASH STM32的ISP下载,常用串口1下载程序 因为使用USB虚拟串口,所以事先得安装CH340 USB虚拟串口驱动(搭建开发环境视频)
通过串口进行嵌入式系统的程序烧录和调试
串口下载程序是通过串口进行嵌入式系统的程序烧录和调试的一种常见方式。
下面是关于串口下载程序的一些建议和须知:
支持内部FLASH的开发板和下载工具:
串口下载通常涉及将程序烧录到目标设备的内部FLASH存储器中。确保你的开发板支持通过串口下载程序,并且你使用的下载工具(如ATK-XISP.exe)也支持将程序下载到内部FLASH。 选择正确的串口:
对于STM32的ISP(In-System Programming)下载,常用串口1(通常是USART1)进行程序下载。确保在你的应用程序中正确配置了串口,并将其连接到下载工具。 USB虚拟串口驱动的安装:
如果使用USB虚拟串口进行通信,如CH340 USB虚拟串口芯片,确保在使用之前先安装相应的驱动程序。这是因为计算机通常需要正确的驱动程序来与USB串口设备进行通信。确保你的计算机上已经安装了CH340 USB虚拟串口驱动。 了解下载工具的使用方法:
下载工具(如ATK-XISP.exe)通常有特定的使用方法,可能需要选择正确的串口、波特率等参数。详细了解下载工具的使用手册或文档,以确保正确地配置和操作。 确保目标设备处于下载模式:
在进行串口下载之前,确保目标设备处于可以接受程序下载的状态。有些开发板可能需要将设备连接到下载模式或引脚翻转按钮,确保设备处于可以接收程序的状态。 观察下载过程中的提示和错误:
在进行串口下载时,注意观察下载工具的提示信息。如果出现错误,查看错误信息以了解可能的问题,如串口连接问题、波特率不匹配等。 备份重要数据:
在进行程序下载之前,特别是对于对设备进行擦写操作的情况,建议在下载之前备份目标设备上的重要数据,以防止意外数据丢失。
确保在进行串口下载程序之前详细了解相关设备和工具的使用方法,以提高操作的准确性和成功率。
2.2、串口下载硬件连接
2.3、配置下载工具 (ATK-XISP.exe)
ATK-XISP.exe下载工具配置内容如下:
2.4、STM32启动模式(M3和M4)
ISP下载程序
ISP下载程序一般步骤: 1、BOOT0接高电平,BOOT1接低电平 2、按复位键
ISP(In-System Programming)下载程序通常是通过设备内部的Bootloader来实现的,它允许通过特定的接口(如串口)向目标设备烧录程序。下面是一般的ISP下载程序的步骤:
一般步骤:
设置BOOT0和BOOT1引脚:
将目标设备的BOOT0引脚设置为高电平,BOOT1引脚设置为低电平。这通常是通过外部硬件连接或在目标设备上的跳线帽来实现的。 按复位键:
按下目标设备上的复位按钮,确保设备处于复位状态。这有助于确保设备在启动时进入Bootloader模式。 连接下载工具:
连接ISP下载工具(例如串口下载工具)到目标设备的下载接口(通常是UART、USB等),确保正确的连接。 启动下载工具:
启动ISP下载工具,如ATK-XISP.exe等。 选择目标设备和端口:
在下载工具中选择目标设备型号,并设置正确的串口或其他下载接口。 选择烧录文件:
选择要烧录到目标设备的程序文件。这通常是一个二进制文件(.bin)或其他格式的固件文件。 设置下载参数:
设置下载参数,例如波特率、数据位、停止位等,以确保下载工具和目标设备之间的通信正常。 开始下载:
确认所有设置正确后,启动下载过程。下载工具会尝试连接到目标设备的Bootloader,并将程序文件烧录到设备内部的Flash中。 观察下载过程:
观察下载工具的输出信息,以检查下载过程是否成功。如果有错误,查看错误信息以了解问题的原因。 复位设备:
当下载完成后,按下设备上的复位按钮,将设备从Bootloader模式切换回正常模式。这样,设备将以新烧录的程序启动。
这是一般的ISP下载程序的步骤,具体步骤可能会因不同的目标设备、下载工具和Bootloader而有所不同。确保参考目标设备和下载工具的文档以获取详细的操作说明。
程序执行
程序执行一般步骤: 1、BOOT0接低电平,BOOT1接任意 2、按复位键
程序执行的一般步骤通常包括将目标设备从复位状态切换到正常运行状态。以下是一般的程序执行步骤:
一般步骤:
设置BOOT0和BOOT1引脚:
将目标设备的BOOT0引脚设置为低电平,BOOT1引脚设置为任意电平。这通常是通过外部硬件连接或在目标设备上的跳线帽来实现的。 按复位键:
按下目标设备上的复位按钮,确保设备处于复位状态。这有助于确保设备在启动时从正确的地址开始执行程序。 释放复位:
释放复位按钮,允许目标设备跳出复位状态。设备开始执行存储在其Flash中的程序。 程序执行:
目标设备开始执行存储在Flash中的程序。这可能包括初始化步骤、配置外设、执行主循环等,具体取决于程序的设计和功能。 观察执行过程:
观察目标设备的执行过程,检查是否有错误或异常情况。这可以通过连接调试器、观察输出、使用日志等方式来进行。 与外设交互:
根据程序的设计,目标设备可能与各种外设进行交互,读取传感器数据、驱动执行器等。 监测系统状态:
在程序执行的过程中,可以监测系统的状态,包括内存使用情况、CPU占用率、外设状态等,以确保系统正常运行。 应对错误和异常:
如果在执行过程中发现错误或异常情况,系统应该能够适当地应对,可能是通过错误处理机制、记录错误日志等方式。 定期维护和更新:
对于长时间运行的系统,可能需要定期进行维护和更新,以确保软件和硬件的正常运行。这可能包括固件更新、系统配置更改等。
总的来说,程序执行的步骤会根据具体的目标设备、应用程序和设计的要求而有所不同。上述步骤提供了一般的执行流程,但具体情况可能会因设备的用途和设计而有所不同。
串口一键下载电路原理
不使用一键下载的CH340C参考电路
三、DAP下载程序
3.1、DAP下载硬件连接
3.2、在MDK上配置DAP
Keil中的工程配置选项说明
Options for Target 目标选项
Options for Target 目标选项 > Debug 调试
Load Application at Startup 启动时加载应用程序
Run to main 运行到主程序
Debug 调试 > Settings 设置
Options for Target 目标选项 > Utilities 公共选项
不同开发板的下载算法有所不同
Options for Target 目标选项 > Utilities 公共选项 > Settings 设置 > Flash Download 闪存下载
CMSIS-DAP Cortex-M Target Driver Setup:CMSIS-DAP Cortex-M 目标驱动程序设置
Flash Download:闪存下载
Download Function:下载功能
Erase Full Chip:擦除全芯片 Program:程序 Erase Sectors:擦除扇区 Verify:核实 Do not Erase:请勿擦除 Reset and Run:重置并运行 RAM for Algorithm:算法RAM Programming Algorithm:编程算法
Build构建 F7、Download下载 F8
“Build” 和 “Download” 是在嵌入式系统开发中常用的两个步骤,通常与集成开发环境(IDE)一起使用。以下是这两个步骤的一般含义:
Build(构建):
“Build” 操作是指编译源代码并生成可执行文件或固件的过程。在嵌入式系统中,这通常包括将高级编程语言(如C、C++)的源代码翻译成目标平台上的机器代码。构建过程还可能包括链接阶段,其中各个模块的目标代码被组合成一个可执行文件或固件。构建的输出通常是二进制文件(如.hex、.bin等),该文件包含了将被烧录到目标设备上的程序。 Download(下载):
“Download” 操作是指将已经构建好的可执行文件或固件烧录到目标设备上的过程。这通常涉及到使用烧录工具、调试器或下载器,通过连接到目标设备的下载接口(如串口、SWD等),将构建好的程序文件传输到目标设备的存储器中(如Flash)。下载操作通常包括设定下载参数(如波特率、目标设备类型等)以及观察下载过程的输出信息。
在嵌入式开发中,这两个步骤通常会在开发环境(如Keil、IAR、STM32CubeIDE等)中执行。通常的工作流程是先进行构建以生成程序文件,然后通过下载将程序文件烧录到目标设备上。这使得开发者能够在目标设备上测试和调试他们的应用程序。
请注意,具体的操作细节可能因使用的开发环境和目标设备而有所不同。建议查阅相关的开发环境文档和目标设备手册以获取详细的操作说明。
四、DAP调试程序
4.1、 JTAG/SWD调试原理概述
JTAG(Joint Test Action Group)和SWD(Serial Wire Debug)是用于嵌入式系统调试的两种常见的调试接口。
JTAG调试原理概述:
连接:
JTAG是一种用于调试和测试的标准接口,通过将多个设备连接到一个链路上。每个设备都有一个JTAG接口,允许在整个链路上进行调试和测试。 链路结构:
JTAG链路由一个主设备(通常是调试器)和多个目标设备组成。每个目标设备都通过JTAG接口与链路连接。 调试器:
调试器通过JTAG链路连接到目标设备。它可以控制链路上的各个设备,并执行调试操作,如停止、单步执行等。 停止和状态查询:
在调试过程中,调试器可以通过JTAG链路停止目标设备的执行。停止后,可以查询目标设备的内部状态,包括寄存器值、存储器内容等。 断点:
JTAG支持硬件断点和软件断点。通过在目标设备上设置断点,可以在特定条件下停止程序的执行。 数据访问:
JTAG还允许对目标设备的存储器进行读写操作。这使得可以查看和修改目标设备的内存内容。 恢复执行:
在完成调试操作后,调试器可以通过JTAG链路恢复目标设备的执行,使程序继续运行。
SWD调试原理概述:
简化连接:
SWD是一种更为简化的调试接口,用于在硬件资源受限的系统中进行调试。相较于JTAG,SWD只需要两根线(SWDIO和SWCLK)。 链路结构:
SWD链路包括一个调试器和一个目标设备。SWD通过单一线路上的两个引脚进行通信。 停止和状态查询:
类似于JTAG,SWD也可以在目标设备上停止程序的执行,并查询内部状态。 断点:
SWD支持断点功能,允许在特定条件下停止程序的执行。 数据访问:
通过SWD,可以对目标设备的存储器进行读写操作,查看和修改内存内容。 恢复执行:
完成调试操作后,可以通过SWD恢复目标设备的执行。
总体而言,JTAG和SWD都是用于嵌入式系统调试的强大接口。SWD在连接复杂性和硬件资源占用上相对更为轻量,适用于一些资源受限的系统。选择使用哪种接口通常取决于目标设备的支持和具体的调试需求。
4.2、 在MDK配置DAP仿真调试
Keil中的工程配置选项说明 详细的看上面 3.2、在MDK上配置DAP
4.3、 基础执行控制按钮介绍
断点
Insert/Remove Breakpoint:插入/删除断点 Enable/Disable Breakpoint:启用/禁用断点 Didsable All Breakpoints in current Target:禁用当前目标中的所有断点 Kill All Breakpoints in Current Target:杀死当前目标中的所有断点 Keil μVision是一种流行的嵌入式系统开发工具,用于编写、编译和调试嵌入式程序。在Keil μVision中,你可以使用断点来暂停程序执行,观察变量的值,以及进行调试。
在Keil μVision中设置断点的步骤:
在源代码中选择断点位置:
打开你的源代码文件,通过点击左侧的行号来选择你想要设置断点的位置。通常,你可以通过双击行号或者在行号左侧点击鼠标右键来选择设置断点。 使用快捷键设置断点:
在Keil μVision中,你也可以使用快捷键来设置断点。通常情况下,F9
键是用于在光标所在行设置断点的快捷键。 在菜单栏中设置断点:
你还可以通过菜单栏中的 “Debug” 或者 “View” 选项来设置断点。在菜单中选择 “Debug” -> “Toggle Breakpoint” 或 “View” -> “Toggle Breakpoint” 来设置或取消断点。 观察断点状态:
设置断点后,你会在源代码行号前看到一个小红点,表示断点已设置。此外,你还可以在 “Debug” -> “Breakpoints” 菜单中查看和管理所有的断点。 启动调试:
在设置断点后,通过 “Debug” 菜单中的 “Start/Stop Debug Session” 或者使用相应的快捷键(通常是 F5
)启动调试会话。 在断点处暂停程序:
当程序执行到设置的断点位置时,Keil μVision将暂停程序的执行。此时,你可以查看变量值、寄存器状态等信息。 在调试过程中操作:
一旦程序暂停,你可以使用调试工具栏中的按钮(继续执行、单步执行等)来控制程序的执行。你还可以在 “Debug” 菜单中选择 “Step”、“Run to Cursor” 等选项。 取消断点:
若要取消断点,你可以再次点击已设置的断点行号,或者在 “Debug” 菜单中选择 “Clear All Breakpoints”。
通过这些步骤,你可以在Keil μVision中设置和使用断点,以方便调试你的嵌入式程序。请注意,具体的操作和菜单选项可能会因Keil版本而有所不同,上述步骤基于通用的Keil μVision使用经验。
复位、执行控制
在 Keil μVision 软件中,有一些常用的调试操作,包括复位(Reset)和执行控制(Run, Step, Go)等。以下是这些操作的一些基本步骤:
复位操作:
手动复位:
在 Keil μVision 的调试工具栏中,通常有一个 “Reset” 按钮,点击该按钮将手动执行复位操作。 硬件复位:
有些目标设备上有硬件复位按钮或者引脚,你也可以通过点击硬件按钮或者拉低/拉高相应的硬件引脚来执行硬件复位。 软件复位:
你可以在代码中插入软件复位的语句,通常是一条特定的汇编指令或函数调用。
执行控制操作:
Run(运行):
在 Keil μVision 的调试工具栏中,通常有一个 “Run” 按钮,点击该按钮将继续执行程序直到下一个断点或程序结束。 Step Into(单步进入):
在 Keil μVision 的调试工具栏中,通常有一个 “Step” 按钮,点击该按钮将执行一条指令并进入被调用的函数(如果有)。 Step Over(单步过去):
在 Keil μVision 的调试工具栏中,通常有一个 “Step Over” 按钮,点击该按钮将执行一条指令但不会进入被调用的函数。 Step Out(单步出去):
在 Keil μVision 的调试工具栏中,通常有一个 “Step Out” 按钮,点击该按钮将执行程序直到当前函数返回。 Go(继续执行):
在 Keil μVision 的调试工具栏中,通常有一个 “Go” 按钮,点击该按钮将继续执行程序直到下一个断点或程序结束。 Run to Cursor(执行到光标处):
在源代码中右键点击想要执行到的行,选择 “Run to Cursor”,将执行程序直到达到该行。
以上操作在调试过程中非常常用,它们可以帮助你逐步执行程序,观察变量的值,并检查程序的行为。请注意,具体的操作和菜单选项可能会因 Keil 版本而有所不同。
查看程序段/函数执行时间
在嵌入式系统开发中,要查看程序段或函数的执行时间,可以使用一些调试工具和性能分析技术。以下是一些可能的方法:
使用嵌入式调试器:
大多数嵌入式开发工具都提供了调试功能,包括在程序执行期间查看和分析代码。通过在调试器中设置断点、单步执行和观察寄存器状态,你可以粗略地评估程序段或函数的执行时间。 使用性能分析工具:
一些嵌入式系统提供性能分析工具,这些工具可以更精确地测量代码的执行时间。这可能包括硬件性能计数器、时间戳计时器等。通过使用这些工具,你可以获取函数或代码块的精确执行时间。 添加时间戳:
在代码中插入时间戳,记录程序的开始和结束时间。这可以通过使用系统时钟或硬件计时器来实现。在函数的开头插入时间戳,然后在函数结束时记录另一个时间戳,计算两者之差即可得到函数的执行时间。 使用外部性能分析工具:
一些外部性能分析工具专为嵌入式系统设计,可以通过连接到目标设备并收集性能数据来进行代码分析。这些工具通常提供更详细的性能数据,例如函数的执行时间、函数调用关系等。 使用RTOS提供的工具:
如果你的嵌入式系统使用了实时操作系统(RTOS),某些RTOS提供了性能分析和跟踪工具,可用于测量任务的执行时间和系统调用的开销。
请注意,每个方法都有其适用的场景和精度。在选择方法时,要考虑到目标系统的性能要求和调试需求。对于一些嵌入式系统,可能需要将性能分析工作集成到系统设计和调试的早期阶段。
Options for Target 目标选项 > Utilities 公共选项 > Settings 设置 > Trace 追踪功能
Core Clock(核心时钟) Trace Clock(追踪时钟)
结束仿真报错解决方法
使用MDK(Keil μVision)进行仿真时,可能会遇到仿真结束报错的问题,给出了两种解决方法。这种情况可能与Keil μVision的版本以及对路径的支持有关。
解决方法:
清除所有断点:
在进行仿真之前,确保将所有断点清除。在 Keil μVision 的调试工具栏中,可以找到 “Clear All Breakpoints” 的选项。清除断点可能有助于避免一些与仿真结束相关的问题。 修改工程路径为全英文路径:
将工程路径改成全英文路径可以是另一种解决方法。确保工程路径中不包含中文字符,包括工程文件路径、源代码路径等。有时候,一些工具在处理中文路径时可能会引发一些问题,特别是在较新版本的软件中。 检查MDK版本:
如果您使用的是MDK5.23以后的版本,并且发现中文支持存在问题,可以考虑升级到最新的MDK版本,以获取修复的可能性。 查看Keil发布说明:
在Keil的发布说明文档中,通常会包含对已知问题的描述以及软件版本的变更。检查这些文档可能有助于了解是否存在已知的与中文支持相关的问题,并查看是否有解决方案或补丁。
请记住,这些解决方法可能因软件版本和具体环境而异。如果您仍然遇到问题,建议查阅Keil μVision的官方文档、用户手册或联系Keil支持团队以获取更详细的帮助。
4.4、工具栏常用窗口按钮介绍
Call Stack 窗口(调用栈窗口):查看函数调用关系&局部变量
在 Keil μVision 中,“Call Stack”(调用栈)窗口是一个用于查看函数调用关系和局部变量的强大工具。通过这个窗口,你可以了解程序的执行路径、调用关系,以及每个函数的局部变量值。以下是在 Keil μVision 中使用 “Call Stack” 窗口的一般步骤:
查看函数调用关系:
打开 “Call Stack” 窗口:
在 Keil μVision 的菜单栏中,选择 “View” -> “Call Stack”,以打开 “Call Stack” 窗口。 观察调用栈信息:
“Call Stack” 窗口将显示当前程序执行的调用栈信息。每个条目表示一个函数调用,包括函数的名称、地址等信息。通常,调用栈的顶部是当前正在执行的函数。 切换到不同的调用帧:
你可以在 “Call Stack” 窗口中选择不同的调用帧,以查看相应函数的局部变量和调用关系。双击 “Call Stack” 窗口中的特定条目,或者通过右键菜单中的选项进行切换。
查看局部变量:
选择调用帧:
在 “Call Stack” 窗口中选择一个特定的调用帧,即一个函数调用。这将会更新其他窗口,显示该调用帧的相关信息。 打开 “Locals” 窗口:
在 Keil μVision 的菜单栏中,选择 “View” -> “Locals”,以打开 “Locals” 窗口。这个窗口将显示当前调用帧的局部变量。 观察局部变量的值:
“Locals” 窗口将列出当前调用帧中的局部变量,并显示它们的值。你可以通过检查这些值来了解函数在执行时局部变量的状态。
通过以上步骤,你可以在 Keil μVision 中使用 “Call Stack” 窗口查看函数调用关系和局部变量。这对于程序调试和理解代码的执行流程非常有帮助。请注意,具体的操作步骤可能会因软件版本而有所不同。
Watch 窗口(监视窗口):查看函数首地址&变量值
在 Keil μVision 中,“Watch”(监视)窗口是一个用于查看变量值和函数首地址的工具。通过这个窗口,你可以监视程序执行过程中的变量值,并且也可以查看函数的首地址。以下是在 Keil μVision 中使用 “Watch” 窗口的一般步骤:
查看函数首地址:
打开 “Watch” 窗口:
在 Keil μVision 的菜单栏中,选择 “View” -> “Watch”,以打开 “Watch” 窗口。 添加函数地址:
在 “Watch” 窗口中,你可以手动添加要监视的变量或表达式。为了查看函数的首地址,你可以在 “Watch” 窗口中输入函数的名称,然后按下回车键。 观察函数地址:
如果函数名是有效的,“Watch” 窗口将显示该函数的首地址。这对于了解函数在内存中的位置非常有帮助。
查看变量值:
添加变量:
在 “Watch” 窗口中,你可以手动添加要监视的变量。为了查看变量的值,输入变量的名称,然后按下回车键。 观察变量值:
如果变量名是有效的,“Watch” 窗口将显示该变量的当前值。你可以在程序执行过程中观察变量值的变化。
使用表达式:
除了直接输入函数名或变量名外,你还可以使用表达式。例如,你可以输入类似于 &myFunction
来查看函数地址,或者输入 myVariable
来查看变量的值。
请注意,“Watch” 窗口还支持更复杂的表达式,这使得你可以监视计算得出的值。
通过以上步骤,你可以在 Keil μVision 中使用 “Watch” 窗口查看函数首地址和变量值。这对于程序调试和监视特定变量在执行过程中的变化非常有用。具体的操作步骤可能会因软件版本而有所不同。
Watch窗口:设置全局变量在被读或写后自动停止运行
在 Keil μVision 的 “Watch” 窗口中,通常是没有直接提供在全局变量被读或写后自动停止运行的选项。然而,你可以使用条件断点来实现类似的效果,以在特定的变量被读或写时触发断点并停止运行。
以下是一般的步骤:
打开 “Watch” 窗口:
在 Keil μVision 的菜单栏中,选择 “View” -> “Watch”,以打开 “Watch” 窗口。 右键单击变量并选择 “Add Watch”:
在 “Watch” 窗口中,右键单击你想要监视的全局变量,并选择 “Add Watch”。 打开 “Breakpoints” 窗口:
在 Keil μVision 的菜单栏中,选择 “View” -> “Breakpoints”,以打开 “Breakpoints” 窗口。 添加条件断点:
在 “Breakpoints” 窗口中,右键单击,并选择 “Add Breakpoint”。 在弹出的对话框中,将 “Type” 设置为 “Read” 或 “Write”,具体取决于你想要监视的操作。 在 “Expression” 中输入你要监视的全局变量的名称。 设置断点条件:
在 “Condition” 中输入条件,例如 myVariable == desiredValue
,这样当变量满足条件时,断点才会触发。 点击 “OK”:
现在,当全局变量被读或写并且满足你设置的条件时,程序将会在该点停止运行。请确保在条件断点处设置了合适的条件,以便在满足条件时才触发断点。
请注意,具体的操作步骤可能会因软件版本而有所不同。如果有关特定版本的更多信息,请参考 Keil μVision 的文档或在线帮助。
Memory窗口(内存窗口):内存查看窗口
在 Keil μVision 中,“Memory”(内存)窗口是一个用于查看和修改目标设备内存内容的工具。通过这个窗口,你可以查看程序和数据在内存中的布局,监视内存的变化,并在需要时手动修改内存中的数据。以下是在 Keil μVision 中使用 “Memory” 窗口的一般步骤:
打开 Memory 窗口:
在 Keil μVision 的菜单栏中,选择 “View” -> “Memory”,以打开 “Memory” 窗口。
Memory 窗口的基本功能:
选择 Memory Map:
在 “Memory” 窗口中,你可以选择查看不同的 Memory Map,包括 Code、Data、和其他特定区域。 指定起始地址和长度:
你可以在 “Memory” 窗口的工具栏或右键菜单中指定要查看的内存范围的起始地址和长度。 查看内存内容:
“Memory” 窗口会显示所选内存范围的内容,包括十六进制和 ASCII 表示。你可以在窗口中上下滚动,查看不同地址的数据。 查看变量地址:
在 “Memory” 窗口中,你可以查找和查看程序中的特定变量的地址,以了解其在内存中的位置。 修改内存内容:
你可以手动修改内存中的数据。在需要修改的位置双击,并输入新的十六进制值。 监视变量地址的变化:
通过在 “Memory” 窗口中设置断点,你可以监视特定变量地址的变化,以便在内存发生变化时自动停止运行。 搜索特定值:
“Memory” 窗口通常提供搜索功能,你可以使用搜索来找到特定的值或模式。
请注意,使用 “Memory” 窗口修改内存数据可能对程序的行为产生影响,所以在进行修改时要小心。此外,具体的操作步骤可能会因软件版本而有所不同。如果有关特定版本的更多信息,请参考 Keil μVision 的文档或在线帮助。
Peripheral窗口(外设窗口):查看寄存器的值
在 Keil μVision 中,“Peripheral”(外设)窗口是一个用于查看和编辑目标设备外设寄存器的工具。通过这个窗口,你可以轻松地浏览和修改芯片上与外设相关的寄存器值。以下是在 Keil μVision 中使用 “Peripheral” 窗口的一般步骤:
打开 Peripheral 窗口:
在 Keil μVision 的菜单栏中,选择 “View” -> “Peripherals”,以打开 “Peripherals” 窗口。
Peripheral 窗口的基本功能:
选择外设:
在 “Peripherals” 窗口中,你可以选择要查看和编辑的外设。通常,它会列出目标设备上的各种外设,如GPIO、USART、SPI等。 查看寄存器:
“Peripherals” 窗口会显示所选外设的相关寄存器及其当前值。你可以在窗口中轻松浏览这些寄存器。 编辑寄存器值:
你可以手动编辑寄存器的值,以修改外设的配置。在 “Peripherals” 窗口中,通常可以直接双击寄存器的值进行编辑。 查看寄存器位(Bits):
对于每个寄存器,你可以查看其各个位(Bits)的值。这对于了解寄存器各个位的作用和配置非常有帮助。 查看寄存器描述:
“Peripherals” 窗口通常还提供了寄存器的描述信息,帮助你理解寄存器的功能和作用。 查看外设的全局信息:
有些 “Peripherals” 窗口可能还提供了外设的全局信息,例如时钟频率、状态等。
通过 “Peripheral” 窗口,你可以直观地查看和编辑与目标设备上的外设相关的寄存器值,这对于调试和配置外设非常有帮助。请注意,具体的操作步骤可能会因软件版本和目标设备而有所不同。如果有关特定版本的更多信息,请参考 Keil μVision 的文档或在线帮助。
外设寄存器
这是一些常见的外设,它们对应了一些典型的嵌入式系统中常见的功能和模块。以下是对每个外设的简要说明:
ADC(模数转换器):
AFIO(复用功能IO):
BKP(后备寄存器):
CAN(控制器局域网):
实现控制器局域网通信协议,用于在系统内部或外部进行高速通信。 CRC(循环冗余校验):
用于执行循环冗余校验,通常用于数据传输的错误检测。 DAC(数字模拟转换器):
DBG(调试支持):
DMA(直接存储器访问):
EXTI(外部中断):
FLASH(闪存存储):
FSMC(静态存储器控制器):
用于连接外部存储器,如SRAM、NOR Flash等。 GPIO(通用输入输出):
I2C(Inter-Integrated Circuit):
IWDG(独立看门狗):
提供系统复位功能,以确保系统在长时间无响应时进行复位。 NVIC(中断控制器):
PWR(电源控制):
RCC(时钟控制):
RTC(实时时钟):
SDIO(安全数字输入输出):
SPI(串行外设接口):
TIM(定时器):
USART(通用同步异步收发器):
USB(通用串行总线):
WWDG(窗口看门狗):
这些外设在嵌入式系统中发挥着不同的作用,允许开发者通过它们来实现丰富的功能和应用。每个外设都有一组相关的寄存器,通过配置和操作这些寄存器,可以控制外设的行为。在具体的芯片手册或数据手册中,会详细描述每个外设的寄存器布局和功能。
内核寄存器
在嵌入式系统中,有一些关键的内核寄存器和模块,包括 NVIC(中断控制器)、System Control and Configuration(系统控制和配置)、System Tick Timer(系统滴答定时器)以及 Fault Reports(故障报告)等。以下是对这些模块的简要说明:
1. NVIC(中断控制器):
NVIC(Nested Vector Interrupt Controller) 是一种用于管理和控制中断的模块。其主要功能包括:
2. System Control and Configuration(系统控制和配置):
这个模块通常包括一系列寄存器,用于配置处理器的基本行为和系统特性。其功能包括:
3. System Tick Timer(系统滴答定时器):
System Tick Timer 是一个用于提供系统定时的模块,通常用于操作系统的时间片轮转等。其主要功能包括:
4. Fault Reports(故障报告):
这个模块通常包括一系列寄存器,用于报告和处理处理器的故障条件。其功能包括:
这些内核寄存器和模块在处理器的正常运行和异常处理中发挥着关键作用。程序员可以通过配置这些寄存器来实现对中断的管理、系统的配置和定时等功能。详细的信息通常包含在处理器的参考手册或技术文档中。
4.5、仿真时要注意的点
在嵌入式系统的仿真和调试过程中,确实需要考虑一些关键的点。你提到的一些注意事项是非常重要的,以下是一些常见的仿真时需要注意的点:
优化级别选择:
在仿真过程中,选择适当的编译优化级别非常重要。有时候,为了更好地观察代码的执行流程和变量的值,可以选择较低的优化级别。在MDK中,Level 0优化通常会保留更多的源代码结构,有助于调试。 调试停止的影响:
当在断点处停止时,确实只是内核停止执行,而外设可能继续运行。这一点在与外部设备通信或执行定时任务时尤其需要注意。在仿真期间,特别是在调试期间,要确保了解停止执行对系统其他部分的影响。 断点设置的时间观念:
设置断点时,需要考虑是否会打断正常的通信和定时操作。某些外设和通信协议对实时性要求较高,设置断点可能导致系统无法按照预期执行。在设置断点时,最好选择在不影响关键操作的地方进行。 时序和同步问题:
在仿真中,可能无法准确模拟实际硬件上的时序和同步问题。某些实时系统和通信协议对时序要求较高,因此在仿真时要仔细验证这些方面的问题。 外设仿真模型的准确性:
确保使用的仿真工具具有准确的外设仿真模型。某些外设的行为可能受到实际硬件特性的影响,而仿真模型可能并不总是完全准确。 观察寄存器和变量值:
利用仿真工具中的观察工具,关注关键寄存器和变量的值。这对于了解系统状态和调试代码非常有帮助。
在进行仿真和调试时,仔细考虑这些因素有助于更有效地发现和解决问题。此外,定期参考仿真工具和处理器的文档以获取更多有关仿真的最佳实践和注意事项。
五、总结