分享

Keil调试命令(转载)

 戴维图书馆 2014-09-18

在Memory窗口上输入address_type:address才能看到正确地址的变量

debug~perfermance analyzer加入要察看的模块名称,然后view~perfermance analyzer

window 可以察看各个模块运行时间

①Display address_type:address

B:Bit address

C:Code Memory

Bx:Code Bank

D D:80H 命令可以查看特殊寄存器 data

D I:0 命令可以查看内部RAM数据iData;

D X:0 命令可以查看外部RAM数据xData;

②R1 //显示R1 register

~R1 //显示变量R1

R1 = R7 //对寄存器Rx操作

R1 = --R7

R1 = 0x20

③main //显示main()的开始地址

d main //显示main()的代码

④向RAM.ROM中写数据

Enter data_type address_type:address expr,expr....

data_type:int char double float long

E char data:0x20 1,2,3,4 //向data区0x20开始的地址写1,2,3,4

变量放在RAM的30H,要把定义放在main前面!另外特别注意,内部RAM通常供C程序存放中

间变量等,所以一定要看看编译后的程序中是否存在存储单元冲突的情况,比如如果程序中

使用了别的寄存器组的话,08-1FH单元就不能用了

unsigned long data i _at_ 0x30

如何用Keil的uVision2仿真外部中断?

方法一:调试状态下,打开PeriPherals->I/O PORTS->P3 用鼠标将相应的端口变高或低即

可产生中断

方法二:在命令窗口中输入DEFINE BUTTON "INTERUPT","P3=0XFE"

然后打开TOOLBOX,即可以看见按钮INTERUPT,按下按钮即可

Define Button "button_label","command"

注意:Define Button "show R5 Register","printf(\"R5=%04xh\\n\")"

kill button x //x为按钮在toolbox上位置

方法三:用调试函数,可参考uv2\hlp\gs51.pdf第五和第六章

信号函数写在一个ini文件中,调试主程序时用debug-Function Editor调入,

会有一个框出现,可在里面修改,然后complie。也可以在debug状态下include

调入。file.ini里面的内容是debug command和function definitions,

可以用kill命令结束。

functiong definition可以是以下几种:

㈠系统预定功能 printf getin等

㈡用户定义功能 即用户自己写的函数,如FUNC void MyStatus(void)

㈢信号函数。用户程序运行时后台运行,模拟外部的信号输入,可同时有64个。

dir bfunc //察看所有预定功能predefined

dir ufunc //察看所有用户功能user

dir singal //察看所有信号函数singal

dir func //看所有的

㈠系统预定功能 printf getin等

void exec (“command_string”) //在用户和信号函数里面调用keil的调试命令

如:exec (“BS timer0”)

double getdbl(“prompt_string”) //跳出一窗口提示输入数,返回,如无则返回0

int getint(“prompt_string”)

long getlong(“prompt_string”)

如:age = getint(“Enter your age”)

void memset(start_address,ulong length,uchar value) //用指定的数填充一段内存

如memset(0x2000,0x1000,’a’)

void printf(“format_string”,value) //从serial窗口输

如:printf(“%s for %d”,uvision2,51) //输出uvision2 for 51

int rand(int seed) //产

生随机数,seed为0时还原

void twatch(long states) //等待n个clock,只能被

singal函数调用

void swatch(float seconds) //如swatch(0.5)

void rwatch(address) //rwatch(X:0x1234) 一直等待直到X:0x1234被读

void wwatch(address) //一直等待直到X:0x1234被写

如 twatch (200000); // 200000 Cycles Time-Break

twatch(CLOCK); //wait for 1 seconds

_wbyte(address,uchar value) //向指定的内存写数据 _wbyte

(0x2000,0x55)

_wword(address,uint value)

_wdword(address,ulong value)

_wfloat(address,float value)

_wdouble(address,double value)

㈡用户定义功能 即用户自己写的函数,不能调用singal函数和twatch(),可用KILL

FUNC function_name杀之

FUNC return_type function_name(parameter_list)

{

statments

}

/*-------------------------------------------*/

/* Function MyRegs() shows Registers R0...R3 */

/*-------------------------------------------*/

FUNC void MyRegs (void)

{

printf ("---------- MyRegs() ----------\n");

printf (" R0 R1 R2 R3\n");

printf (" %02X %02X %02X %02X\n",R0,R1,R2,R3);

printf ("------------------------------\n");

}

㈢信号函数。用户程序运行时后台运行,模拟外部的信号输入,可同时有64个。

当调用twatch()时进入idle状态,一个signal函数返回值必须是void,最多8个参数,能够

调用predefine和user函数,但不能调用其它信号函数,能被uesr函数调用,至少调用

twatch一次,用ctrl+c终止它。

Signal state //察看当前活动的信号函数

Signal kill signal_name //杀掉活动的

Singal void func_name(para_list)

{

statements

}

例子1:singal void stuffsin(void)

{

while(1)

{

sin = ‘A’;

twatch(100000);//每隔100000个cpu states就输出

个’A’

}

}

例子2:

signal void check_p20(void) //一个没有调用twatch()的信

号函数用法

{

if(PORT2 & 1)

{

printf("Led is on\n");

}

else

{

printf("led is off\n");

}

}

然后设置断点:

bs write PORT2,1,"check_p20()"如果有写p2的动作则会执行这个

signal函数。

这里注意write和read

例如:unsinged int data value;

value = P1;

P2 = value;

此时bs read PORT1,1,"PORT1 = getint(\"input value\")"

bs write PORT3,1,"printf(\"port3 value=%x\\n\",port3)"

执行后会跳出窗口让你输入p1的值,然后输出p3的值。

如何仿真串口输入:ASSIGN WIN2 S1OUT(如果你在DeviceDatabase选的单片机类型

有第二个串口,否则WIN2也都是NUL,如果选择的单片机类型没有第二串口,是没有S1IN和

S1OUT这两个虚拟寄存器的,你可以通过dir vtreg命令查看当前的定义了的虚拟寄存器值)

peripherals->serial channel中令SBUF = 0x55是指发送即时数给发送寄存

器,若要从串行口读入数据,在命令行中输入sin=你的数据即可向串行口送入数据.窗口中

SBUF中的数据是发送寄存器中的数据,不是接收寄存器中的数据!

单片机串口指向到了PC机的串口上,这样就可以在pc机的环境下模拟单片机对外部设备的操

作了,此时把pc串口和外设连接,此时pc的串口 = 你单片机的串口。注意:模拟单片机运行

时,单片机串口速率是由MODE命令来指定的,和C程序中对SMOD,TH1的值无关(但是在烧写到

单片机上时,smod,th1要设定好)。Serial#1上面的是单片机发出的数据。

Command_line上输入sin=value,value是模拟外设传过来的数据。s

printf是从串口输出的(当然也可以改写putchar函数),可以用根串口线链接计算机的

COM1,COM2,这是针对有两个串口接口的计算机,然后在DEBUG模式的命令行加下两句:

MODE COM1 19200,0,8,1

ASSIGN COM1 SOUT

然后打开一个串口调试的软件,对应串口COM2,19200,0.就可以看到结果了

mode com2 9600,0,8,1 //无校验位,8位数据位,1个停止位

assign com2 sout

stime = 0

Assign winsout //意思就是uVision 把模拟的单片机串口对应到Serial window

和#2上(在serial window里输入字符,就是模拟对单片机串口输入数据)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多