在调试的过程中,时常需要查看寄存器值,以确认配置是否正常写入或者手动修改某些位。
支持的交互方式列举如下。
无论是哪种交互方式,都要注意
|
1、通过svc文件。将芯片对应的svc文件加入到工程(部分驱动库已经包含在chip目录下)。
● 打开Peripherals Pane的视图
● 进入调试界面,选择要查看的外设。toggle点击可以取消查看。
● 调试界面可以看到对应外设的寄存器内容
2、通过Frame Pane中的Memory tab。如果您手中暂时没有svc文件,也可以通过查看memory区内容获得寄存器状态。
● 确保Frame Pane处于打开状态。
● 对照芯片使用手册,查询外设基地址。
● 定位Memory地址。如下图。寄存器地址为基址+Offset值。
如果代码要用math库中的函数,需要做
1、文件中 #include
2、修改link tab的内容。将连接类型改成whole-archive,并在link flags中增加 -lm,如下图所示:
如果不小心关闭了一些显示窗口,比如调试时的汇编窗口、Frame Info窗口、Debugger窗口……,找不到恢复地方可以使用一键恢复默认显示。
1.点击菜单栏中的“Windows”,再点击“Reset View to Defaults”
如何实现变量的绝对定位
CDK编译环境使用了GNU C Complier,简称GCC。GCC使用ld脚本对代码对象进行链接,将多个输入文件整合成一个输出文件。
在一些特殊的场合,我们需要对代码中的一些内容实现精确的定位。
这里我们分两个方面来介绍,分别是变量的绝对定位和函数(代码段)的绝对定位。
假设要实现将wData[] 放到程序存储区 0x9000的位置。需要做以下两个操作
1. 首先在代码文件中,将变量归入某个section,这个例子里是FlashData段。
__attribute__((section(".FlashData"))) const uint32_t wData[] = {0x1, 0x2}; //在这种绝对定位的情况下,关键字 const 不是必须的。
< /FONT >
< P > 2. 其次,要对ld文件进行修改。增加以下内容,将FlashData段起始地址定位在0x9000。
.FlashData 0x9000:
{
. = ALIGN(0x4)
;
*(.FlashData)
*(.FlashData.*)
} > ROM
再重新编译,就可以在map文件上看到:
有时候,会希望有一些代码可以快速取址并运行。其中一个实现的方法是把函数定位到RAM区。
假设要实现将function() 放到RAM。需要做以下两个操作:
1. 首先在代码文件中,将函数归入某个section,这个例子里是codeinram段。
__attribute__((section(".codeinram"))) void function1(void);
2. 其次,要对ld文件进行修改。
1、如果拿到的库程序第一次编译报错,错误提示如下:
这是因为库发布时带了一些编译选项,点击CDK“清除”快捷按钮清除一下工程,再重新编译即可。
1、芯片放在烧录器上烧写时需关注芯片放置的位置,有没有放反等等。
2、芯片在板烧写时,需要注意
● 烧写需要用到的5个信号(VDD,VSS,SWD,SWCLK,RST)有没有都连到烧写器上
● VDD和VSS之间的电容有没有超过100uF,超过的话可能需要在烧录器这边的VDD和VSS之间并个小电容(如500ohm)来对板子上的大电容进行放电
● SWD,SWCLK和RST线的路径上有没有串电阻或并电容,这些都会影响烧写时序。电路设计时要尽量避免这样的电路。 如果应用上不得不有这些阻容,电容<101pF,电阻<1Kohm
1、 可能的原因是没有选择正确的下载文件,或者下载文件的长度为0。
当遇到CDK环境下可以烧录代码,但是拿到烧录器上反而提示烧录失败的现象时,请检查:
ihex文件的大小是不是超过了芯片的最大DROM size?
如果超过了,再检查ld文件,是不是出现了段定义错误?如下面ROM段的LENGTH。
MEMORY
{
ROM(RX) : ORIGIN = 0x00000000, LENGTH = 64K
RAM(RWX) : ORIGIN = 0x20000000, LENGTH = 4K
}