Keil MDK3.20 在ULINK下调试stm32方法
- 格式:doc
- 大小:200.00 KB
- 文档页数:5
图解Keil MDK 3.5/UV4beta Jlink V7 在STM32中SRAM 调试成功方法成功目的是避免FLASH擦写次数的限制,和避免新手学习很快让MCU结束生命。
以本人STM32F103RBT6为例,128K flash,20K SRAM,借鉴前人ULINK下调试的方法。
把内存分为16K用做FLASH,4K用做内存使用,这里以GPIO点亮LED为例子,项目为GPIO_OUT。
1、copy Keil安装目录下,例如C:\Keil\ARM\Boards\Keil\MCBSTM32\STLIB_Blinky中的RAM.ini到项目目录,然后双击GPIO_OUT.uvproj,启动Keil。
2、单击启动下图对话框,在Project Targets一项单击New(Insert)按钮,增加一个目标,命名为SRAM,然后OK。
3、然后再Select Target中选择SRAM。
4、左侧项目栏中选择SRAM,单击右键选择Options for Target “SRAM”,打开选项对话框。
5、如上图所示,在target选项中修改IROM1的Start值为:0x20000000,Size:0x4000IRAM1的Start值为:0x20004000,Size:0x1000;即内存分为16K用做FLASH,4K用做内存使用。
6、OutPut选项卡中也选中Create HEX File,如下图所示。
7、在Debug选项中仿真器选择Cortex-M3 J-LINK,Initialization File中点击Edit按钮选择刚才copy过来的RAM.ini文件,取消Load Application at Startup复选框,设置如下:并点击仿真器一栏,Settings按钮,进一步设置,如下图,注意Debug选项中Interface中选择USB,如下图所示,在Flash Download中配置,选中Do not Erase,在RAM for Algorithm中Start设置为0x20004000,Size设置为0x1000,设置STM32F10x Med-density Flash的地址Start:0x20000000,size:0x00004000,点击OK。
STM32 LL库使用指南---By Fengzi熟悉STM32的都知道ST官方提供了非常方便好用的库函数供用户使用,多数人都使用过STM32标准外设库,STM32Cube库(即HAL库),这个LL库是什么鬼,却从来没听说过。
好吧,我承认这个名字是我自己XJB取的。
目录一、初识LL 库 (1)二、怎么使用LL库 (3)三、新建STM32LL库工程模板 (5)四、第一个程序——点亮LED (8)五、添加其他程序功能 (10)………………………………………………………………………………………………………………………………………………….一、初识LL 库最近论坛发的STM32L476RG Nucleo开发板到手了,准备学习玩耍,当然第一步就是下载资料,于是我下载STM32L4Cube 1.1.0版本,打开逐个查看,好像和以前一样的,没什么特别嘛,于是准备开始开发。
等等,好像还真发现了有点不一样:熟悉HAL库的都知道,该库的文件几乎都是以stm32xxx_hal_xxx.h/.c命名的,为了和以前的标准库有个区分,上图中那些是什么鬼前辈说,遇到问题赶紧查手册,于是我果断打开STM32L4Cube库的说明手册(UM1884):原来这个东西叫做Low Layer APIs,作为英文渣渣表示实在不习惯洋里洋气的高大上名字,于是擅自把他叫做【STM32LL库】了(不服的你咬我啊)。
从这里看好像是说这个东东比HAL库更接近硬件,到底什么鬼,还不清楚。
但是以前好像没见过这个东西啊,就算是STM32L4Cube的1.0.0版本中都没有。
看看Cube发行历史:原来LL库是在1.1.0版本才加上的,大概意思就是:1.LL APIs是寄存器级的编程,嗯,也就是说我们常说的直接操作寄存器吧。
2.LL APIs适用于xxx等一大堆外设3.LL APIs函数全部定义为static inline函数,放在对应的头文件中,用户使用需要包含相关头文件4.参考这两个文档看看LL库文件在Cube库中的位置,有20多个文件,全部以stm32l4xx_ll_xxx.h命名:STM32Cube_FW_L4_V1.1.0\Drivers\STM32L4xx_HAL_Driver\IncSTM32L4是面向低功耗市场的,同时不失高性能,功耗和性能往往是两个矛盾的东西,ST在硬件设计上想了各种办法来实现兼顾低功耗高性能(例如各种低功耗模式,LP外设等),而在软件层面,程序也讲求效率,LL库全是直接操作寄存器,直接操作寄存器往往效率较高,而且函数定义为内联函数,调用函数时不是堆栈调用,而是直接把函数的代码嵌入到调用的地方,利于提高代码相率,我想这也是ST在STM32L4系列中推出这个直接操作寄存器的LL库的原因之一吧。
下面介绍U-Link、J-Link和ISP下载STM32程序的配置方法,以MDK3.24为例,也可以使用MDK3.80或者更高版本的MDK,过程类似。
此文档仅供学习和交流使用。
STM32程序U-Link下载说明(1)ULink下载工具如图1所示。
图1 ULink下载工具(2)双击MDK安装文件图标进行安装,在后续出现的窗口中依次点击Next按钮,直到安装完成(默认安装路径是C:\Keil,建议换个路径名,比如C:\Keil MDK324文件目录下,以防止与51单片机开发环境冲突)。
安装好后,未输入License的MDK,在开发时会有代码量的限制。
(3)输入License:选择File菜单下的License Management子菜单,如图2所示。
图2 File菜单下的License Management子菜单(4)将License序列号拷贝到License Management中的New License ID Code(LIC)中,点击ADD LIC完成,如图3所示。
图3 输入License序列号(5)运行序列号生成程序,打开破解补丁:(部分杀毒软件可能会将这个文件误报为病毒文件,这时不必理会杀毒软件的警告,并将这个文件设为信任文件或者直接关掉杀毒软件),运行压缩包中程序,按图4所示配置,将Target下拉选项选中“arm”。
图4 输入CID,获得序列号将Keil软件“License Management”对话框中的Computer CID中的内容:拷贝到此程序的CID中:,然后点击按钮,获得序列号。
(6)将生成的序列号拷贝到“License Management”对话框的LIC区域中:然后,点击“Add LIC”,出现图5所示的内容,点击“Close”关闭对话框。
图5 添加LIC序列号(7)将文件夹Bin目录中的3个文件“UL2ARM_RDI.dll”、“UL2ARM_ULINK1.dll”、“UL2CM3_ULINK1.dll”拷贝到MDK安装目录下的\ARM\Bin目录中。
最近一段时间一直在学习STM32和ucos的移植,使用的开发环境是keil u4版本。
仿真器是80元买的jlink。
在学习了STM32固件库和ucos内核与移植相关的程序之后,写了一个流水灯程序,准备下载到板子上看看情况。
哪知程序还没有下进去,在debug时,keil的错误提示到:Error: Flash download failed-"Cortex-M3"感觉这么错误很普遍,也是初学者常常遇到的错误,下面我就将这个错误产生的原因和解决方法赘述一下:错误产生的原因和分析,解决。
首先,我们看到提示信息是有关flash的,那么我们来查看一下STM32F103XB的数据手册关于这部分的描述(我使用的芯片是STM32F103RB,有128kflash。
)知道了原来flash在此芯片中的地址是从0x0800 0000到0x0801 FFFF 这段,也就是说这段存储空间是用来存储程序。
而在STM32芯片方面,它又有一个规则,那就是芯片启动的方式,如果你把程序下载到了flash中,那么在复位芯片之前或者通电之前,要将boot0,boot1两个引脚拉到高电平,这样在启动时,芯片初始化之后,运行程序代码才是从flash地址开始执行的。
于是,我们来查看一下keil中仿真器的设置,是不是正确,设置的选项在keil软件的project-options for target中的Utilities中,先来查看下仿真器是否选对,然后点settings,弹出如下菜单:查看一下programming Algorism 下的flash地址是否正确,如果不正确则会引起开始那个错误的提示信息,如果正确还是出现那个错误,那么按照官方给的解决方法是,删除现有的flash地址,重新配置一下,记得要选对芯片型号和地址空间。
配置好之后点击OK退出。
然后再查看一下Target中的地址,是否跟你重新添加的一致,如果一致,那么点OK退出。
KEIL下使用Jlink调试STM32 核心模块开发板大家知道,之前在Keil下可以通过RDI方式使用全功能版Jlink来调试LPC2000、STR912等很多芯片的,不过唯独是无法用Jlink 的RDI方式来调试STM32系列,因为在Jlink RDI Configuration 中的Flash设置中没有STM32芯片的选项,如下图所示。
在Keil宣布支持Jlink后的MDK3.22版本中开始直接支持Jlink了,这对大家来说无疑是一个好消息,因为在Keil中可以直接像使用Ulink2一样使用Jlink了。
不过经过测试好像还存在一些bug,测试情况详见:/bbs/viewthread.php?tid=8933&extra=page%3D3最主要的问题就是:添加下载算法不能一一对应,完全是乱的,如下图所示:后来经过awake兄弟的指导和帮助终于搞定了,在这里对awake兄弟表示感谢。
这个问题在Keil的官方网站给出了答案,详见:/support/docs/3410.htm 下面就给出具体解决方法,很简单,只需两步,复制三个文件即可:1、安装Jlink的最新驱动,本文安装的是V3.88版本,最新的驱动可以从segger官方网站下载:/download_jlink.html。
安装完成后,打开C:\Program Files\SEGGER\JLinkARM_V388目录(默认安装目录),如下图所示,复制JLinkARM.dll和JLinkRDI.dll两个文件到Keil的安装目录:\Keil\ARM\Segger下,替换以前的文件,如下所示:2、从keil网站下载JLTAgdi.dll文件也复制到:\Keil\ARM\Segger目录下,添加完成后如下图所示:完成上面两步后,现在我们打开Keil软件来进行一个验证。
任意打开一个STM32的程序,本文打开时Keil自带的USBMem例程,在:\Keil\ARM\Boards\Keil\MCBSTM32\USBMem目录下。
使用Keil MDK以及标准外设库创建STM32工程1.1 使用Keil MDK以及标准外设库创建STM32工程通过上一节对标准外设库的介绍,想必各位读者对标准外设库已经有了基本的认识,然而由于标准外设库中文件众多,很多初学者在开始很长一段时间内甚至都无法完全自己建立一个工程,很多人只是依赖标准外设库或给定的工程模板。
本节就介绍怎样利用Keil MDK 开发环境和标准外设库来搭建自己的工程。
建立一个基于标准外设库其实并不复杂,网络上也有很多关于怎样在Keil MDK下建立工程的教程,方法也各异,本节所介绍的方法本着少改动、便于使用、方便更换器件等原则,给大家介绍怎样在Keil中创建一个工程,并以一个最简单的例子来说明怎样下载和调试程序。
1.1.1 开发工具与开发环境1. 软件版本本节所使用Keil MDK 为目前的最新版V4.21,具体版本信息如图5-6所示。
其他版本差别不大,读者可以根据自己使用的版本进行操作或者从Keil的官网下载新版本。
使用的标准外设库为目前最新的V3.5版本。
使用的开发调试工具为JLINK-V8,使用的驱动版本为V4.08l。
图5-6 MDK详细版本信息2. 建立工程目录首先先建立一个用于存放工程的文件夹,此处命名为STM32,在文件夹下分别建立LIB、USER、MDK三个文件夹,分别用于存放标准外设库文件、用户程序文件、工程目录。
在MDK 文件夹下建立List、Obj两个文件夹,分别用于存放在编译过程中产生的临时文件和输出文件。
接下来拷贝标准外设库和相应的文件到工程目录中,首先拷贝STM32F10x_StdPeriph_Li b_V3.5.0\Libraries文件夹下的两个文件夹CMSIS和STM32F10x_StdPeriph_Driver到刚刚新建的STM32\LIB目录下,接下来拷贝用户编写程序的程序文件,此文件可以从标准外设库自带的例程中拷贝,这里从STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Exam ples\ADC\3ADCs_DMA目录下拷贝main.c、stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it. h四个文件,这四个文件是在编程的时候用户往往需要根据实际需求进行修改的。
IAR下用JLINK调试STM32心得IAR开发环境下使用JLINK来调试STM32芯片是一种常见的调试方法。
以下是我在实际使用中总结的一些经验和心得。
首先,在使用JLINK进行调试之前,我们需要按照JLINK提供的说明书正确连接好硬件设备。
通常,我们需要将JLINK与STM32芯片之间连接好,并确保连接的正确性。
此外,我们还需将JTAG/SWD接口正确地连接到STM32的相应引脚上。
接下来,在IAR环境下进行配置。
在打开IAR工程之前,我们需要确保IAR和JLINK驱动软件已经正确地安装到电脑上。
然后,我们可以打开IAR并打开相关的工程文件,然后进入调试模式。
在调试模式下,我们需要在IAR的"Options"菜单中选择"Debugger"选项。
在"Driver"栏中,我们需要选择使用JLINK进行调试。
在"Setup"选项卡下,我们可以进一步配置JLINK的一些参数,比如连接速度和复位方式等。
根据实际需求,我们可以对这些参数进行相应的调整。
在调试过程中,我们可以使用IAR提供的各种调试工具来观察和分析程序的运行状态。
比如,我们可以使用"Watch"窗口来监视变量的值,或者使用"Memory"窗口来查看内存的内容等。
此外,我们还可以使用"Breakpoints"来设置断点,使程序在特定的位置停止执行,方便我们进行代码的调试和分析。
从实践中,我发现在使用JLINK调试STM32时,一些常见的问题可能会出现。
比如,由于硬件连接出错或者参数配置不当,导致与JLINK的连接失败。
此时,我们需要仔细检查硬件连接,并重新配置JLINK的参数。
另外,有时候程序可能会卡死或者出现异常,导致调试失败。
这时,我们可以使用IAR提供的复位工具来重新启动STM32芯片,然后重新开始调试。
Keil MDK下配置stm32库开发环境(包括J-Link调试环境设置)准备:1.stm32官方固件库2.Keil MDK一、建立stm32工程当出现提示是否要添加启动文件时,选择否(因为在官方固件库中包含有启动文件)工程建立完成!二、添加官方固件库右键工程目录,选择Manage Components..第一栏表示工程名称,第二栏表示工程包含的文件夹,第三栏表示各个文件夹中包含的文件通过Add Files将固件库中的文件添加进工程中,添加过后如下这么整理是为了让工程开起来层次清晰,对于工程编译没有影响,也就是说即使工程里文件不是按照目录这么整理的,也可以正常编译,只是习惯上如此整理。
三、工程设置右键工程,选择Options for Target…需要设置的有C/C++标签页中的Include Paths,如下:点击最右边的三个点按钮,这里设置的意思是把整个工程中所有.h文件所在的目录添加进来,只有这样,编译器在编译程序时才会从这些路径中寻找头文件。
点击这个方框按钮,添加目录,本例中将./sys ./inc ./src ./usr都添加进来四、J-Link调试器在keil中的设置接着第三步,在Debug标签中选择J-Link调试器选择完成后,点击右侧Setting按钮,如下:提示:必须正确连接J-Link后才会显示这样选择Flash Downlade标签页,点击Add按钮,将对应CPU型号的flash点击ok在Utilities标签页中,选择J-Link后点击ok即完成所有工程设置在main.c中写入main函数后编译未提示错误可以直接使用下图中红色标记按钮直接下载程序,不用再打开J-Flash下载程序了。
用KEIL uvsion 3软件调试程序的流程和方法(1)用汇编语言或C语言创建源程序使用菜单“File->New”或点击工具栏的新建文件按扭,即可在项目窗口的右侧打开一个新的文本编辑窗口。
编辑完文件后,保存该文件,注意必须加上扩展名(汇编语言源程序一般用asm或a51为扩展名)。
(2)创建一个项目,从器件库中选择目标器件,配置工具设置点击“Project->New Project…”菜单,出现一个对话框,要求给将要建立的工程起一个名字(默认保存类型为uv3/uv2)下一步,选择目标CPU(即你所用芯片的型号),(先选择生产该CPU的公司,然后点“+”,从下拉列表中即可看到具体的CPU),然后点击“确定”按钮回到主界面。
此时在工程窗口的文件页中,出现了“Target 1”,前面有“+”号,点击“+”号展开,可以看到下一层的“Source Group1”,这时的工程是一个空的工程。
(3)向项目中添加源文件。
右击界面左边项目窗口中的“Source Group1”,选择“Add file to Group” Source Group1“,出现” Add file to Group” Source Group1“对话框。
在对话框下面的”文件类型“改为”*.*“,找到需加入的.asm文件,双击该文件名,即可把该文件加入项目。
(4)设置工程项目点击左边Project窗口中的Target1,然后使用菜单”Project->Options for target “target1”“即出现对工程设置的对话框。
共八个页面,大多数取默认值即可。
选几个比较重要的做下说明:Target页Xtal:晶振频率值,默认值是所选目标CPU的最高可用频率值,该数值与最终产生的目标代码无关,仅用于软件模拟调试时显示程序执行时间。
正确设置该数值可使用显示时间与实际所使用时间一致,一般将其设置成与你的硬件所用晶振频率相同。
Keil MDK3.20 在ULINK下调试stm32方法
1. 程序在RAM中运行
要点:(1)程序的下载地址改到RAM空间中
(2)程序的debug之前要设定SP,PC指针到Ram空间
新建工程,选择STM32 的具体型号,我买的万利的开发板,选择
stm32f103Vb。
?
设定程序下载地址,如下图所示,IROM1的地址指向了STM32的ram空间。
?
空间大小如何分配取决于自己的需求。
本款处理器内部ram大小为20K,分配16K给只读区,4K给可读可写区。
这样IROM设定的大小为0x4000,IRAM1的起始就变为0X20004000,大小只剩下0X1000。
Debug标签选择ULINK1 Cortex Debugger(软件采用yjgyiysbcc兄crack 方法)。
不选Load Application at Start,在Initialization中加入启动脚本RAM.ini。
?
RAM.ini中具体内容如下:
FUNC void Setup (void) {
SP = _RDWORD(0x20000000); // Setup Stack Pointer
PC = _RDWORD(0x20000004); // Setup Program Counter
_WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset
Register
}
LOAD XXX.axf INCREMENTAL // Download,红色代表工程文件名.axf
Setup(); // Setup for Running
g, main
Utilities下Update Target before Debugging不选
这样添加后就可以在RAM中调试了。
>>>>>>我们需要在代码中设置正确的中断向量表位置。
中断向量表通常被放置在用户程序的开始,所以flash中运行时,向量表位于0x08000000处,而当代码被放置在SRAM中运行时,他的位置就成了
0x20000000。
在初始化NVIC时,我们可以放置如下代码,定义向量表的位置
NVIC_SetVectorTable(0x20000000 , 0x0);
或
NVIC_SetVectorTable(0x08000000 , 0x0); >>>>>工程选项中Debug项,Download选项卡中,去掉所有钩子,不下载代码到flash,这样就可以在RAM中调试程序了!
2. Flash中调试
新建工程后系统默认设定好IROM1为FLASH的地址和空间大小。
只需要两步:
1)设定调试工具为ULINK1 CORTEX DEBUGGER,如下图所示,不需要设定起始脚本。
?
2)在Utility中设定选择ULINK1 cortex debugger,并设定编程算法。
如下图所示。
?
? 之后就可以FLASH调试了。
硬件:万利的 EK-STM32F开发板,硬件去掉RS3,RS4 排阻,断开开发板本身的仿真器。
软件:KEIL MDK3.20+ULINK驱动替换文件。
仿真器:ULINK。