背景本來做的是M484,,看好了它的片上高速USB,、雙SDHC、QSPI FLash等,,結(jié)果入了新塘第一坑:LQFP64封裝是.4間距的,,偶直接拖了個(gè)STM32F205的封裝過來,.5間距的,,結(jié)果就是下面這樣: M484 -> NUC505 無意間于Whycan論壇(原填坑網(wǎng))上發(fā)現(xiàn)了這款神U:NUC505:
相見恨晚啊,,這不就是我一直想要的嘛.. 天貓Nuvoton旗艦店一查價(jià)格:NUC505DL13Y(2MB SPI FLASH)才¥7.60,!便宜的令人發(fā)指!??!那還等什么?立馬畫板打板,,開啟了我的“坑”中之旅~~ 先記錄下官網(wǎng)用到的軟件及文檔:
坑一:J-Link不支持,?明明是CortexM4核,明明也支持SWD模式,,結(jié)果JLink無法識別,,打開J-Link commander也沒NUC505系列,估計(jì)是沒給Segger付費(fèi)吧,,可惜了我的MiniJlink和RTT,,好用的工具只能暫時(shí)放一邊了,好在之前參加過幾次Nuvoton的研討會(huì),,大方的新塘送的demo板上都有NuLinkMe調(diào)試器,,暴力掰下來,然后杜邦線連之,。 Nuvoton Demo Board 坑二:片內(nèi)SPI Flash And Boot前面多次提到過2MB的片內(nèi)SPI Flash,,2MB看上去很美,但是封的是SPI FLash,,雖然支持片上運(yùn)行,,但是速度相比SRAM中運(yùn)行慢了100倍!沒錯(cuò),,是100倍,!星爺?shù)哪蔷?“我奶奶罵他欺善民,反被他捉進(jìn)了唐府,,xx了一百遍 ,!一百遍!??!” 在耳邊飄蕩…, Github中看到了下面的描述:
片上的spi flash看來只能用于代碼的存儲(chǔ)和boot了,,(還可以用于存儲(chǔ)一些數(shù)據(jù),,省了外部的存儲(chǔ)了)然后將代碼copy到ram里運(yùn)行,也行,,誰讓它便宜來,,128KB SRAM,分了4個(gè)bank,,每個(gè)32KB,,這樣就可以作為32K RAM/96 K Flash 或者 64K RAM/64 K Flash的配置來用了,緊著這128K 來回蹂躪吧~ But,,在“SWD/ICE with Internal SPI Flash”模式下無法運(yùn)行用戶代碼是什么鬼,?嘗試了才知道:在這種模式下,可以通過MDK的debug進(jìn)行程序下載,、debug,、查看變量、全速運(yùn)行等等,,但是退出debug模式,,這貨就不跑了!即使按reset也不行,,想讓它從能從spi flash中自舉運(yùn)行,?那得改變它的硬件boot模式才行!只有1111模式下可以直接從內(nèi)部SPI Flash啟動(dòng),,但是在這種模式下,,仿真器無法連接!??!真是反人類的設(shè)計(jì)!,!不服,?咬他?當(dāng)心被捉進(jìn)唐府… 記NUC505的啟動(dòng)配置:(在復(fù)位時(shí)默認(rèn)上拉,,所以如需配置為0,,則相應(yīng)管腳需加10KR電阻下拉) 記錄我的板子上的調(diào)試:
坑三:優(yōu)化精簡代碼官方代碼:NUC505_Series_BSP_CMSIS_V3.03.001,,壓縮包52M左右,解壓后先看下Readme.pdf,,比較詳細(xì)的描述了各個(gè)目錄下的工程等,,為了方便備份,我又完整的拷貝了一份解壓后的文件,,打開NUC505_Series_BSP_CMSIS_V3.03.001\SampleCode\StdDriver\USBD_VCOM_SerialEmulator這個(gè)工程,,然后開始編譯+刪除,,不斷嘗試后把不需要用到的都給刪除掉并能編譯成功,至文件夾大約5MB左右,,OK,!這就是我要的工程了,以后就在這個(gè)上面蓋房子就行,。 注:默認(rèn)配置該工程是使用的SPI FLASH的,,需要先設(shè)置成“SWD/ICE + 內(nèi)部SPI Flash”模式下,debug下可以運(yùn)行,,也可以下載,,然后把啟動(dòng)模式更改為“內(nèi)部MCP SPI FLash啟動(dòng)”,上電即可運(yùn)行,。 在SampleCode\BootTemplate下有幾個(gè)例程,,參考來實(shí)現(xiàn)如何使用SPI Flash和SRAM,目前使用MainOnSram例程,,就是啟動(dòng)代碼在spi flash中,,然后其他大部分程序都是在ram中執(zhí)行。直接用該例程的ld文件就可以,。另外程序稍作配置,,將主頻配到180M,96M太對不起這內(nèi)存了,。順便移植了下新塘的NuConsole,,跟Segger的RTT類似,在debug模式下打開即可,,再插上shell的翅膀,,可以起飛啦! NuConsole 順便再吐槽下他家的NuConsole,,雖然功能跟RTT相似,,結(jié)果請看上圖:不支持最大化!只能這么小窗口顯示,,真是小氣的很~ 坑四:新鮮出爐的M484+NUC505之前由于封裝畫錯(cuò)了的M484只能含淚默默重新改版,,順便把NUC505也改了改,加上了oled和按鍵,。 M484Nuc505 NUC505 LQFP封裝的可用IO 還是比較少的,,目前幾乎全用上了,于是在按鍵輸入上又掉坑里了,! PA0 - 看上去是GPIO管腳,,結(jié)果該腳使能上拉讀出來的值始終為0,查了下手冊才發(fā)現(xiàn)PA0-ADC_CH0,內(nèi)建10KR電阻分壓用作電池檢測,!內(nèi)賤?。。,?!也沒個(gè)電路看看如果要測電池電壓該怎么接…順便看了下它的ADC,雖然只有一個(gè)ADC,,可是玩出了很多花樣:
好在OLED一把就點(diǎn)亮了,,SPI代碼配置真是簡潔,。 坑五:VCP 512整數(shù)倍發(fā)送的問題老生常談的話題了,早在STM32上就有這問題,,結(jié)果在505上又遇到了,,說白了就是在發(fā)完整數(shù)倍數(shù)據(jù)包如果還有要發(fā)的數(shù)據(jù)就接著發(fā)數(shù)據(jù),沒有要發(fā)的數(shù)據(jù)了就發(fā)個(gè)空包就行,,在這一點(diǎn)上Nuvoton設(shè)計(jì)的還是比較人性化的: 坑六:UART的接收超時(shí)中斷之前用stm32F072時(shí)使用串口空閑中斷作為接收成幀判斷,,看NUC505的手冊看到UART_TOUT寄存器中的TOIC:當(dāng)RX FIFO接收到一個(gè)新的數(shù)據(jù)時(shí),,定時(shí)溢出計(jì)數(shù)器開始計(jì)數(shù),超時(shí)后如果RXTOINT為使能,,則接收超時(shí)中斷RXTOINT產(chǎn)生,。要求設(shè)置為40~255之間,如TOIC為40,,則在4個(gè)字符時(shí)間長度后還沒收到新數(shù)據(jù),,則超時(shí)中斷產(chǎn)生??催@個(gè)描述正正合我的心意,!UART1設(shè)置46字節(jié)fifo的閾值中斷,這樣使用也可以很大的減輕CPU的負(fù)擔(dān)又能再收到一幀數(shù)據(jù)后 延時(shí)4個(gè)字符給出中斷,,測試時(shí)也是OK的,,蛋蛋蛋但是: 當(dāng)正好發(fā)送46字節(jié)時(shí),則無超時(shí)中斷產(chǎn)生,只有UART_INTSTS_RDAINT_Msk中斷產(chǎn)生,,從此讀出數(shù)據(jù)后,,UART_INTSTS_RXTOINT_Msk并未置位,而無論少一個(gè)或多一個(gè),,都是OK的,! what’s the ~!M48x的用戶別偷笑,,你們也有同樣的問題,! 查看UART_INTSTS寄存器中RXTOINT:如果TOUTIEN和RXTOIF都被置1,該位置1. 跟著看RXTOIF的描述: 當(dāng)RX FIFO非空且RX FIFO無活動(dòng)發(fā)生,,定時(shí)溢出計(jì)數(shù)器等于TOIC時(shí),,該位置位。 總和之即:超時(shí)中斷要產(chǎn)生,,需要RX FIFO非空,,并且TOIC超時(shí)溢出并使能。那么問題就在于當(dāng)正好到RX FIFO閾值中斷時(shí),,在中斷服務(wù)函數(shù)把數(shù)據(jù)全都讀出來了導(dǎo)致RX FIFO空了,,所以就不滿足了,自然就無法產(chǎn)生超時(shí)溢出中斷了,!真是蛋疼的設(shè)計(jì),,那怎么解決呢?解決方法很簡單,,在閾值中斷中讓rx fifo不空就完事了,。留一個(gè)字節(jié)在fifo里!問題完美解決,! 順便再吐槽一下:UART0的RX和TX FIFO是16,, UART1和UART2的RX TX FIFO是64!就三個(gè)UART還整的不一樣,,順便贊一下:RS485模式,,使用RTS控制485的換向端,真香,! 坑七:NuLink VS JLink忍受了這么久的NULink,,現(xiàn)在終于可以用JLink來歡快的仿真下載調(diào)試NUC505了,爽的不要不要的,,實(shí)現(xiàn)方式很簡單,,就是在JLinkDevices.xml中添加上NUC505的型號就可以了,如下:
然后從keil目錄下找到NUC505_SPIFLASH.FLM拷貝到 .\SEGGER\JLink\Devices\Nuvoton目錄下即可,,就能成功的讀到芯片的ID,。剩下的跟普通的仿真調(diào)試一樣了。 順便記一下解決仿真時(shí)彈出Verification 的ERROR: Verification of application image failed. 先看下下面的 “Download to flash” 是否√了。 checkDownloadFlash. |
|