1. gzyueqian
      13352868059
      首頁 > 新聞中心 > > 正文

      keil 使用筆記

      更新時間: 2006-03-06 16:09:42來源: 粵嵌教育瀏覽量:2798

      在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里輸入字符,就是模擬對單片機串口輸入數據)

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 婷婷六月在线视频中文字幕 | 麻豆91青青国产在线观看 | 一区二区三区AV大片 | 一区二区三区四区不长视频 | 亚洲美女视频免费爽 | 亚洲Ⅴa制服丝袜一区二区三区 |