標(biāo)題: I am master!使用Nucleo334打造新一代的調(diào)試?yán)?[打印本頁(yè)]

作者: 51hei大小    時(shí)間: 2016-6-17 15:16
標(biāo)題: I am master!使用Nucleo334打造新一代的調(diào)試?yán)?br />     通常,我們調(diào)試一個(gè)芯片的時(shí)候,往往是編寫(xiě)程序---下載---更改---下載。。。這種方法固然好,但是像我這樣的懶人不大喜歡,我喜歡找一種一勞永逸的方法來(lái)解決。于是,開(kāi)始動(dòng)手寫(xiě)了這個(gè)I am Master!顧名思義,就是將Nucleo作為一個(gè)主機(jī),與我們需要使用的軟件進(jìn)行通信?赡苓@樣說(shuō)你不是很理解,沒(méi)關(guān)系,下面還會(huì)一 一介紹的。
   電腦作為控制端,通過(guò)串口與我們的Nucleo進(jìn)行通信,而Nucleo根據(jù)電腦發(fā)送的字符,解析,并且產(chǎn)生一定的時(shí)序,與我們需要使用的芯片進(jìn)行通信。



    比如,電腦端通過(guò)串口向Nucleo發(fā)送 input 0 1 2,代表Nucleo需要將 0 1 2這三個(gè)引腳設(shè)置成為輸入狀態(tài). 在我的程序中,將Nucleo左邊的A0~A5作為IO部分,分別對(duì)應(yīng)編號(hào)0-5?梢杂糜趫(zhí)行比較簡(jiǎn)單的任務(wù)。

注意:為了保證電腦端有一個(gè)良好的人機(jī)界面,大家務(wù)必使用能夠滿足linux終端要求的串口軟件。比如puTTy,smartty;蛘呤浅(jí)終端。像一般的串口軟件無(wú)法完成這個(gè)項(xiàng)目的要求。因?yàn)樗麄儾荒軌蚋淖冏煮w的顏色。這里推薦大家使用smarTTY,如果使用puTTY的話需要更改我上傳的程序。因?yàn)楫?dāng)我們按下Enter的時(shí)候,puTTY發(fā)送的是'',而smarTTY發(fā)送的是''。在附件中有最新的smarTTY的安裝版軟件。

    如果在使用smarTTY的時(shí)候,發(fā)現(xiàn)換行符不能正確顯示,請(qǐng)進(jìn)行這樣的設(shè)置:





版本更新介紹:

V1.0.0支持函數(shù):


V1.0.1新增函數(shù):
V1.0.2更新說(shuō)明:
V1.0.3更新說(shuō)明:
  
V1.0.4更新說(shuō)明:

v2.0.0(重要更新)。

吐槽,意見(jiàn),或者建議請(qǐng)聯(lián)系(PS有沒(méi)有E語(yǔ)好的大神,幫忙翻譯一下man的說(shuō)明部分):
qianfanguijin@163.com
qianfanguijin@gmail.com


版權(quán)聲明:
本軟件僅供與學(xué)習(xí)交流之用,未經(jīng)允許,不得用于商業(yè)用途。

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

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

使用入門(mén):

Nucleo通電之后,通過(guò)串口發(fā)送這樣的信息:

先來(lái)認(rèn)識(shí)一個(gè)命令 man ,類似于linux中的man 。當(dāng)你遇到某一個(gè)命令而不知道如何使用的時(shí)候,可以使用這個(gè)命令。比如獲取input這個(gè)命令的解釋:

這個(gè)命令的功能是將引腳設(shè)置成為輸入模式,引腳的范圍是0-5,對(duì)用Arduino接口的A0-A5.現(xiàn)在,我們?cè)?號(hào)引腳上面掛接一個(gè)LED,在1號(hào)引腳上面掛在一個(gè)開(kāi)關(guān)(平時(shí)為1,按下為0)?梢酝ㄟ^(guò)input,output兩條命令來(lái)切換他們的模式:



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


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


在我們平時(shí)的調(diào)試中,光使用IO接口恐怕難以滿足我們的要求。還需要一些更復(fù)雜的通信協(xié)議,比如說(shuō)SPI。下面我們就來(lái)說(shuō)說(shuō)SPI的使用。

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

在SPI通信上,使用板子上面表示的SPI引腳。這里就不詳細(xì)解釋了?梢钥匆幌掳遄由厦娴慕z印。

spi的參數(shù)有著固定的要求:

好了,就這么多,下面就來(lái)通過(guò)spi這條命令,讀寫(xiě)SPI存儲(chǔ)芯片W25X16.他的數(shù)據(jù)手冊(cè)在附件中,大家可以下載學(xué)習(xí)一下。
先看W25的一個(gè)指令表:


在原PDF的第17頁(yè)?梢钥吹缴厦嬗幸粭l指令是讀ID,解釋如下:


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

回應(yīng)了兩個(gè)數(shù)字,0xEF,0x14,正好與上表的數(shù)據(jù)吻合。說(shuō)明通信正確。

通過(guò)查看數(shù)據(jù)手冊(cè)可以看出,要想往一個(gè)地址內(nèi)寫(xiě)數(shù)據(jù),首先要寫(xiě)一個(gè)WriteEnable命令,在寫(xiě)完WriteEnable命令之后,StatusRegister寄存器中相應(yīng)的WEL為會(huì)被置1,說(shuō)明允許寫(xiě)。


在寫(xiě)完WriteEnable命令之后,可以看到WEL位已經(jīng)被置1了,說(shuō)明操作正確。

下面將第一扇區(qū)格式化,之后往里寫(xiě)如一些數(shù)據(jù):

0x20是格式化命令,格式化命令之后WEL位被清零,說(shuō)明不能在繼續(xù)寫(xiě)數(shù)據(jù)。為了能夠繼續(xù)寫(xiě)數(shù)據(jù),只好在重新發(fā)送一遍WriteEnable命令了。

讀取一下格式化之后0x00處連續(xù)10個(gè)地址的數(shù)據(jù):讀取的命令是0x03

數(shù)據(jù)全是0xFF,說(shuō)明格式化成功了。下面再將0x00連續(xù)地址處寫(xiě)如0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A十個(gè)數(shù)字,寫(xiě)入之后再讀。

這里寫(xiě)入了10個(gè)數(shù)據(jù),讀取了11個(gè)數(shù)據(jù),可以看到第11個(gè)數(shù)據(jù)是0xff,也就是沒(méi)有被更改,寫(xiě)入和讀取都正確。


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


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





一起來(lái)開(kāi)發(fā),定制你自己的命令

  可能你覺(jué)得這些命令遠(yuǎn)遠(yuǎn)不夠用,或者你希望定制一個(gè)你自己的命令,比如man 你的名字。其實(shí),定制一個(gè)這樣的命令是一個(gè)很簡(jiǎn)單的事情。
  在串口中接受到的字符,最終是要交給shell [void shell ( char * cmd_str) ; ]這個(gè)程序來(lái)處理的,這個(gè)程序?qū)⒋诮邮盏降囊恍凶址诳崭裉幏指,并且轉(zhuǎn)換成為int argc,char *argv[]的形式。這個(gè)形式是man函數(shù)的標(biāo)準(zhǔn)形式。argv[0]表示的需要調(diào)用的應(yīng)用程序的名字。例如串口輸入input 0 1 2,經(jīng)過(guò)shell的處理之后:
處理之后,shell去一個(gè)cmdList列表中尋找名字叫做input的函數(shù)。如果找到了,將控制權(quán)和argc,argv一起交給input函數(shù)。而input就是我們需要編寫(xiě)的,只需要遍歷argv,讀取每一個(gè)引腳的編號(hào),并且設(shè)置成為輸出即可。具體shell函數(shù)在cmdList中尋找input函數(shù)的方法在后文中會(huì)詳細(xì)講到。
下面是一個(gè)簡(jiǎn)單的input函數(shù)的實(shí)現(xiàn):
int input(int argc,char *argv[])
{
  int i=0;
  for(i=0;i<argc;i++)
  {
    //設(shè)置argv表示的引腳為輸入方式
  }
}

好了,下面就來(lái)說(shuō)說(shuō)定制命令的詳細(xì)步驟:

更多更有趣的功能歡迎你來(lái)實(shí)現(xiàn)!



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


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

I2C
    STM32F1和STM32F4使用的I2C接口是一類,用起來(lái)各種復(fù)雜,不好用。但是STM32F3的I2C卻非常好用。之前看見(jiàn)有人說(shuō)STM32的I2C是雞肋,只能說(shuō)明他沒(méi)有用過(guò)STM32F3的。下面就說(shuō)說(shuō)I2C如何使用。主要操作的芯片是LM75,一個(gè)溫度傳感器。
首先介紹三個(gè)命令:

為了編寫(xiě)程序的簡(jiǎn)便,I2C的操作使用流的方式,即只能采用內(nèi)置的通信方式(START,STOP)。不能指定RESTART。一般的I2C的讀取操作是 START+devAddr[Write]+regAddr+ReStart+devAddr[Read]+{some bytes}+STOP。由于不能采用ReStart,所以像這樣的讀取應(yīng)該分成先寫(xiě)在讀兩部分,即:

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

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


通過(guò)這條命令查出了唯一的地址,0x90 。那么這個(gè)地址就是LM75的設(shè)備地址了。之后我們要進(jìn)行的讀和寫(xiě)的操作都要靠這個(gè)地址。其實(shí)這條命令的實(shí)現(xiàn)很簡(jiǎn)單,只不過(guò)從0-127挨個(gè)詢問(wèn),看設(shè)備是否應(yīng)達(dá)就行,通過(guò)邏輯分析儀抓包如下:(只截取了部分)



好了,有了地址就可以進(jìn)行操作了,先來(lái)看看LM75的寄存器:

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



i2c-write必須要有-d參數(shù),用于指示設(shè)備地址。其余的數(shù)據(jù)是要發(fā)送的數(shù)值。如果想通過(guò)i2c發(fā)送0x00 0x01 0x02 0x03 這四個(gè)數(shù)字可以使用這樣的命令:
設(shè)備地址0x90必須緊跟在-d的后面。除了i2c-write的位置之外,出現(xiàn)在什么地方都是可以的。


在發(fā)送完寄存器地址之后,就可以讀取寄存器中的數(shù)值了。查看數(shù)據(jù)手冊(cè),可以看到LM75的溫度寄存器由兩個(gè)字節(jié)組成。在發(fā)送的時(shí)候先發(fā)送高字節(jié),在發(fā)送低字節(jié)。

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

先使用i2c-read來(lái)讀取一下這兩個(gè)字節(jié):高字節(jié)在前:




最后來(lái)計(jì)算一下結(jié)果:0x16C0 >> 5 =0xB6 =186
所以溫度值為186*0.125=23.25

可以看出,煙臺(tái)的晚上還是非常涼爽的!

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



另外,需要補(bǔ)充一點(diǎn)的是,i2c-write和i2c-read在正確寫(xiě)入和讀取的時(shí)候不會(huì)輸出任何信息的。只有在發(fā)生錯(cuò)誤的時(shí)候才會(huì)進(jìn)行提示:





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





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


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


    看一下相關(guān)的寄存器:
   
比如說(shuō)設(shè)置本機(jī)IP,就要分四次來(lái)寫(xiě)(本機(jī)IP由4個(gè)字節(jié)組成,每次只能對(duì)1個(gè)字節(jié)進(jìn)行讀寫(xiě)),如果設(shè)置成為192.168.1.3,那么應(yīng)該使用這樣的命令:
除了本機(jī)IP,還需要設(shè)置網(wǎng)關(guān)IP,子網(wǎng)掩碼,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 ]
復(fù)制代碼

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

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

最后四個(gè)命令是讀取網(wǎng)關(guān)的ip地址。在設(shè)置完這些寄存器之后,就可以使用windows上的ping命令來(lái)測(cè)試一下了:


斷開(kāi)5100的網(wǎng)線再ping一下:



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


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

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



-------------------------------------------------------------
</argc;i++)





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1