發表文章

目前顯示的是有「Cortex-M」標籤的文章

NUC1263 LLSIClock開發筆記:LLSI與PDMA搭配使用

圖片
DMA是什麼? DMA的全稱叫做Direct Memory Access,「直接記憶體存取」。它可以直接根據使用者設定的來源位址、目標位址、長度等,直接搬移記憶體中的資料,而不用CPU的介入,幫CPU分攤一些反覆搬移的事情。尤其在搬移大量資料時,或者一些CPU負載重的應用情境之下,藉由DMA的幫忙可以顯著提高系統整體的效能。 在計算機系統中,CPU之外的硬體周邊裝置也經常會映射在一些記憶體位址中,讓使用者能像讀寫記憶體般,輕易地操作它們,稱作Memory-mapped IO。因此DMA也可以搬移硬體周邊裝置的資料。 PDMA是什麼? 不過在微控制器的應用中,資料的搬移往往需要根據周邊裝置的狀態同步。DMA前面加了一個P就是Peripheral Direct Memory Access,意即可以經由硬體周邊裝置產生的事件當成是DMA的傳輸請求,直接觸發DMA傳輸。 以這次的NUC1263為例,LLSI硬體提供了深度4-word (16-byte)的FIFO buffer,是在FIFO有足夠空間時,由LLSI硬體產生信號直接向PDMA發送傳輸請求,依序將整個Frame buffer傳輸完畢,期間就不需要CPU介入該過程。 使用PDMA的好處 透過硬體產生的事件,直接將資料搬移的任務交給PDMA,而非反覆讓CPU進中斷服務程式搬移資料,把CPU的資源留給那些真正需要運算的程式。 讓我們開始看看LLSI+PDMA的程式吧! 基於上一篇文章「運用指標提高LLSI Frame Buffer的可讀性、易用性」的程式下去修改成PDMA傳輸的版本,主要留意下面這些內容。 要記得在SYS_Init()中開啟LLSI和PDMA的clock LLSI_Open()要將工作模式設為LLSI_MODE_PDMA 首先在SYS_Init()中除了LLSI之外還要記得開啟PDMA的clock。 /* Enable LLSI0 module clock */ CLK_EnableModuleClock(LLSI0_MODULE); /* Enable PDMA peripheral clock */ CLK_EnableModuleClock(PDMA_MODULE); PDMA_Init()的部分,我使用PDMA Channel...

NUC1263 LLSIClock開發筆記:運用指標提高LLSI Frame Buffer的可讀性、易用性

圖片
LLSI設計時大概是考量到系統整體效能,資料是以32-bit的寬度寫入LLSI FIFO的。因此最直接的方式就是將frame buffer宣告成32-bit的陣列,這個方式拿來點四色”ARGBW” LED時倒是沒什麼問題。但是當我試著用LLSI點亮三色ARGB七段顯示器的時候就有發現,1個顏色8-bit,1顆ARGB LED 3個顏色總共24-bit,資料的排列順序會就變成下面這樣 …  (第一行的註解是指第幾顆LED) // 2nd 1st 3rd 2nd 4th 3rd 6th 5th uint32_t g_au32frameBuffer[6] = {0xRRBBGGRR, 0xGGRRBBGG, 0xBBGGRRBB, 0xRRBBGGRR ...} 光用看的是不是就很頭大? 再想到之後要去個別調整每一顆ARGB LED的色彩、亮度,頭就更大了。這也讓我開始思考, 有沒有辦法將陣列宣告成8-bit,然後以32-bit的格式來讀取8-bit陣列,寫入LLSI的FIFO。 完整程式碼一樣可以看留言區或是GitHub https://github.com/danchouzhou/LLSIClock/blob/main/firmware/LLSI_RGB/main.c 從32-bit陣列轉變成8-bit陣列 陣列如果變成這樣讓g_au8frameBuffer[0]~[2],儲存第1顆ARGB LED的R, G, B;g_au8frameBuffer[3]~[5],儲存第2顆ARGB LED的R, G, B,以此類推,是不是直觀許多呢? volatile uint8_t g_au8frameBuffer[24] = { // R G B 0x80, 0x00, 0x00, // Red 0x80, 0x20, 0x00, // Orange 0x40, 0x40, 0x00, // Yellow 0x00, 0x80, 0x00, // Green 0x00, 0x00, 0xFF, // Blue 0x00, 0x40, 0x80, // Indigo 0x80, 0x00, 0xFF...

NUC1263 LLSIClock開發筆記:電路設計篇、億光ARGB七段顯示器

圖片
閱讀過上篇文章 開箱實作NUC1263 MCU!探索新唐獨家LLSI ARGB LED控制介面! 的讀者們,有沒有猜到我要做什麼了嗎? 是的,又要做時鐘啦! 先來公布畫好的電路圖和電路板 會陸續把相關的檔案更新到GitHub中: https://github.com/danchouzhou/LLSIClock NUC1263核心電路 這次訂購的晶片是封裝為LQFP48的NUC1263LD4CE,電路板空間不多就沒有把所有IO通通拉出來了,不過有把一些重要的IO集中在14-pin的SMT雙排排針J1上面,其中包含PA.0~PA.3,能同時支援I3C、I2C、SPI、UART、PWM,且能從VDDIO1電源接腳輸入IO電壓;以及主要能拿來當ADC、DAC輸入輸出的PB.12~PB.15,讓電路能有更彈性的擴充能力,未來要拿去接Wi-Fi模組、GPS、各式各樣的感測器就都不是問題! NUC1263LD4CE有內建48 MHz的RC震盪器,而且±1%的精確度已能滿足USB 2.0 Full-Speed (12Mbps)的需求,意思就是最小系統只要晶片接上電源就能運作! 不過為求單機計時精準,還是先把和003Clock同一顆的有源震盪器給畫上去了,畢竟±1%的話積少成多,一天86400秒最多可以落差到864秒 (約14分鐘)。當然,誤差也可以用GPS時間、Wi-Fi NTP或USB電腦連線來校正時間。 當初下訂時還在更小QFN33、QFN48掙扎著,不過看到QFN都沒有USB才作罷。不過雖然QFN封裝的NUC1263沒有USB,取而代之的是DDR5 SPD Hub (SPD5),應用在DRAM模組可以直接將SPD接到NUC1263,就不用額外一顆SPD晶片,內建I3C和ARGB LED介面LLSI,簡直就是電競記憶體的完美方案。 已經可以理解NUC1263是為電腦周邊推出的MCU,QFP封裝用在需要USB介面的鍵盤、滑鼠、耳麥等;QFN封裝適合用在DDR5記憶體模組。 題外話,這兩天還發現新唐M2A23同樣也有LLSI,同樣也是5V Cortex-M23,且支援3組CAN FD,工作溫度可以耐到125°C,看來是針對車用市場所推出的MCU。 ARGB七段顯示器 好了不瞞了,同學塞給我的神奇產品是他們新開發的ARGB七段顯示器,億光ELSS-4X6RGBWA/T2/S290-C...

開箱實作NUC1263 MCU!探索新唐獨家LLSI ARGB LED控制介面!

圖片
連假前看到新唐在論壇介紹NUC1263這顆MCU,除了CPU是ARMv8的Cortex-M23之外,還有一個新唐專利硬體周邊LLSI,加上億光同學塞了他們新開發的神奇產品給我,腦袋裡面馬上冒出漂亮的應用, 於是就上新唐線上商店下單一片NuMaker-NUC1263SD開發板和5顆晶片 ,沒想到隔天就到了~  新唐NUC1263系列產品帶給您炫彩的ARGB燈效控制 -LLSI介面簡易設計,方便好用- 不過作品還在設計當中,敬請期待。先來用現成的Adafruit NeoPixel Ring試玩一下NUC1263這顆MCU和它的LLSI吧!一樣會在GitHub和留言區提供完整測試程式碼喔!(看到專案名稱,知道我又要做什麼了吧XD) https://github.com/danchouzhou/LLSIClock/blob/main/firmware/LLSI_RGBW/main.c 先幫讀者整理一下這顆NUC1263重點特色 Arm Cortex-M23 72 MHz,ARMv8-M架構的CPU 內建64 KB Flash和20 KB SRAM 工作電壓2.5 V ~ 5.5 V 除了常見的UART、SPI、I2C、ADC、PWM之外,NUC1263還有I3C、USB和4個DAC,其中I3C還可以從獨立VDDIO電源接腳,輸入I3C匯流排上的電壓,讓I3C不用外接level shifter,最低就能支援0.95 V的電壓準位。不過最大的特色還是全新推出的 專利獨家功能LLSI。 第一次聽到LLSI? LLSI全稱是LED Light Strip Interface,其實就是專門為可定址LED (ARGB LED, addressable RGB LED) 設計的控制介面,常見的型號例如WS2812B、SK6812,或者是Adafruit推出的NeoPixel系列,這種介面的好處就是只要一條信號線從第一顆LED的DIN輸入,第一顆的DOUT串到第二顆的DIN,以此類推就可以控制整串的全彩LED。 由於只有一條信號線,ARGB LED的控制介面是利用信號high low時長不同,來代表資料的0和1。新唐將這種控制時序設計成硬體,取了酷酷的名字LLSI並整合進MCU裡面,成為首度推出有硬體控制ARGB LED能力的MCU公司,這也是新唐MCU才有的獨家功能。下圖節錄自N...

新唐火神板開箱實作(五):CAN通訊測試

圖片
一、前言     本篇要用Python寫程式,從個人電腦連接的Kvaser Leaf Light v2透過CAN傳送資料至NuMaker-Volcano接收,並從serial port觀測資料。 二、CAN bus的結構     如下圖,如果我們要使用CAN介面,需要有CAN Controller以及CAN Transceiver。CAN Controller負責的是CAN的通訊協定, CAN Controller會依序傳輸或接收資料,並且內建CRC、ACK、中斷等邏輯電路,CPU只需要存取他的暫存器即可進行收發。這一步當然可以用軟體刻出時序,不過有獨立硬體會讓CPU輕鬆一點。現在我們在做新的專案通常會直接挑有內建CAN Controller的MCU,像是新唐的M0A23、NUC131、M482、M453都有內建。NUC131目前已經有AEC-Q101的版本了,M0A23未來應該也會有。      CAN Controller輸出的都還只是共模信號,必須透過CAN Transceiver轉換電氣特性為差動信號。新一點的CAN Transceiver除了轉換電氣特性以外,還會有超時保護、突波及ESD防護,其中超時保護是為了避免該節點的軟體或硬體出現問題,使TXD長時間保持在LOW的時候,CAN Transceiver會把輸出級的電晶體給釋放掉,避免該節點長時間保持在顯性信號占用並阻斷其他節點的通訊。     此外為了因應 很多新出的MCU工作電壓都是3.3V,再新一點的CAN Transceiver也會將bus端的5V (VCC)與CAN TX/RX端的電源(VIO)區隔開來。幾個推薦的系列: NXP TJA1051T、TI TCAN1042、Microchip MCP2551。TJA1051T和TCAN1042有分不同版本(速度、VIO、EN等等),記得要去讀一下datasheet,看一下尾數的涵義。MCP2551就很經典很便宜,不過他就沒有VIO。     現在帶VIO的1051、1042市場都缺料,交期都排到好幾個月。好在新唐的M0A23工作電壓可以到5V,做東西用MCP2551就可以了~ 三、行前準備 1. NuMaker-Volcano要焊上排針,以利...

新唐火神板開箱實作(四):Kvaser USB/CAN adapter於Linux環境下的使用筆記

圖片
    電腦要接上CAN bus勢必要一個介面卡了,這回我們選用Kvaser Leaf Light v2這張USB to CAN的介面卡,於Ubuntu 18.04作業系統中使用python3開發通訊。     這邊我們就會用到第一篇所提到的 Kvaser Python module和Kvaser Linux Drivers and SDK,在Kvaser的網站可以下載。 https://www.kvaser.com/download/      下載後分別會是這兩個壓縮檔,pycanlib.zip和linuxcan.tar.gz,我都先將這兩個壓縮檔解壓縮。點開pycanlib/docs/index.html,裡面有完整的安裝步驟和範例。其中Installation告訴我們pip install canlib-x.y.z-py2.py3-none-any.whl可以自動安裝python的函式庫,其中x, y, z是版本號碼,可以在pycablib目錄下確認一下完整檔名。      不過安裝檔有使用到f-string,要用python3才能正常執行。因此在這之前要安裝一下python3與pip3。 sudo apt install python3 sudo apt install python3-pip     安裝完畢後用pip3來安裝。沒意外應該是能直接安裝成功。 pip3 install canlib-1.17.748-py2.py3-none-any.whl     再來就是驅動程式的部分,可以開啟 linuxcan/README參考。     實際上做這幾步就可以了。 sudo apt install build-essential make sudo make install      最後建立一份文字檔取名為listdev.py,然後將這段程式複製進去。要注意tab的部分。 from canlib import canlib num_channels = canlib.getNumberOfChannels() print("Found %d channe...

新唐火神板開箱實作(三):BSP範例程式與周邊函式庫

圖片
一、前言     在第一篇建立好的專案只是個簡單的Hello World功能。我們可以將新唐範例程式直接複製並取代原本的main.c。新的專案只會引入一些Hello World必要的函式庫,如sys.c、clk.c、uart.c等等,因此如果要新增其他周邊功能,就需要額外手動從BSP (board support package)複製周邊的函式庫(StdDriver)進專案Library的目錄下。 二、NuEclipse的專案目錄結構     下圖看到的Binaries, Includes只是透過Eclipse build setting分類出來的項目,並不是真的存在檔案系統的目錄。下列四項才是真的存在檔案系統裡面的項目。     1. CMSIS: 不是真的ARM的Cortex Microcontroller Software Interface Standard。裡面是Startup file。     2. Debug或Release: 編譯出來的Binary和執行檔     3. Library          /CMSIS:這才真的是CMSIS          /Device:最裡面放的是暫存器的header          /StdDriver:StdDriver的header          /:StdDriver的source file,要手動複製的周邊函式庫就是複製到這裡     4. User:使用者的程式碼,如main.c,也可以放一些自己建立的Library,大一點的Library建議再分一個資料夾出來。 三、範例程式 (SampleCode)     範例程式放在BSP中SampleCode這個目錄中,裡面會再按照不同方向分門別類。       ...

新唐火神板開箱實作(二):NuEclipse IDE基本設定筆記

圖片
      安裝完NuEclipse以後,我們可以做下列幾項設定。雖然這些項目並非必要,但是設定完會讓接下來的工作更加順手。請注意,這些設定是存在workspace目錄下的metadata,如果再新開一個workspace,要記得重新設定一次。 1. Font size     Windows > Preferences > General > Colors and Fonts     在選單裡面找到C/C++ > Editor,然後按右方的Edit就可以選擇適合自己的字型與字型大小。 2. Save automatically before build     Windows > Preferences > General >Workspace     將Save automatically before build勾選起來,這麼一來每當我們修改程式後,按下槌子就會自動儲存然後編譯。如果更動編輯器內的程式但是未儲存,還是會照上次儲存的程式編譯。 3. Launch the previously launched application     Windows > Preferences > Run/Debug > Launching     勾選下方的Always launch the previously launched application。之後如果有直接使用Eclipse的Run或Debug功能,就只需要設定一次,下一次會自動跑上回的設定值。

新唐火神板開箱實作(一):NuMaker-Volcano與NuEclipse IDE入門篇

圖片
一、前言      其實早在約兩年前(2018年)新唐科技就推出自家基於Eclipse的IDE,名為NuEclipse。它支援新唐Cortex-M系列微控制器,並包含OpenOCD可以直接在IDE內進行燒錄與debug,支援Windows與Linux作業系統,功能與業界常用的Keil MDK非常相似且可以免費使用。      最近新唐新推出一顆有CAN的便宜MCU,M0A23已經被我搶先拿到開發板了,也剛好有在做車用相關的專案。許多人都有問過我怎麼使用NuEclipse,這回我們就以CAN通訊為實驗主題,分個三到四篇寫一系列的NuEclipse的入門文章。我們拿到的NuMaker-Volcano上面是新唐M0A23EC1AC,是一顆Cortex-M0、32KB Flash、4KB SRAM的微控制器。內建48MHz的振盪器,在多數情況下無須外加石英晶體,讓TSSOP28的封裝擁有26個I/O。      順帶一提,新唐目前有和ARM簽約,只要是使用新唐Cortex-M0和M23的微控制器,也能免費、無限制的使用Keil MDK。細節可以參考新唐與MDK的網站。 https://www.nuvoton.com/tool-and-software/ide-and-compiler/ https://www2.keil.com/nuvoton/M0-M23 二、準備工作 下面這些東西會在接下來的幾篇文章中用到。      1. 硬體          1. 新唐NuMaker-Volcano開發板           2. CAN Transceiver (我是用 TI TCAN1042V-Q1 ,他的CAN bus 5V與數位信號的VIO是分開的)           3. Kvaser Leaf Light HS V2 (USB to CAN adapter,也可以用另一塊開發板收發CAN資料)      2. 軟體   ...