Keil

1、引言

实际工程中如果需要对 MCU 的 option bytes 进行修改,可以有以下几种方式:

• 通过 STLINK-Utility 或是 CubeProgrammer 图形化工具进行配置

• 通过 ST-LINK_CLI.exe 命令行的方式进行配置

• 通过应用代码中软件修改寄存器的方式进行配置

以上的方式中前两种都需要脱离 KEIL 或是 IAR 的开发环境进行操作,在实际项目的开发阶段可以使用,但是到量产阶段由于多了一道工序,增加了成本与出错的风险;通过应用代码软件修改的方式在一定程度上也是增加了软件的复杂度。

如果客户使用 KEIL 作为软件开发环境,则存在一种更简单的方式,就是使用 opt.s 文件,采用该方法可以与应用工程融合在一起,一步完成 option bytes 的配置。

2、opt.s 文件介绍

Opt.s 文件存在于 KEIL 的开发包中,以 F3 系列 MCU 为例,可以在如下的路径中找到。

1.png

打开该文件后,可以看到如下部分截图,类似汇编语言的方式对变量进行赋值,其实也就是对 option bytes 中的各个关键变量进行赋值操作。

2.png

3、通过 opt.s 配置 option bytes

通过 opt.s 修改 option bytes 只能在 KEIL 开发环境下进行,接下来在 STM32F334R8 为例说明。

Step 1:新建或是任意打开一个基于 STM32F334R8 的工程,这里直接使用 CubeMx 例程中STM32F334R8-Nucleo 下的 GPIO_IOToggle 例程。

Step 2:将 STM32F3xx_OPT.s 添加到功能目录中,如下:

3.png

Step 3:双击打开 STM32F3xx_OPT.s 文件,如下图所示。KEIL 提供了两种编辑方式,如果对.s 文件的编程方式以及 option bytes 变量的每个 bit 都非常熟悉的话,可以直接在 text editor 下对.s 文件中进行修改;更加简单的方式是直接在 Configuration Wizard 下进行配置。建议采用后面一种配置方式,更加简单明了。

4.png

Step 4:Configuration Wizard 下修改配置,比如将 RDP 由 level 0 更改为 level 1 并保存修改,此时可以通过 Text Editor 查看对应的 RDP 的值也变了。

5.png

Step 5:重新编译工程,可以看到 opt.s 文件被直接编译到应用工程中。

6.png

Step 6:将生成的烧录文件直接下载到目标板中。此时需要注意的是,在烧录前一定要将对应的 Flash options 的烧录算法添加到 Programming Algorithm 中,如下所示,完成后直接连接目标板进行烧录即可。

7.png

完成以上的操作后,可以对上述进行的 option bytes 的修改进行验证,可以直接打开CubeProgrammer 读取目标板的 option bytes,得到的结果如下图所示,可以看到,RDP 的结果与上述配置一致。

8.png

4、小结

通过将 opt.s 文件添加到工程中实现 option bytes 的配置,好处是将配置融合到烧录文件中,不需要通过其他工具或是在应用代码中去操作 option bytes,简化量产过程中的烧录工序。但是目前该方法不是所有的 MCU 型号都适用,例如对 G4 双 Bank 系列就存在问题,需要等待官方提供适合双 Bank 的 option bytes 的烧录算法与 opt.s 文件。

来源:STM32单片机

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 339

概述

ME32x系列是内嵌ARM Cortex™ M0/M3核的32位微控制器。该系列控制器由敏矽微电子有限公司自主开发,并具有自主知识产权。敏矽微电子的微控制器包括有通用MCU和专用SOC系列,具有非常高的性价比,是MCU产品升级换代和国外产品替代的最佳选择。通用功能有高精度ADC,CAN接口,I2S音频接口,UART串口,SPI接口,I2C总线接口,看门狗定时器(WDT),通用计数器/定时器。特殊接口包括人机界面控制器(LCD驱动,电容触摸按键)和马达控制功能模块。

调试端口

所有ME32x系列产品都支持ARMSWD 两线调试协议。由于调试端口与IO复用,调试端口管脚在系统初始化时为SWD调试功能SWD_CLK和SWD_IO(用户加密情况除外),调试管脚状态在BootLoader运行时不会改变。用户可以使用Jlink或Ulink仿真器与之连接,从而下载和调试用户程序。

调试技巧

3.1 如何确认硬件连接

理论上,仿真器与目标板只需要连接GND,SWD_CLK和SDW_IO三根线即可调试(建议nRST也连接)。如目标板没有电源,JLINK/ULINK仿真器是可以通过USB5V提供一个3.3V电源给目标板供电,前提是目标板是3.3V供电并且电源功耗所需要电流不超过USB能提供的电流:

JLINK缺省是输出3.3V

ULINK缺省是不输出3.3V电源,接口芯片电源要外供。要输出3,3V,需要把一个3针排插全部连在一起(ULINK标准版)
如果目标板系统接口是1.8V或5V,就只能使用ULINK,并且使用不输出3.3V电源设置,目标板需要自己供电,并且1.8V或5V 电源还需要接入仿真器的接口电源。

连接好电源及信号线后,可以检验一下你的工作结果:

打开一个对应的MCU 的工程,在OPTION窗口的Debug Tab,选择你的仿真器,再点击Setting按键


如果你能看到IDCCODE,那么恭喜你,你的硬件连接没有问题了。

3.2 程序下载失败

在确认硬件连接没有问题后,如果出现程序下载失败并且连续重试也一样(已确认对应Flash烧写算法已正确设置并且运行Flash算法的SRAM地址空间也正确设置,不同芯片设置不同,看下图),可能有以下原因:


SWD端口被用户程序复用,此时端口功能不再具有SWD功能

解决方法:MCUBoot引脚接地,重新上电或用Reset重启系统,这样系统会停留在Bootloader,同时SWD引脚功能恢复,即可下载。

SWD接口需要重启

解决方法:在OPTION->Debug->SettingTAB 窗口,选择设置Connect &Reset Options使用Reset,如下图


如nRST没有连接,也可以选择SYSRESETREQ Reset。

3.3 不能进入调试界面或总是从调试界面弹出

有时用户会发现,以前的工程可以下载,但不能进入调试界面进行调试,并且还可能导致SWD不工作,但换一个工程又可以调试。其原因是该工程上次调试有非法操作(如访问非法地址),并且非法操作被工程记录,每一次进入调试都会调用该操作,从而导致Keil从调试窗口弹出。

所以我们要做的事情就是把保留在工程的非法操作从工程中清除掉。

在工程Options->DebugTab,拿掉下面的勾选项目:


选择OK保存。

再在File->SaveAll 保存所有工程内容。

退出工程。

重新调入工程即可解决问题了。

Revision History


来源: 敏矽MCU

围观 198

keil 是使用比较广泛的单片机开发环境,在使用的过程中,工程编译完毕后可能会出现错误或者警告。对于错误必须要改,但是对于警告而言,你可以忽略。但值得一提的是,搞技术的人多多少少都有点强迫症,如果把警告在那里放着,你看着肯定不舒服,对于经常出现的警告和错误我大体总结了一下,希望对大家能有所帮助。

1. Warning 280:’i’:unreferenced local variable
说明 局部变量 i 在函数中未作任何的存取操作;
解决方法 消除函数中 i变量的声明;

2 Warning 206:’LED_Init’:missing function-prototype
说明 LED_Init( )函数未作声明 或未作外部声明,所以无法给其他函数调用;
解决方法 将叙述LED_Init (void)写在程序的最前端声明,如果是其他文件的函数则要写成 extern void LED_Init (void),即作外部声明;

3 Compling :C:\8051\MANN.C
Error:318:can’t open file ‘led.h’
说明 在编译 C:\8051\MANN.C 程序过程中 由于 main.c 用了指令#include “led.h”,但却找不该文件;
解决方法 编写一个led.h 的包含档并存入到 c:\8051 的工作目录中;

4 Compling:C:\8051\LED.C
Error 237:’Led_ON’:function already has a body
说明 Led_ON( )函数名称重复定义 即有两个以上一样的函数名称;
解决方法 修正其中的一个函数名称 使得函数名称都是独立的;

5 ***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_DELAYX1MS?DELAY
说明 DelayX1ms( )函数未被其它函数调用 也会占用程序记忆体空间;
解决方法 去掉 DelayX1ms( )函数 或利用条件编译#if …..#endif,可保留该函数并不编译;

6 ***WARNING 6 :XDATA SPACE MEMORY OVERLAP
FROM : 0025H
TO: 0025H
说明 外部资料ROM 的 0025H重复定义地址;
解决方法 外部资料 ROM的定义如下;
Pdata unsigned char XFR_ADC _at_0x25 其中 XFR_ADC 变量的名称为0x25,请检查是否有其它的变量名称也是定义在 0x25 处并修正它;

7 WARNING 206:’DelayX1ms’: missing function-prototype
C:\8051\INPUT.C
Error 267:’DelayX1ms‘:requires ANSI-style prototype C:\8051\INPUT.C
说明 程序中有调用DelayX1ms 函数 但该函数没定义 即未编写程序内容或函数已定义但未作声明;
解决方法 编写 DelayX1ms 的内容 编写完后也要作声明或作外部声明可在 delay.h的包含档宣告成外部 以便其它函数调用;

8 ***WARNING 1:UNRESOLVED EXTERNAL SYMBOL
SYMBOL:MUSIC3
MODULE:C:\8051\MUSIC.OBJ(MUSIC)
***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL:MUSIC3
MODULE:C:\8051\MUSIC.OBJ(MUSIC)
ADDRESS:0018H
说明 程序中有调用 MUSIC3函数,但未包含该函数的.c加入到工程中;
解决方法:将包含MUSIC3函数的MUSIC.c文件添加到工程文件中去;

9 ***ERROR 107:ADDESS SPACE OVERFLOW
SPACE: DATA
SEGMENT: _DATA_GOUP_
LENGTH: 0018H
***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNAL
SYMBOL: VOLUME
MODULE: C:\8051\OSDM.OBJ(OSDM)
ADDRESS: 4036H
说明 data 存储空间的地址范围为 0~0x7f,当公用变量数目和函数里的局部变量 如果存储模式设为SMALL 则局部变量先使用工作寄存器R2~R7作暂存 当存储器不够用时则会以 data型别的空间作暂存的个数超过 0x7f 时就会出现地址不够的现象;
解决方法:将data型的公共变量修改为idata型;

10 “*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL”
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
如果你在用C51编译器出现上面的警告,这个只是初学者和粗心者才会犯的错误:没把C文件添加到项目中!
另外,还有可能是因为存在没有被调用的已经定义的函数,或者相关的已经定义的变量没有使用。

围观 1555

一、引言

单片机软件开发过程中,软件调试遇到的各种问题常令初学者感到不知所措。实际上。各种仿真开发软件的程序调试基本方法和技巧大同小异,掌握正确的程序调试基本技巧。对于排查这些程序错误问题可以起到举一反三、事半功倍的效果。软件调试是单片机技术人员必须掌握的重要基本技能。

下面以单片机常用开发软件Keil为例,通过一个项目任务实例来介绍单片机软件仿真与调试的方法。

二、Keil仿真与调试

点击运行软件Keil uVision2.其调试操作步骤大体可以分为5步:

1、创建工程

在项目开发中,并不是仅有一个用户源程序就够了,还要为这个项目选择CPU型号、设置编译和调试参数。有一些项目还会有多个文件组成。因此将这些参数设置和所需要的所有文件统称为一个工程,存放于专门的工程文件夹下。这里先建立一个工程文件夹如F:\exam.

① 创建新工程。鼠标左键单击主菜单Project一>New Project.弹出。Create New Project"对话框,用鼠标选择你要保存工程的文件夹(如FAexam),输入新工程名(如"exam")。单击"保存"按键。

② 在随后弹出的CPU型号设置对话框中选择单片机的型号(如"AT89C51"),单击"确定"完成。

2、建立源程序文件并加入工程

① 鼠标左键单击菜单。File一>New新建文件。

弹出图1窗口。自动进入编辑工作模式。

<图1 源程序文件的建立与编辑

② 在文本窗口中输入和编辑用户的源程序。

【项目任务】设计一种花样彩灯程序,实现单片机P1口驱动相连的8个发光二极管依次循环点亮。

③ 单击菜单。File一>Save as.弹出文件保存对话框,选择工程文件夹("F:\exam")。输入源程序文件名(如"exam.asm"),点击"保存"按钮。

注意汇编源程序的扩展名必须为asrn,C51源程序扩展名必须为*.C.

④ 将源程序加入工程。用鼠标点击图标"Target1"前的"+"号,展开后右键单击Source Group弹出快捷菜单,点击"Add File to Group'SourceGroup 1"项弹出源程序加入工程对话框。选择刚保存的用户源程序exam.asm,点击ADD按钮加入工程,点击Close关闭对话框。

3、工程参数设置

用鼠标左键单击主菜单Project一>Options forTarget'Targetl弹出工程参数设置对话框。关于工程参数设置的内容很多,篇幅所限,这里仅介绍通常需要设置的三个参数:

① 设置CPU型号。前面已经进行了设置。

② 在设置对话框的"Target"标签下"Xtal(Mhz)"处输入单片机的晶振(如"12")如图2.

<图2单片机晶振的设置

③ 在设置对话框的"Output"标签下,选中"Create HEX file"项。用以编译生成可执行的机器码hex文件。如图3所示。该hex文件可以通过编程器写入或下载到单片机中运行。

<图3生成可执行hex文件的设置

4、编译源文件

鼠标左键单击主菜单Project一>Built target或快捷按钮编译文件。

若有语法错误,输出窗口将有相应提示信息。

双击提示信息行,光标会停留在源程序出错处。如图4所示。经检查发现:本程序第3条DJNZ指令被错误输入成了DJNA.用户可根据提示修改源程序,然后再次编译。注意。Keil具有语法检查功能,源程序中正确的指令关键词将变颜色,没变色的为输入错误,方便用户查找语法错误。

<图4源文件的编译

若编译后输出信息窗13显示"0 Errors(s),0Warning(s)",则说明源程序的语法错误已经全部排除。注意:有Errors不能Debug,也不产生HEX码,有Warning是允许的,可以运行。

5、调试程序

源程序编译通过,表明语法正确,却并不能保证该程序能够正确运行。还需要对其逻辑功能进行调试。Keil软件具有很强的软件仿真功能。

鼠标左击主菜单Debug一>Sta/Stop Debug Session子菜单或调试/编辑模式切换按钮。进入调试程序工作模式,软件窗口如图5所示。重复点击该按钮可以实现在编辑模式和调试模式之间进行切换。

<图5程序调试运行

调试程序时的程序运行控制按钮从左到右依次为复位、连续运行,暂停、单步、过程单步、执行完当前子程序、运行到光标当前行。复位按钮模拟芯片的复位,它将使程序回到最开头处执行。当程序处于停止状态时复位才有效,程序处于运行状态时停止按钮才有效。

① 为了方便观察程序调试过程中各变量和RAM单元的中间结果。点击主菜单View一>Watch&Call Stack Window和View一>Memory Window打开观察变量窗13和存储器窗1:3进行显示。由于本例还要观察P1 13的输出变化,可以点击主菜单Peripherals一>I/O-Ports一>Port 1打开I/O 13 P1的观察窗13.




② 程序调试。

程序可以单步执行或连续执行。连续执行是指一条指令执行完后接着连续立即执行下一条,中间不停止。这样程序执行的速度很快。可以看到程序执行的总体效果。即最终结果是正确或错误。但如果程序有错,则难以确认具体出错地方。例如本例中点击连续运行按钮后。P1口输出01H后便始终保持不变。这显然与花样彩灯程序的循环显示要求不符。程序运行出错,如图6所示。


<图6程序调试时的连续运行

单步执行指每执行完一条指令后即停止。等待命令执行下一行程序,此时可以观察该条指令执行后得到的实际结果。对比分析是否与预期结果一致。

借此可以找到程序中的错误原因所在。这种方式的缺点是需要时间长,排查错误效率很低。尤其当程序很大时。

因此,对于用户确认没有错误的程序段可以采用连续运行。对怀疑出错或容易出错的地方则单步执行。对比排查错误。这样调试的效率将会高一些。

本例通过单步执行。发现程序运行过程中循环变量R3的值总在250和249之间变化,而且R1、R2、R7均始终无变化,如图7所示。对比程序分析,发现出现了死循环。原因在于第1条"DJNZR3,DEL2"的转移目的地址为DEL2,应该改为DEL3.

<图7程序调试时的连续运行

回到编辑状态,修改为"DJNZ R3,DEL3",编译后再次进入调试工作模式时,发现故障已经排除。

此时P1 1:3的输出仅1位高电平。且依次向左循环移位。R1、R2、R3、R7正常递减变化。如图8所示。

<图8花样彩灯程序调试通过后的正确运行

③ 断点设置。

程序调试时。一些程序行必须满足一定的条件才能被执行到(如程序中某变量达到一定的值、按键被按下、有中断产生等),这些条件往往是异步发生或难以预先设定的。这类问题采用单步执行的方法是很难调试的。这时可使用另一种重要的调试方法一断点设置。可以使用Debug一>lnsert/RemoveBreakPoint设置或移除断点。

断点设置的方法有多种,常用的是在某一程序行设置断点,设置好断点后可以连续运行程序。一旦执行到该程序即停止,可在此观察有关变量值,对比分析程序预期理想值,以确定问题所在。

三、结束语

程序开发过程中通常情况下需要综合运用单步执行、连续执行、设置断点、观察变量等各种程序调试方法。并不断积累总结调试经验。这种程序调试能力也是衡量软件开发者水平高低的标志之一。

文章来源 :博客园

围观 842
订阅 RSS - Keil