keil 使用笔记 (经典)

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<enter>   //显示R1 register
  ~R1<enter>  //显示变量R1
  R1 = R7<enter> //对寄存器Rx操作
  R1 = --R7<enter>
  R1 = 0x20<enter>

③main<enter> //显示main()的开始地址
  d main<enter> //显示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"<enter>
   注意:Define Button "show R5 Register","printf(/"R5=%04xh//n/")"
kill button x<enter> //x为按钮在toolbox上位置

  方法三:用调试函数,可参考uv2/hlp/gs51.pdf第五和第六章
信号函数写在一个ini文件中,调试主程序时用debug-Function Editor调入,
会有一个框出现,可在里面修改,然后complie。也可以在debug状态下include
<file.ini><enter>调入。file.ini里面的内容是debug command和function definitions,
可以用kill命令结束。

functiong definition可以是以下几种:
㈠系统预定功能    printf  getin等
㈡用户定义功能    即用户自己写的函数,如FUNC void MyStatus(void)
㈢信号函数。用户程序运行时后台运行,模拟外部的信号输入,可同时有64个。

dir bfunc<enter> //察看所有预定功能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<cr> //察看当前活动的信号函数
Signal kill signal_name<cr> //杀掉活动的

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()"<enter>如果有写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 <S1IN>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 <SIN>SOUT
然后打开一个串口调试的软件,对应串口COM2,19200,0.就可以看到结果了


mode com2 9600,0,8,1<enter> //无校验位,8位数据位,1个停止位
assign com2 <sin> sout<enter>
stime = 0<enter>





Assign win<sin>sout     //意思就是uVision 把模拟的单片机串口对应到Serial window
和#2上(在serial window里输入字符,就是模拟对单片机串口输入数据)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用STM32F103C8T6蓝牙控制智能小车,我们可以使用Keil5作为开发工具。下面是关于如何进行学习并使用Keil5来开发的学习笔记。 1. 准备工作: - 下载并安装Keil5开发工具 - 配置好STM32F103C8T6开发板的硬件环境 2. 创建新的项目: - 在Keil5中选择“Project”->“New Project”菜单,选择合适的项目目录和名称 - 选择“Target”->“STM32F1 Series”->“STM32F103C8T6”作为目标设备 - 在“Manage”选项卡下,选择我们需要的库文件,比如蓝牙库文件 - 点击“Add”将库文件添加到项目中,然后点击“OK”完成项目创建 3. 编写代码: - 在Keil5的项目窗口中,找到我们创建的主要源文件,例如“main.c” - 在这个文件中,我们可以使用C语言来编写控制智能小车的代码,利用蓝牙模块进行通信和控制 - 通过蓝牙模块接收控制指令,并根据指令进行相应的运动控制 4. 编译和烧录: - 在Keil5的工具栏中,点击“Build”按钮进行编译,确保代码没有错误 - 将开发板连接到计算机,并在Keil5的工具栏中点击“Flash”按钮进行烧录程序到开发板 5. 测试与调试: - 在Keil5的工具栏中选择“Debug”->“Start/Stop Debug Session”,进入调试模式 - 可以使用调试功能来观察程序的运行状态,查找和修复错误 - 使用蓝牙设备(例如手机或电脑)来连接蓝牙模块,并发送控制指令,观察智能小车的运动情况 以上是关于如何使用Keil5来开发STM32F103C8T6蓝牙控制智能小车的学习笔记。希望这些信息可以帮助你开始学习和开发该项目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值