久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4203|回復: 0
打印 上一主題 下一主題
收起左側

I am master!使用Nucleo334打造新一代的調試利器

[復制鏈接]
跳轉到指定樓層
樓主
     通常,我們調試一個芯片的時候,往往是編寫程序---下載---更改---下載。。。這種方法固然好,但是像我這樣的懶人不大喜歡,我喜歡找一種一勞永逸的方法來解決。于是,開始動手寫了這個I am Master!顧名思義,就是將Nucleo作為一個主機,與我們需要使用的軟件進行通信。可能這樣說你不是很理解,沒關系,下面還會一 一介紹的。
   電腦作為控制端,通過串口與我們的Nucleo進行通信,而Nucleo根據電腦發送的字符,解析,并且產生一定的時序,與我們需要使用的芯片進行通信。



    比如,電腦端通過串口向Nucleo發送 input 0 1 2,代表Nucleo需要將 0 1 2這三個引腳設置成為輸入狀態. 在我的程序中,將Nucleo左邊的A0~A5作為IO部分,分別對應編號0-5。可以用于執行比較簡單的任務。

注意:為了保證電腦端有一個良好的人機界面,大家務必使用能夠滿足linux終端要求的串口軟件。比如puTTy,smartty。或者是超級終端。像一般的串口軟件無法完成這個項目的要求。因為他們不能夠改變字體的顏色。這里推薦大家使用smarTTY,如果使用puTTY的話需要更改我上傳的程序。因為當我們按下Enter的時候,puTTY發送的是'',而smarTTY發送的是''。在附件中有最新的smarTTY的安裝版軟件。

    如果在使用smarTTY的時候,發現換行符不能正確顯示,請進行這樣的設置:





版本更新介紹:

V1.0.0支持函數:

  • input
  • output
  • set
  • reset
  • toggle
  • read
  • spi
  • spi-config
  • man

V1.0.1新增函數:
  • servo
  • i2c-online
  • i2c-write
  • i2c-read

V1.0.2更新說明:
  • 將i2c-online更改為i2c-scan
  • i2c-read命令新增參數-a 可以用于在讀取中指定一個寄存器地址。例如:從設備地址為0x90,寄存器地址為0x00的設備處讀取1個字節可以使用 i2c-read -d 0x90 -a 0x00 -r 1 。需要注意的是:如果寄存器地址多于1個字節,只能先使用先寫地址,在讀的方式。例如:從設備地址為0x90,寄存器地址為0x0100的設備處讀取1個字節只能分成兩部:(1) i2c-write -d 0x90 0x01 0x00  (2) i2c-read -d 0x90 -r 1
  • 新增函數clear,用于清屏。

V1.0.3更新說明:
  • 為了在STM32系列中的可移植性,進行了一些并無實際卵用的更新。新建了config.h頭文件。STM32F3系列的其余Nucleo包馬上就會放出。
  • 修復了在不輸入任何字符,僅按下回車的情況下,提示Unknow command的bug。
  
V1.0.4更新說明:
  • 上電之后SPI的模式被修改為模式0,時鐘為4Mhz。
  • SPI讀取(由-r參數指定的)數據被緩沖,使相臨兩次讀取的時間由原先的100us縮減為7us。                                                                                                               
  • 串口數據改為中斷輸入方式,使用RingBuffer(1KB)進行緩存。
  • 支持發送命令文件。即將所有要發送的命令寫入文件,每一條命令占用一行,通過smarTTY直接發送文件。具體的細節請參考本帖第6樓。


v2.0.0(重要更新)。
  • 優化代碼結構。如果僅僅為了使用,而不是閱讀代碼的話,那么這次更新并無卵用。
  • 不再使用占用大量CPU時間的printf,改為termiosXXX函數。
  • 從gcc庫中移植getopt。為命令行解釋提供了統一的方法。
  • shell函數解析的時候,將使用 "" 引起的字符作為一個參數。不管""內的字符是不是含有空格。例如:輸入spi [ "Hello world" 0x24 0xff ] ,經過shell解析傳給spi的命令參數為:argv[0]==spi , argv[1] =[ , argv[2] ="Hello world" ,argv[3]= 0x24, argv[4]=0xff, argv[5] = ] 。注意:"Hello world"是一個參數,不同于windows和linux,這里為參數保留了引號。
  • 修改spi-config,如果spi-config未提供任何參數,將顯示出現在spi的模式。包括模式,時鐘頻率,Msb/Lsb First。如果提供參數,將對參數進行解析。


吐槽,意見,或者建議請聯系(PS有沒有E語好的大神,幫忙翻譯一下man的說明部分):
qianfanguijin@163.com
qianfanguijin@gmail.com


版權聲明:
本軟件僅供與學習交流之用,未經允許,不得用于商業用途。

I am master v2.0.rar (2.3 MB, 下載次數: 8)
I am masterv1.0.0.rar (1.6 MB, 下載次數: 7)
I am masterv1.0.1.rar (2.22 MB, 下載次數: 7)
I am masterV1.0.2.rar (2.22 MB, 下載次數: 7)
I am masterV1.0.3.rar (2.22 MB, 下載次數: 7)
I am masterV1.0.4.rar (2.24 MB, 下載次數: 7)
master.hexV1.0.4hex文件.rar (21.51 KB, 下載次數: 7)
SmarTTY-2.0.rar (4.14 MB, 下載次數: 7)

--------------------------------------

使用入門:
  • 從附件中下載工程文件I am master 和 smarTTY軟件并解壓。
  • 打開工程,將hex文件下載至Nucleo334.將使用HSI作為時鐘源。
  • 打開smarTTY,新建一個串口通信,115200,8bit,無校驗,停止位1.

Nucleo通電之后,通過串口發送這樣的信息:

先來認識一個命令 man ,類似于linux中的man 。當你遇到某一個命令而不知道如何使用的時候,可以使用這個命令。比如獲取input這個命令的解釋:

這個命令的功能是將引腳設置成為輸入模式,引腳的范圍是0-5,對用Arduino接口的A0-A5.現在,我們在0號引腳上面掛接一個LED,在1號引腳上面掛在一個開關(平時為1,按下為0)。可以通過input,output兩條命令來切換他們的模式:



在將引腳設置成為輸出模式之后,就可以使用set,reset,toggle三條命令來設置引腳了。set是置1,reset是清零,toggle是反轉。如果引腳的模式是輸入模式,可以使用read來讀取。如果read的參數不是0-5范圍之內,那么顯示的數值就會用N來代替。例如read 0 1 255
==> 1 1 N
顯示0,1引腳的電平值為1,255是一個非法引腳。


其余命令的解釋大家可以使用man來查看。我的英語很不好,man的解釋大部分都是通過谷歌翻譯的。大家可以幫助修改一下源文件的翻譯,還請告知。謝謝!


在我們平時的調試中,光使用IO接口恐怕難以滿足我們的要求。還需要一些更復雜的通信協議,比如說SPI。下面我們就來說說SPI的使用。

不管什么時候,man總是我們靠譜的好朋友。

在SPI通信上,使用板子上面表示的SPI引腳。這里就不詳細解釋了。可以看一下板子上面的絲印。

spi的參數有著固定的要求:
  • [ 表示將CS信號線拉低。注意[也是一個參數,后面需要至少一個空格;
  • r:9表示從SPI總線上讀取多少個字符。后面的9代表讀取9個字符,需要使用十進制表示。
  • 其余的參數使用十六進制表示,不區分大小寫。前綴可以加0x,也可以不加。想FF,ff,0xFF表示的都是同一個數。
  • ] 表示將CS信號拉高。同樣 ] 也是一個參數,需要后面至少一個空格。

好了,就這么多,下面就來通過spi這條命令,讀寫SPI存儲芯片W25X16.他的數據手冊在附件中,大家可以下載學習一下。
先看W25的一個指令表:


在原PDF的第17頁。可以看到上面有一條指令是讀ID,解釋如下:


在面包板上面插好線之后,使用spi命令與之進行通信:

回應了兩個數字,0xEF,0x14,正好與上表的數據吻合。說明通信正確。

通過查看數據手冊可以看出,要想往一個地址內寫數據,首先要寫一個WriteEnable命令,在寫完WriteEnable命令之后,StatusRegister寄存器中相應的WEL為會被置1,說明允許寫。


在寫完WriteEnable命令之后,可以看到WEL位已經被置1了,說明操作正確。

下面將第一扇區格式化,之后往里寫如一些數據:

0x20是格式化命令,格式化命令之后WEL位被清零,說明不能在繼續寫數據。為了能夠繼續寫數據,只好在重新發送一遍WriteEnable命令了。

讀取一下格式化之后0x00處連續10個地址的數據:讀取的命令是0x03

數據全是0xFF,說明格式化成功了。下面再將0x00連續地址處寫如0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A十個數字,寫入之后再讀取:

這里寫入了10個數據,讀取了11個數據,可以看到第11個數據是0xff,也就是沒有被更改,寫入和讀取都正確。


好了,spi的操作就說到這里。
當然,你可能疑問,這使用了默認的模式3,如果我想使用模式0怎么辦呢?大家可以使用man spi-config尋找答案。


102801-0001R-SPIFlash.pdf (1.26 MB, 下載次數: 7)





一起來開發,定制你自己的命令

  可能你覺得這些命令遠遠不夠用,或者你希望定制一個你自己的命令,比如man 你的名字。其實,定制一個這樣的命令是一個很簡單的事情。
  在串口中接受到的字符,最終是要交給shell [void shell ( char * cmd_str) ; ]這個程序來處理的,這個程序將串口接收到的一行字符,在空格處分割,并且轉換成為int argc,char *argv[]的形式。這個形式是man函數的標準形式。argv[0]表示的需要調用的應用程序的名字。例如串口輸入input 0 1 2,經過shell的處理之后:
  • argc=4;
  • argv[0]="input"
  • argv[1]="0"
  • argv[2]="1"
  • argv[3]="2"
  • argv[4]=NULL

處理之后,shell去一個cmdList列表中尋找名字叫做input的函數。如果找到了,將控制權和argc,argv一起交給input函數。而input就是我們需要編寫的,只需要遍歷argv,讀取每一個引腳的編號,并且設置成為輸出即可。具體shell函數在cmdList中尋找input函數的方法在后文中會詳細講到。
下面是一個簡單的input函數的實現:
int input(int argc,char *argv[])
{
  int i=0;
  for(i=0;i<argc;i++)
  {
    //設置argv表示的引腳為輸入方式
  }
}

好了,下面就來說說定制命令的詳細步驟:
  • 每一個命令都需要一個入口函數,格式是int test (int argc,char *argv[])。
  • 每一個命令都需要一個解釋函數,用于man的調用。格式是void manTest(void);當然,函數的名字可以自己取。
  • 計算函數名字的hash,用于shell快速尋找函數的入口點。不過這個hash只是特別簡單的計算方法,在后續的更新中,會考慮更換他的計算方法。目前的方法主要是將函數的名字的各個字符異或(^ )。在工程文件下tools/computer_xor下有一個xor.exe,是用于計算hash的。只要在控制臺下調用這個程序,參數寫你需要求的字符串。例如:
  • 上面算出的test的hash值是0x16,記下這個數字,我們在后續中會使用到。
  • 打開commands.h,在里面添加兩個函數的聲明:test和manTest:
  • 打開commands.c文件,在cmdList中添加manTest和test:     
  • 新建一個源文件,test.c,并添加到工程中。寫上test和manTest兩個函數的實現:
  • 好了,目前一切需要做的已經做好了,編譯,下載,打開smarTTY,稍微測試一下:

更多更有趣的功能歡迎你來實現!



-----------------------------------------------------------------


在v1.0.1版本中,新增了四個命令,servo,用于控制舵機的。函數的參數在500~2500之間,代表在舵機的50000us中,高電平占用的時間。比如servo 1000代表高電平是1000us,占空比是1000/50000=2%。但是寫完之后發現控制舵機并沒有什么卵用。因此這里就不再多廢話了,主要是講如何使用I2C接口。

I2C
    STM32F1和STM32F4使用的I2C接口是一類,用起來各種復雜,不好用。但是STM32F3的I2C卻非常好用。之前看見有人說STM32的I2C是雞肋,只能說明他沒有用過STM32F3的。下面就說說I2C如何使用。主要操作的芯片是LM75,一個溫度傳感器。
首先介紹三個命令:
  • i2c-online:用于獲取掛接在I2C接口上所有芯片的設備地址。
  • i2c-write:將數據通過I2C接口發送出去。必須指定的參數:-d(設備地址)。
  • i2c-read:通過I2C接口讀取制定數量字節。必須指定的參數:-d(設備地址),-r(讀取的字節數)。
  • 注:在V1.0.2版本中,將命令i2c-online改名為i2c-scan
  • 注:在V1.0.2版本中,i2c-read新增參數-a,用于指定需要讀取的寄存器地址。


為了編寫程序的簡便,I2C的操作使用流的方式,即只能采用內置的通信方式(START,STOP)。不能指定RESTART。一般的I2C的讀取操作是 START+devAddr[Write]+regAddr+ReStart+devAddr[Read]+{some bytes}+STOP。由于不能采用ReStart,所以像這樣的讀取應該分成先寫在讀兩部分,即:
  • START+devAddr[Write]+regAddr+STOP
  • START+devAddr[Read]+{read some bytes}+STOP
  • devAddr代表設備地址
  • regAddr代表需要讀取或者寫入的寄存器地址。

我的I2C總線上掛接了一個LM75,但是我懶得查數據手冊去找他的設備地址,所以可以使用i2c-online查看所有在線的i2c設備的設備地址:

注:在V1.0.2種將i2c-online更改為i2c-scan,并根據設備地址添加了提示。如下圖。


通過這條命令查出了唯一的地址,0x90 。那么這個地址就是LM75的設備地址了。之后我們要進行的讀和寫的操作都要靠這個地址。其實這條命令的實現很簡單,只不過從0-127挨個詢問,看設備是否應達就行,通過邏輯分析儀抓包如下:(只截取了部分)



好了,有了地址就可以進行操作了,先來看看LM75的寄存器:

從上圖中可以看出,0x00是溫度寄存器的地址。要想讀這個地址處的數值,必須首先發送寄存器地址:



i2c-write必須要有-d參數,用于指示設備地址。其余的數據是要發送的數值。如果想通過i2c發送0x00 0x01 0x02 0x03 這四個數字可以使用這樣的命令:
  • i2c-write -d 0x90 0x00 0x01 0x02 0x03
  • i2c-write 0x00 0x01 0x02 0x03 -d 0x90
  • i2c-write 0x00 0x01 -d 0x90 0x02 0x03
  • ...

設備地址0x90必須緊跟在-d的后面。除了i2c-write的位置之外,出現在什么地方都是可以的。


在發送完寄存器地址之后,就可以讀取寄存器中的數值了。查看數據手冊,可以看到LM75的溫度寄存器由兩個字節組成。在發送的時候先發送高字節,在發送低字節。

之后將兩個字節合并成一個16位的有符號數字,數字使用2的補碼表示。正溫度有正的有符號數表示(最高為是0),負溫度的最高位是1 。之后將數據去掉符號右移5位,加上符號,乘以0.125就是所需的溫度值。這里有幾個事例值,感興趣的話可以算一下:

先使用i2c-read來讀取一下這兩個字節:高字節在前:




最后來計算一下結果:0x16C0 >> 5 =0xB6 =186
所以溫度值為186*0.125=23.25

可以看出,煙臺的晚上還是非常涼爽的!

注:在V1.0.2版本中,i2c-read函數新增參數-a,用于指定寄存器地址(寄存器地址只能為1個字節。如果寄存器地址多于1個字節,只能使用先寫在讀的方式進行操作)。



另外,需要補充一點的是,i2c-write和i2c-read在正確寫入和讀取的時候不會輸出任何信息的。只有在發生錯誤的時候才會進行提示:





LM75A.pdf (137.07 KB, 下載次數: 7)





--------------------------------------------------------------------


V1.0.4命令文件說明
    在1.0.4版本中,新增了直接發送命令文件這一特色。下面就針對命令文件結合TCP/IP芯片W5100,進行一下說明。
   
    5100使用SPI方式進行通信,并且僅僅支持模式0. 還需要注意的是,對5100芯片進行讀寫的時候,SPI的速率不能太低。在之前的操作中,發現使用256KHz的SPI進行通信,不能正常的進行讀寫。因此在1.0.4版本中,將SPI的時鐘頻率提升到了4MHz。
    上圖是SPI通信的協議圖。分為3部分。第一部分是操作碼。讀的時候,操作碼是0x0F
,寫的時候操作碼是0xF0 。 第二部分是5100寄存器地址,2個字節,分為兩次發送。第三部分是需要寫的數據。1個字節。


    看一下相關的寄存器:
   
比如說設置本機IP,就要分四次來寫(本機IP由4個字節組成,每次只能對1個字節進行讀寫),如果設置成為192.168.1.3,那么應該使用這樣的命令:
  • spi [ 0xf0 0x00 0x0f  0xc0 ]
  • spi [ 0xf0 0x00 0x10 0xa8 ]
  • spi [ 0xf0 0x00 0x11 0x01 ]
  • spi [ 0xf0 0x00 0x12 0x03 ]

除了本機IP,還需要設置網關IP,子網掩碼,MAC地址,共需要20次操作:
  1.     spi [ 0xf0 0x00 0x01 0xc0 ]
  2.     spi [ 0xf0 0x00 0x02 0xa8 ]
  3.     spi [ 0xf0 0x00 0x03 0x01 ]
  4.     spi [ 0xf0 0x00 0x04 0x01 ]

  5.     spi [ 0xf0 0x00 0x05 0xff ]
  6.     spi [ 0xf0 0x00 0x06 0xff ]
  7.     spi [ 0xf0 0x00 0x07 0xff ]
  8.     spi [ 0xf0 0x00 0x08 0x00 ]

  9.     spi [ 0xf0 0x00 0x09 0xde ]
  10.     spi [ 0xf0 0x00 0x0a 0xad ]
  11.     spi [ 0xf0 0x00 0x0b 0xbe ]
  12.     spi [ 0xf0 0x00 0x0c 0xef ]
  13.     spi [ 0xf0 0x00 0x0d 0xfe ]
  14.     spi [ 0xf0 0x00 0x0e 0xed ]

  15.     spi [ 0xf0 0x00 0x0f 0xc0 ]
  16.     spi [ 0xf0 0x00 0x10 0xa8 ]
  17.     spi [ 0xf0 0x00 0x11 0x01 ]
  18.     spi [ 0xf0 0x00 0x12 0x03 ]

  19.     spi [ 0x0f 0x00 0x01 r:1 ]
  20.     spi [ 0x0f 0x00 0x02 r:1 ]
  21.     spi [ 0x0f 0x00 0x03 r:1 ]
  22.     spi [ 0x0f 0x00 0x04 r:1 ]
復制代碼

在每次給5100通電的時候,都需要重新發送一下這樣的字符,太麻煩了,所以索性將這些命令保存在一個txt文件中,直接通過smarTTY發送文件:

點擊smarTTY中的send a binary file(在上圖中用圓圈圈出),選擇w5100.txt :

最后四個命令是讀取網關的ip地址。在設置完這些寄存器之后,就可以使用windows上的ping命令來測試一下了:


斷開5100的網線再ping一下:



w5100.txt.rar (214 Bytes, 下載次數: 7)


w5100_Datasheet_cn.pdf (1.8 MB, 下載次數: 7)

W5100_Datasheet_v1.2.5.pdf (1.61 MB, 下載次數: 7)



-------------------------------------------------------------
</argc;i++)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品久久久久久久 | 精品欧美二区 | 国产精品日韩一区二区 | 午夜精品一区二区三区在线视 | 免费观看a级毛片在线播放 黄网站免费入口 | 亚洲一区视频在线 | 一本色道久久综合亚洲精品高清 | 亚洲精选一区二区 | 一本色道久久综合亚洲精品高清 | 狠狠色狠狠色综合系列 | 欧美99 | 九九色综合 | 狠狠涩 | 三级在线观看 | 成人国产精品久久 | 日韩二区| 久久久久久99 | 欧美中文一区 | 99精品网| 亚洲国产精品久久人人爱 | 中文字幕视频在线 | 成人免费小视频 | 激情的网站| 日韩激情在线 | 国产区在线观看 | 久久精品免费看 | 在线精品国产 | 国产日韩精品一区二区 | 精品国产一区二区三区免费 | 中文字幕 国产 | 91精品国产综合久久久久 | 久久久久久九九九九九九 | 欧美日韩精品综合 | 成人不卡视频 | 91久久| 中文字幕视频一区 | 在线播放一区 | 奇米影视在线 | 99精品一区二区 | 天天激情综合 | 国产午夜精品一区二区三区嫩草 |