久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

NUC505 - HS USB

 TopSemic嵌入式 2023-08-12 發(fā)布于北京

背景

本來做的是M484,,看好了它的片上高速USB,、雙SDHC、QSPI FLash等,,結(jié)果入了新塘第一坑:LQFP64封裝是.4間距的,,偶直接拖了個(gè)STM32F205的封裝過來,.5間距的,,結(jié)果就是下面這樣:

M484 -> NUC505

無意間于Whycan論壇(原填坑網(wǎng))上發(fā)現(xiàn)了這款神U:NUC505:

  • 高速USB Device,,USB2.0 USBHost. SD Host.

  • 128 KSRAM,512KB/2MB SPI Flash(片上無flash)

  • 含有浮點(diǎn)運(yùn)算單元和DSP的ARM? Cortex?-M4內(nèi)核,,最高可運(yùn)行至100MHz

  • 內(nèi)建雙聲道24位音頻解碼器(某些型號)

  • 封裝友好:LQFP48,、QFN48、LQFP64,、QFN88.

相見恨晚啊,,這不就是我一直想要的嘛.. 天貓Nuvoton旗艦店一查價(jià)格:NUC505DL13Y(2MB SPI FLASH)才¥7.60,!便宜的令人發(fā)指!??!那還等什么?立馬畫板打板,,開啟了我的“坑”中之旅~~

先記錄下官網(wǎng)用到的軟件及文檔:

  • BSP:NUC505_Series_BSP_CMSIS_V3.03.001.zip

  • MDK Pack:Nuvoton.NuMicro_DFP.1.3.5.pack

坑一: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中看到了下面的描述:

“ Although code can run directly out of the SPI flash, execution is understandably SLOOOW. For this reason, the default Section Placement setting provided for new projects by this package is “Flash Copy to RAM”; however, the usual “Flash” and “RAM” options are provided for completeness as well.

The NUC505 has a “Boot from USB” mode where the device appears as a USB Mass Storage device. A .bin binary image copied to the device is programmed to the internal SPI memory at 0x0. When the NUC505 is then returned to the “Boot from Internal MCP SPI flash” and restarted, it will attempt to boot from that image. HOWEVER, the “Boot from USB” USB Mass Storage implementation appears to only work in Windows; Linux detects the emulated volume as having corruption and will refuse to mount it for write access.

When the NUC505 is set to its “SWD/ICE Mode with Internal SPI Flash“ mode, the NUC505 will NOT execute user code upon hardware reset. Instead, it runs from its internal mask ROM code and execution eventually reaches an endless loop. This boot mode seems to be intended exclusively for using an IDE to both program memory and specifically initiate debugging execution of the user application.”

片上的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)試:

  • 電阻全都不焊,默認(rèn) 1111 :從片上SPI Flash中啟動(dòng)

  • R13 = 10KR,, PB4=0,, SWD/ICE + 內(nèi)部SPI Flash ,調(diào)試時(shí)使用這種模式,。

  • R3 = 10KR,, PA9=0, USB啟動(dòng),。

坑三:優(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,,可是玩出了很多花樣:

  • ADC_CH1通道最高可達(dá)1MSPS的采樣率。

  • ADC_CH2~ADC_CH7:最高200KSPS采樣率,。

  • ADC_CH2:支持鍵盤比較器,。

  • ADC_CH0:內(nèi)建10KR電阻分壓用作電池檢測。

好在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ì)的還是比較人性化的:
USBD->EP[EPA].EPRSPCTL = USB_EP_RSPCTL_ZEROLEN;
對EPRSPCTL的ZERO位置1就會(huì)發(fā)送一個(gè)空包了,。至于為啥是512,因?yàn)槭歉咚賃SB嘛,,還有一點(diǎn):可以配置緩沖區(qū)為1024,,然后收發(fā) 一包就是1024Byte,真爽~

坑六: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的型號就可以了,如下:

<Device>
<ChipInfo Vendor="Nuvoton" Name="NUC505YO13Y" WorkRAMAddr="0x20000000" WorkRAMSize="0x00020000" Core="JLINK_CORE_CORTEX_M4" Aliases="NUC505DL13Y; NUC505DS13Y"/>
<FlashBankInfo Name="SPI Flash" BaseAddr="0x00000000" MaxSize="0x00200000" Loader="Devices/Nuvoton/NUC505_SPIFLASH.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" />
</Device>

然后從keil目錄下找到NUC505_SPIFLASH.FLM拷貝到 .\SEGGER\JLink\Devices\Nuvoton目錄下即可,,就能成功的讀到芯片的ID,。剩下的跟普通的仿真調(diào)試一樣了。

順便記一下解決仿真時(shí)彈出Verification 的ERROR:

Verification of application image failed.

先看下下面的 “Download to flash” 是否√了。

checkDownloadFlash.

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多