機(jī)電之家資源網(wǎng)
單片機(jī)首頁(yè)|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開(kāi)發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開(kāi)發(fā)
培訓(xùn)信息
贊助商
keil 使用筆記
keil 使用筆記
 更新時(shí)間:2008-8-17 16:33:58  點(diǎn)擊數(shù):12
【字體: 字體顏色
在Memory窗口上輸入address_type:address才能看到正確地址的變量
debug~perfermance analyzer加入要察看的模塊名稱,然后view~perfermance analyzer
window 可以察看各個(gè)模塊運(yùn)行時(shí)間
①Display address_type:address
B:Bit address
C:Code Memory
Bx:Code Bank
D D:80H 命令可以查看特殊寄存器 data
D I:0 命令可以查看內(nèi)部RAM數(shù)據(jù)iData;
D X:0 命令可以查看外部RAM數(shù)據(jù)xData;

②R1 //顯示R1 register
~R1 //顯示變量R1
R1 = R7 //對(duì)寄存器Rx操作
R1 = --R7
R1 = 0x20

③main //顯示main()的開(kāi)始地址
d main //顯示main()的代碼

④向RAM.ROM中寫(xiě)數(shù)據(jù)
Enter data_type address_type:address expr,expr....
data_type:int char double float long

E char data:0x20 1,2,3,4 //向data區(qū)0x20開(kāi)始的地址寫(xiě)1,2,3,4


變量放在RAM的30H,要把定義放在main前面!另外特別注意,內(nèi)部RAM通常供C程序存放中
間變量等,所以一定要看看編譯后的程序中是否存在存儲(chǔ)單元沖突的情況,比如如果程序中
使用了別的寄存器組的話,08-1FH單元就不能用了
unsigned long data i _at_ 0x30


如何用Keil的uVision2仿真外部中斷?
方法一:調(diào)試狀態(tài)下,打開(kāi)PeriPherals->I/O PORTS->P3 用鼠標(biāo)將相應(yīng)的端口變高或低即
可產(chǎn)生中斷

方法二:在命令窗口中輸入DEFINE BUTTON "INTERUPT","P3=0XFE"
然后打開(kāi)TOOLBOX,即可以看見(jiàn)按鈕INTERUPT,按下按鈕即可
Define Button "button_label","command"
注意:Define Button "show R5 Register","printf(\"R5=%04xh\\n\")"
kill button x //x為按鈕在toolbox上位置

方法三:用調(diào)試函數(shù),可參考uv2\hlp\gs51.pdf第五和第六章
信號(hào)函數(shù)寫(xiě)在一個(gè)ini文件中,調(diào)試主程序時(shí)用debug-Function Editor調(diào)入,
會(huì)有一個(gè)框出現(xiàn),可在里面修改,然后complie。也可以在debug狀態(tài)下include
調(diào)入。file.ini里面的內(nèi)容是debug command和function definitions,
可以用kill命令結(jié)束。

functiong definition可以是以下幾種:
㈠系統(tǒng)預(yù)定功能 printf getin等
㈡用戶定義功能 即用戶自己寫(xiě)的函數(shù),如FUNC void MyStatus(void)
㈢信號(hào)函數(shù)。用戶程序運(yùn)行時(shí)后臺(tái)運(yùn)行,模擬外部的信號(hào)輸入,可同時(shí)有64個(gè)。

dir bfunc //察看所有預(yù)定功能predefined
dir ufunc //察看所有用戶功能user
dir singal //察看所有信號(hào)函數(shù)singal
dir func //看所有的


㈠系統(tǒng)預(yù)定功能 printf getin等
void exec (“command_string”) //在用戶和信號(hào)函數(shù)里面調(diào)用keil的調(diào)試命令
如:exec (“BS timer0”)


double getdbl(“prompt_string”) //跳出一窗口提示輸入數(shù),返回,如無(wú)則返回0
int getint(“prompt_string”)
long getlong(“prompt_string”)
如:age = getint(“Enter your age”)

void memset(start_address,ulong length,uchar value) //用指定的數(shù)填充一段內(nèi)存
如memset(0x2000,0x1000,’a’)

void printf(“format_string”,value) //從serial窗口輸

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


int rand(int seed) //產(chǎn)
生隨機(jī)數(shù),seed為0時(shí)還原


void twatch(long states) //等待n個(gè)clock,只能被
singal函數(shù)調(diào)用
void swatch(float seconds) //如swatch(0.5)
void rwatch(address) //rwatch(X:0x1234) 一直等待直到X:0x1234被讀
void wwatch(address) //一直等待直到X:0x1234被寫(xiě)

如 twatch (200000); // 200000 Cycles Time-Break
twatch(CLOCK); //wait for 1 seconds


_wbyte(address,uchar value) //向指定的內(nèi)存寫(xiě)數(shù)據(jù) _wbyte
(0x2000,0x55)
_wword(address,uint value)
_wdword(address,ulong value)
_wfloat(address,float value)
_wdouble(address,double value)
㈡用戶定義功能 即用戶自己寫(xiě)的函數(shù),不能調(diào)用singal函數(shù)和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");
}


㈢信號(hào)函數(shù)。用戶程序運(yùn)行時(shí)后臺(tái)運(yùn)行,模擬外部的信號(hào)輸入,可同時(shí)有64個(gè)。
當(dāng)調(diào)用twatch()時(shí)進(jìn)入idle狀態(tài),一個(gè)signal函數(shù)返回值必須是void,最多8個(gè)參數(shù),能夠
調(diào)用predefine和user函數(shù),但不能調(diào)用其它信號(hào)函數(shù),能被uesr函數(shù)調(diào)用,至少調(diào)用
twatch一次,用ctrl+c終止它。
Signal state //察看當(dāng)前活動(dòng)的信號(hào)函數(shù)
Signal kill signal_name //殺掉活動(dòng)的

Singal void func_name(para_list)
{
statements
}
例子1:singal void stuffsin(void)
{
while(1)
{
sin = ‘A’;
twatch(100000);//每隔100000個(gè)cpu states就輸出
個(gè)’A’
}

}

例子2:
signal void check_p20(void) //一個(gè)沒(méi)有調(diào)用twatch()的信
號(hào)函數(shù)用法
{
if(PORT2 & 1)
{
printf("Led is on\n");
}
else
{
printf("led is off\n");
}

}

然后設(shè)置斷點(diǎn):
bs write PORT2,1,"check_p20()"如果有寫(xiě)p2的動(dòng)作則會(huì)執(zhí)行這個(gè)
signal函數(shù)。


這里注意write和read
例如:unsinged int data value;
value = P1;
P2 = value;

此時(shí)bs read PORT1,1,"PORT1 = getint(\"input value\")"
bs write PORT3,1,"printf(\"port3 value=%x\\n\",port3)"
執(zhí)行后會(huì)跳出窗口讓你輸入p1的值,然后輸出p3的值。


如何仿真串口輸入:ASSIGN WIN2 S1OUT(如果你在DeviceDatabase選的單片機(jī)類型
有第二個(gè)串口,否則WIN2也都是NUL,如果選擇的單片機(jī)類型沒(méi)有第二串口,是沒(méi)有S1IN和
S1OUT這兩個(gè)虛擬寄存器的,你可以通過(guò)dir vtreg命令查看當(dāng)前的定義了的虛擬寄存器值)

peripherals->serial channel中令SBUF = 0x55是指發(fā)送即時(shí)數(shù)給發(fā)送寄存
器,若要從串行口讀入數(shù)據(jù),在命令行中輸入sin=你的數(shù)據(jù)即可向串行口送入數(shù)據(jù).窗口中
SBUF中的數(shù)據(jù)是發(fā)送寄存器中的數(shù)據(jù),不是接收寄存器中的數(shù)據(jù)!

單片機(jī)串口指向到了PC機(jī)的串口上,這樣就可以在pc機(jī)的環(huán)境下模擬單片機(jī)對(duì)外部設(shè)備的操
作了,此時(shí)把pc串口和外設(shè)連接,此時(shí)pc的串口 = 你單片機(jī)的串口。注意:模擬單片機(jī)運(yùn)行
時(shí),單片機(jī)串口速率是由MODE命令來(lái)指定的,和C程序中對(duì)SMOD,TH1的值無(wú)關(guān)(但是在燒寫(xiě)到
單片機(jī)上時(shí),smod,th1要設(shè)定好)。Serial#1上面的是單片機(jī)發(fā)出的數(shù)據(jù)。
Command_line上輸入sin=value,value是模擬外設(shè)傳過(guò)來(lái)的數(shù)據(jù)。s

printf是從串口輸出的(當(dāng)然也可以改寫(xiě)putchar函數(shù)),可以用根串口線鏈接計(jì)算機(jī)的
COM1,COM2,這是針對(duì)有兩個(gè)串口接口的計(jì)算機(jī),然后在DEBUG模式的命令行加下兩句:
MODE COM1 19200,0,8,1
ASSIGN COM1 SOUT
然后打開(kāi)一個(gè)串口調(diào)試的軟件,對(duì)應(yīng)串口COM2,19200,0.就可以看到結(jié)果了

mode com2 9600,0,8,1 //無(wú)校驗(yàn)位,8位數(shù)據(jù)位,1個(gè)停止位
assign com2 sout
stime = 0

Assign winsout //意思就是uVision 把模擬的單片機(jī)串口對(duì)應(yīng)到Serial window
和#2上(在serial window里輸入字符,就是模擬對(duì)單片機(jī)串口輸入數(shù)據(jù))
  • 上一篇: 單片機(jī)系統(tǒng)為了省電,經(jīng)常要進(jìn)入掉電(POWER DOWN)狀態(tài),此時(shí)單片機(jī)的I/O口的PIN應(yīng)設(shè)置為何種狀態(tài)能獲得最低功耗?
  • 下一篇: 能產(chǎn)生模擬輸出信號(hào)的微處理器
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁(yè)  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營(yíng)許可證:浙B2-20080178-1