keil 使用笔记

发布者:ping777最新更新时间:2015-03-12 来源: laogu关键字:keil  使用笔记 手机看文章 扫描二维码
随时随地手机看文章
在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上位置

方法三:用调试函数,可参考uv2hlpgs51.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() ---------- ");
printf (" R0 R1 R2 R3 ");
printf (" %02X %02X %02X %02X ",R0,R1,R2,R3);
printf ("------------------------------ ");
}
[page]

㈢信号函数。用户程序运行时后台运行,模拟外部的信号输入,可同时有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 ");
}
else
{
printf("led is off "); 
}

}

然后设置断点:
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里输入字符,就是模拟对单片机串口输入数据)
关键字:keil  使用笔记 引用地址:keil 使用笔记

上一篇:在嵌入式开发中软件抗干扰有哪些问题?如何解决?
下一篇:IIC总线模拟程序

推荐阅读最新更新时间:2024-03-16 13:54

51单片机学习笔记2.动态数码管的使用
原理图 内容 74HC138译码器 数码管 公共端 - 位选线 连在一起的段线 - 段选线 通过控制在不同位选线 不同的段选线通电(段选数据不同)以达到在不同位置显示不同数字的目的 具体看单片机原理图即可 动态显示其实一个时刻只点亮一个数字,在24ms内点亮下一个就会看成是同时亮的 代码 首先是一段转码用的 u8 code smgduan ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//最高位为小数点,如果需要点亮小数点只需 | (0x80)或是 | 128 然后是显示用的函数
[单片机]
51单片机学习<font color='red'>笔记</font>2.动态数码管的<font color='red'>使用</font>
STM32复习笔记(十)LCD的介绍和使用方法
声明:本篇文章只是个人知识盲区、知识弱点、重点部分的归纳总结,望各位大佬不喜勿喷。梳理顺序是按照正点原子的视频和文档的实际顺序梳理,转载请注明出处。 作者:sumjess 适用:这个视频我已经看过3遍了,总会有忘记的,所以来写这本书的随手笔记,记录重点、易忘点。该博客可以当做字典,也可以当做笔记。 目前内容:LCD的介绍和使用方法 一、TFTLCD驱动原理-TFTLCD简介: (1)介绍TFTLCD: TFTLCD即薄膜晶体管液晶显示器。它与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提
[单片机]
STM32复习<font color='red'>笔记</font>(十)LCD的介绍和<font color='red'>使用</font>方法
STM32F4串口接收(HAL库)使用笔记
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); 这个是一个类似于串口接收中断使能作用的函数,注释是Receives an amount of data in non blocking mode以非阻塞方式接收大量数据。想要使用此函数接收却不确定能接收到多少数据,则将uint16_t Size写作1,例如: HAL_UART_Receive_IT(&UartHandle1, (uint8_t *)Rx1Buffer, 1);//通过串口1接收,数据保存到Rx1Buffer,每次接收
[单片机]
Keil MDK STM32系列(三) 基于标准外设库SPL的STM32F407开发
概述 Windows下使用Keil MDK5进行 STM32F407VET6 的开发和编译, 配合ST-LINK工具进行烧录, 使用标准外设库SPL. STM32F407硬件环境 主要参数 STM32F407VET6 Arm Cortex-M4 168MHz Max Clock Speed 512k flash 192k ram LQFP 100 pins Backup SRAM 4k STM32F407VET6 Black Board 开发板 具体说明可以查看 https://stm32-base.org/boards/STM32F407VET6-STM32-F4VE-V2.0.html ST-Link 编程器 使用
[单片机]
<font color='red'>Keil</font> MDK STM32系列(三) 基于标准外设库SPL的STM32F407开发
51单片机学习笔记:使用DS1302芯片制作电子钟
百度ds1302 写道 DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。 DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或V
[单片机]
51单片机学习<font color='red'>笔记</font>:<font color='red'>使用</font>DS1302芯片制作电子钟
Keil C51库函数参考
Keil C51 库函数 Keil C51库函数参考 C51强大功能及其高效率的重要体现之一在于其丰富的可直接调用的库函数,多使用库函数使程序代码简单,结构清晰,易于调试和维护,下面介绍C51的库函数系统。 第一节 本征库函数(intrinsic routines)和非本征库函数 C51提供的本征函数是指编译时直接将固定的代码插入当前行,而不是用ACALL和LCALL语句来实现,这样就大大提供了函数访问的效率,而非本征函数则必须由ACALL及LCALL调用。 C51的本征库函数只有9个,数目虽少,但都非常有用,列如下: _crol_,_cror_:将char型变量循环向左(右)移动指定位数后返回 _iror_,_irol_
[单片机]
Keil uVision4 代码编辑器中文字符乱码问题
MDK-ARM 使用中一直有个很纠结的问题,中文字符支持不好。 比如写代码注释,使用中文删除字符就会只删除一半问题。复制粘贴代码中间有中文就会出现乱码问题。 想过换IAR,新学个IDE也麻烦,上面的问题也不很大稍微绕一下也能解决,所以一直没换。 发现其实这个根本不是问题,安装好后默认是ANSI编码,所以会出现上述问题。只要把编码改成UTF-8编码就能解决上述烦恼。 设置步骤: 1、选择菜单: - 2、页签 中 General Editor Settings 的Encoding 改为 Encode in UTF-8 without signature 注:建议修改为UTF-8 通用性比较好,不管在那里打开代码都不
[单片机]
<font color='red'>Keil</font> uVision4 代码编辑器中文字符乱码问题
keilC51 idata xdata pdata code bdata的意思
从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型,使用不同的存储器,将使程序执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率(此问题将在后面专门讲述)。与ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各种不同的模式对应不同的实际硬件系统,也将有不同的编译结果。 在51系列中data,idata,xdata,pdata的区别: data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved