總網頁瀏覽量

2019年11月22日 星期五

現代計算機系統核心硬體常見平台的分類與簡介概述


歡迎透過合法的方式分享此文內容,若要轉載/轉貼,請明確貼出此原始連結並標示作者基本資訊請勿抄襲及非法轉貼(例如擷取內文但並未註明出處)

之前有寫過之前兩篇關於MCU觀念的介紹文章:
(1) 8051 MCU好教材分享 & 錯誤觀念闢除
(2) Arduino到底是什麼? MCU又是什麼?

這邊延續相關的方向,按照目前個人長年觀察現代常見的計算機平台做一些分類,並進行簡單描述介紹:

1. 微控制器MCU(又稱單晶片微電腦),例如8051、Arduino uno/nano/fio上面的Atmage328 或STM32等等,通常用在控制和裝置應用類的產品,通常負責硬體控制和少量資料運算的處理任務,但現在也有處理較多資料的MCU出現(例如適合做有GUI的裝置產品的MCU)

2. 小SoC,類似MCU但是外加了針對應用而需要俱備的硬體單元,例如TI公司的低功耗藍芽晶片CC2540或Zigbee WSN晶片CC2530

3.大SoC,又稱應用處理器,大型系統晶片,通常用在網路多媒體應用類產品,現代許多SoC會有多核心的主CPU、GPU、多媒體編解碼器和基本周邊硬體單元,軟體方面通常會跑一個大OS的嵌入式版本做為主要系統軟體。像是開發板類的樹莓派、Pandaboard、Beaglebone black,或已經是完整產品類的智慧型手機、數位電視或機上盒上面的主晶片即為此類
這邊舉些實例(包含上面說的一些常見板子上面的主晶片)來看,全志科技Allwinner H6就算一顆這裡所指的大SoC,或者像是Beaglebone black上面的TI AMS335X或Pandaboard上面的OMAP4460或者Raspberry Pi上面的BCM283X這些SoC都屬於這類

4. PC常用的MPU(當然也不一定只有用在PC),早期的晶片例如x86指令集架構的8086/286/386等。近代的i5、i7 這種晶片(也不一定是只有純CPU, 或許有加入一些額外的硬體單元,但主要大多的內容就是CPU單元的內容,周邊裝置的數量基本上不會像是MCU或SoC那樣有一堆周邊)

5.其他交叉於上述介紹類別的性質或者上述沒很完整描述到的種類,例如一些含有CPU的可程式化的控制器(如觸控控制器、馬達控制器,其實類似上述小SoC或者可說是特定應用所設計的MCU擴增版)


而這些平台中的CPU的種類部分(類別4本身性質就是CPU所以就不說了)

也要注意一下: MCU與SoC這類的平台有時也被稱之為「嵌入式微處理器」(Embedded Microprocessor),例如Atmel/Microchip公司的SAM9G20或者ST公司的STM32MP1(ST的MPU系列是屬於這裡所說的Embedded Microprocessor),但這些並不是傳統的「微處理器」或「微處理機」。因為時代的演進促進平台的多元化,容易使人混淆,導致這些名詞之間不論是在許多書籍或網路資料中都常被混淆解釋,當然這些名詞的定義也有過少數爭議)。

2和3和5類的平台通常是based on 8051的CPU core(8 bits)或ARM Cortex-Mx(32bits)系列的CPU做為其主要CPU(當然也有其他額外的,例如AVR),這類CPU很多都不具有MMU(記憶體管理單元),當然也有極少數是具備MMU的。以頻率來說這類平台通常在數MHz到數十MHz等級(也有上百的)

而4的平台, 近年來多數通常是based on ARM Cortex-Ax系列的CPU做為其主要CPU,當然也有其他類別的CPU(例如MIPS),這類CPU很多都具有MMU。頻率通常在數百MHz到GHz等級


那以運行於這些平台上的軟韌體來說

例如1、2及5的範例類的平台很常只有Non-OS SW/FW或者只有RTOS或者跑小SoC常是跑網路協定堆疊軟體(也會有類似小OS的框架,例如TI出的for ZigBee WSN的Z-Stack)

第4類如果用在PC上就不用說了。而種類3的平台在產品用途上通常會跑Embedded Linux/Android,也可能跑RTOS

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

2019年11月6日 星期三

【使用STM32CubeIDE進行STM32 MCU軟韌體開發】STM32CubeIDE之簡介與安裝流程


STM32CubeMX是一款於數年前由ST官方所推出的圖形化介面工具軟體

關於該工具軟體的主要功能,簡單來說,其功能為可讓使用者透過此圖形化的配置,進而由工具自動產生對應款式的STM32 MCU的硬體初始化程式碼(例如UART的初始化),其官方影片如連結

有了上述這個工具其實可大大減化STM32 MCU開發者的負擔,不必如同過去苦苦花許多時間去依依查詢MCU的硬體細節資料

而本篇文章要介紹的STM32CubeIDE則是更進一步整合了STM32CubeMX、ECLIPSE™/CDT framework 及GCC編譯工具鏈(toolchain)、GDB等工具的一款STM32 MCU軟韌體開發專用的整合開發環境(IDE, Integrated Development Environment)軟體

甚至在該IDE的編輯器裡面有一些強大的程式撰寫輔助功能,例如自動補齊(auto-completion)功能,可觀看下方官方網頁簡介影片裡面的demo進行了解。這邊簡單來介紹一下該功能: 假設程式開發者希望在main function裡面呼叫HAL_GPIO_TogglePin函式,在編輯器上面打了"HAL_GPIO_T",此時按下Alt+/ 斜線 (注意,官方影片裡面是寫Ctrl+Spacebar,這邊不太一樣),STM32CubeIDE編輯器就會自動將該函式給補齊到基本的格式"HAL_GPIO_TogglePin(GPIOx, GPIO_Pin)",有點類似Linux系統裡面的指令自動補齊功能。

STM32CubeIDE軟體下載官方網站與連結 (該網頁下方也有簡介影片)


而STM32CubeIDE的安裝流程簡單介紹如下:

(1)到ST官方網站去下載STM32CubeIDE安裝檔案,可選擇自己要使用的作業系統


看完並接受條約的話就按下ACCEPT繼續下一步


若不想要註冊帳號,則須要填寫email,ST官方系統會自動寄email到你填入的信箱地址


在email收信後得到下載附有連結的信,按下信中的Download now按鈕以進行下載




   (2) 安裝檔下載完成後,執行安裝檔案







選擇安裝路徑
注意,只能使用英文路徑,若選擇中文路徑則會有無法安裝的問題



安裝路徑選擇完之後,會出現燒錄器/debugger裝置的驅動程式安裝選項,原則上都勾選全部安裝即可,然後就按下Install開始進行安裝



安裝過程中會出現視窗詢問是否安裝一些裝置驅動程式,基本上都選擇"安裝"即可


安裝完成,按下Finish(可自由選擇是否建立桌面捷徑)



而關於該IDE進一步的使用方式介紹,若內容評估後覺得合適以靜態文章介紹,則將會再行分享



【若需要家教模式之嵌入式系統技術輔導 可來信洽談合作方式: iws6645@gmail.com】


2019年3月27日 星期三

【網路好文介紹】在嵌入式Linux系統下有無依賴現成Library之差異: 以簡易的GPIO應用為例

【供初學者參考】 
近期無意間在網路上喵到一篇技術文章 (原作者為coldnew's blog)
從上面這篇文章可看出,只是要讓東西會動(例如樹莓派, 使用現有Library)跟無現成Library、須自行撰寫呼叫systam call的應用程式之間的差異,到外面工作可能沒有樹莓派這麼現成又完整的軟硬體平台,通常更不會有RPi.GPIO這種已經幫你做得很完整的Library。

而這篇文章情境是驅動GPIO以驅動LED的極簡單例子(其實對於有os的平台來說要做很多事),且這只是純上層的部分(沒有包含kernel driver的說明)

2019年3月20日 星期三

安裝Visual Studio 2017




近期為了一些需求,可能要學習C++ MFC及C#,所以紀錄架設開發環境的過程於此,這邊所使用的pc環境是x86 64bits windows7

1.      下載Visual Studio 2017

下載完後,如果你尚未安裝.NET Framework 4.6以上的套件,點擊Visual Studio 2017安裝程式時會看到提醒視窗跳出,無法進行安裝



所以需要先下載並安裝   .NET Framework 4.6




.NET Framework 4.6安裝完成後,再次進行Visual Studio 2017安裝程式,就可以順利安裝


2.      執行Visual Studio 2017安裝程式

進入安裝程式後,首先會看到一段初始步驟的畫面

之後進入到安裝程式選擇畫面,安裝程式會請使用者選擇希望安裝的環境套件,可於右方看到您所安裝的環境工具套件(亦有細項可選擇),以及您所選擇的套件其所占空間會顯示於右下角,並可選擇全部的東西都下載到您pc後再安裝或者下載時邊安裝。


選擇完成後之後就點選安裝

安裝完成後會有提醒視窗跳出,說明須重新啟動電腦,才能啟動Visual Studio 2017



另外微軟本身就有提供不少說明文件供參考:

使用 Visual Studio IDE 進行 C++ 桌面程式開發:

Visual Studio 中的 Visual C++:

Visual Studio 中的 C++ 使用者入門:




2019年3月4日 星期一

【你所不知道的Arduino】強大的Arduino嵌入式平台與硬體電路模擬軟體: Autodesk Tinkercad (123D circuit )



享介紹一款幾年前看過的很讚的基本電路和Arduino線上免費模擬軟體: 123D circuit

現在好像改名為Autodesk Tinkercad了 : https://www.tinkercad.com/circuits

身為一個嵌入式系統韌體及硬體技術的愛好者,數年前看到這軟體時很驚訝(其實現在還是很驚訝),覺得實在太強大了

除了有各式嵌入式系統常用的基本電子元件(還有些已經是成品類的),像是二極體、電晶體、電阻、電容、電感、按鈕、LCD模組、可變電阻、各種電池、各種馬達、sensors、各種常用IC(OPA、邏輯閘、穩壓IC、馬達驅動IC、555...等)、Relay、鍵盤、開關、馬達控制模組(這也能模擬!?)、紅外線遙控器(這也能模擬!?)...(太多了,若有遺漏請見諒),可以讓使用者去動態模擬體驗這些電子元件之功能之外。

還有各式常見儀器(萬用電表、示波器、訊號產生器...),以及WIFI模組(這也能模擬...太強了)




而且還有Arduino板子...甚至可以直接在上面編寫Arduino code(可以選擇文字式或圖片式或混和式的Programming方式),而模擬IDE的部分感覺幾乎是模擬出整個Arduino IDE的重點功能)並動態模擬執行整個系統....



只能說超佩服做出這些模擬軟體的工程師們...這模擬軟體實在太強大了


【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

2019年2月26日 星期二

【C語言觀念複習筆記】函式指標陣列(Array of function pointer)



之前寫過一篇文章討論過指標陣列的觀念

這個指標陣列的指標當然也是有型態的, 上述文章是char

而也可以是指向function

因為指標陣列在上面文章討論過了, 所以先簡單補充一下函數指標的最基礎觀念 透過下列簡單範例說明:

簡單的範例如下:
#include "stdio.h"

void (*foo)();

void show(void)
{

 puts("OMG\n");

}


int main()
{
 int a;
 foo = show;
 foo();
 
 return 0;
}

執行結果會看到 OMG字串顯示


而函數指標陣列就是結合上面(指標陣列 & 函數指標的觀念)



這邊舉個範例,簡單來說是要將下面這段C code的if-else條件改成以函式指標陣列(array of function pointer)的方式改寫

#include "stdio.h"

#include "stdlib.h"

int plus(int a, int b) { return a + b; }
int minus(int a, int b) { return a - b; }
int multiply(int a, int b) { return a * b; }
int divided(int a, int b) { return a / b; }
int main()
{
 int a, c;
 char b;
 printf("key a Function \nEX: 1 + 1\n");
 scanf("%i %c %i", &a, &b, &c);

 if (b == '+')
  printf("%d %c %d = %d\n", a, b, c, plus(a, c));
 else if (b == '-')
  printf("%d %c %d = %d\n", a, b, c, minus(a, c));
 else if (b == '*')
  printf("%d %c %d = %d\n", a, b, c, multiply(a, c));
 else if (b == '/')
  printf("%d %c %d = %d\n", a, b, c, divided(a, c));
}



原程式碼的寫法的問題在於如果條件越多時,那if-else條件式勢必隨條件加長,易使得程式變得攏長,可透過函式指標陣列的方式改善此問題。
改寫如下
#include"stdio.h"

int plus(int a, int b){ return a+b; }
int minus(int a, int b){ return a-b; }
int multiply(int a, int b){ return a*b; }
int divided(int a, int b){ return a/b; }

int main(){
    int a, c;
    char b;
    scanf("%d %c %d", &a, &b, &c);
    
    int (*cmd[])(int a, int c) = {multiply, plus, NULL, minus, NULL, divided};

    printf("%d\n",cmd[b-42](a,c));  // '*' ASCII = 42(0x2a)  ,'+' ASCII = 43 (0x2b), '-' ASCII = 45, '/' ASCII = 47    

    return 0;
}

按照上述寫法加以測試,例如輸入 6*5 就會看到印出的結果30,執行結果畫面如下:




【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章



2019年2月15日 星期五

許多人對於8051 MCU常有的錯誤觀念討論與闢除


【若需要阿良的嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

歡迎透過合法的方式分享此文內容
,若要轉載/轉貼,請明確貼出此原始連結並標示作者基本資訊請勿抄襲及非法轉貼(例如擷取內文但並未註明出處)

[8051 MCU好教材分享 & 錯誤觀念闢除]

對於想學MCU(單晶片微控制器)韌體、嵌入式系統硬體(嵌入式處理器架構、外部電源電路、感測器/馬達介面電路、周邊驅動)實作基礎但又會沒有辦法確定學習平台與作法的朋友,可以參考這篇文章對於一些常見的錯誤認知觀念的討論與說明

: 我個人在過去的第一份業界工作其實是在大型SoC上面跑OS的系統(Embedded Linux/安卓等)上面的軟韌體工作,相較於MCU系統比起來,是較偏向嵌入式系統的軟體一些。但站在長年接觸MCU的一位工程人員,並由於自身是電機電子和資工科系都讀過也接觸過的人(從類比電路走到純軟體),一路上看到很多人因各自背景導致相互不理解、文人相輕等狀況,所以還是有些觀點想分享一下,之前也有寫過一篇觀念文章: Arduino到底是什麼? MCU又是什麼?

常見的錯誤觀念及對應說明如下:

(1) 以為MCU位元數少(比不上現代許多高大上的SoCCPU)就代表很簡單
會寫APP或接觸過Embedded Linux系統不代表就懂MCU的應用設計,更不代表設計MCU應用系統很簡單。事實上,就跟多數的技術或學問一樣,MCU類的系統的設計有淺有深(我想大多數技術也是如此),當然如果是single thread(while(1) infinite loop)的狀況下,就純軟體的角度來看,MCU的韌體在軟體方面的架構複雜度確實不高。但除此之外MCU應用系統設計還包含除了徹底理解MCU架構、整合設計電子電路(可能有數位、有類比)、理解各種電子元件的應用特性(即便不是身為純硬體工程師,但很可能為了因應系統整合的需求,也要去了解硬體特性相關方面的技術和知識)Sensor的訊號演算處理(DSP方法設計),甚至是設計控制系統的能力(視產品而定)

這類的系統設計所需要的技術背景知識,相當的視產品別及產品應用場域而定(軟硬體設計經驗和理解程度對於系統好壞的影響甚大)簡單來說,如果只會寫純軟體而不具備上述硬體知識與軟硬體整合能力的人員,是完全沒有能力去做好MCU系統設計的,因為這種韌體的用途重點就是在於驅動/控制硬體電路,當然要懂硬體才能做好這類系統的設計。過去還在校或者在公司時,就看過不少純軟體背景的人不甚理解此點,他們以為MCU的位元數少、規格相較於PC或網路多媒體類的SoC來說簡單很多,就代表著該技術領域很簡單,客觀來說這真的是嚴重錯誤的認知。

另外,嵌入式系統大致可粗分兩種: 硬體控制或大量資料處理,前者常用於控制或不需要本地進行大量運算的場域(如馬達、穿戴式裝置的裝置部分),後者常被用在網路多媒體應用(如數位電視、智慧型手機、Camera)MCU本來就是被用於前者較多(所以其處理器的運算能力規格通常不如後者複雜,這是需求選擇考量,而非是技術高低問題),當然近年來MCU也有被用於多媒體應用的情況出現,有些情況及產品需求下會在MCU上跑小型即時作業系統RTOS(要求即時性但又需要多工排程時),介於上述兩種狀況之間,但比例上仍然較少些

(2) 會簡單應用Arduino就是會MCU
這是學校學生甚至許多教師常犯的觀念錯誤,事實上Arduino API因為已經將底層韌體都包裝成相當方便的API,單純會應用距離具備MCU系統產品設計的能力事實上是有一段很大落差的。事實上,Arduino是很好的平台,可以節省很多不必要的自己刻底層driver(省略掉周邊IP的原理的理解/register setting flow和晶片外部的介面電路及元件的整合原理)的時間,熟悉MCU原理及系統設計的人去用Arduino其實可以用的很好,增加工作效率。反之,不懂原理的人去使用Arduino變成只是一知半解(甚至不到一知半解的程度)。雖然同樣都是使用Arduino,但上述這兩者之間是有很大的差異的。

(3) 805130幾年前的老晶片,就以為它過時且無用了
我甚至在過去看到某OS高手透過暗示的方式對採用8051作為教材的課程進行批評過(他覺得當時的交大和成大某些系所還在教8051就是太過於老舊落伍,我想這大概是領域雖有重複但仍差異很大,所造成的認知落差)

事實上,8051仍然是很適合初學者學習MCU的一個好選擇,因為許多的基礎原理是相通的,是一路發展上來的,現代的MCU並非是突然一蹴可及的。當初學者深入理解8051的原理後,要再去學一些更新的近代MCU其實並不困難,反而容易在初學期間打好基礎觀念,因為8051是相對單純一些的MCU(因為是比較早期出來的),而且容易因為8051這種具體而微的MCU架構(相較於現代許多已經複雜化的32bits MCU而言),容易增加初學者的學習信心

而且其實我看過很多學生(包含許多頂大的大學部學生,甚至是碩士與博士畢業生),光是8051這種較簡單的MCU架構原理(不僅是針對8051這款MCU的觀念,而是指MCU的一些共通觀念),大多數人都沒有學得很透徹(事實上大多數的人根本不熟)。其原因很多,例如只有一學期時間過短、教師認知錯誤、或者只是應用而沒機會深入思考接觸、與教授在論文題目的要求而產生的落差等等。甚至是一些在業界上班的工程師也是如此,也有很多人只是用到,東西會動就以為自己會了,事實上理解程度仍有深淺之分,此點與上述(2)以為會call Arduino API就是代表會設計MCU系統了的這種誤解,是相同道理。


另外,因為產品開發生態系的緣故,8051(或其增強型)的MCU,仍然相當活耀於產業界(如TI德州儀器公司的WSN SoC CC2530或BLE SoC CC2540這些較小型且無MMU的SoC就是based on 8051 core,如下方圖片所示,圖片皆為TI的datasheet)






上述幾間IC設計公司也都還有8051相關MCU IC產品,如上面這些網頁連結所示


另外,因為發現還是有不少朋友無法完整理解上述文章內容,在這裡做一些常見的錯誤觀念迷思的Q&A給大家參考,如下面這篇文章(請點連結進入)


為了貼心服務懶得點連結的朋友,這邊也將內容貼出來如下

Q1: 32bits ARM based的MCU不是比較好嗎?何必學這麼老舊的8051 MCU?

A1: 雖然上面內容中已經有說明,但這裡再詳細解釋。

很多人都誤以為用規格比較強的學習教材(嵌入式硬體平台),就代表自己神功附體,以為這樣子就可以讓學習效率大增。事實上,許多人常迷信於表面,以為自己用所謂ARM based的平台就代表自己比較厲害? 但其實在MCU應用開發的這塊,有多少人有去了解ARM CPU架構和指令集?多數人(包含許多在坊間補習班開課的講師們)通常也只不過將這個平台當成一塊MCU去跑code去設定周邊的registers而已不是嗎?甚至因為這些設定太冗雜繁複,所以很常都只是call高度現成的API,這樣會比以組合語言來學習8051底層基礎還好嗎?而且有真正摸到ARM CPU架構嗎? 終究不就只是在玩一塊比較複雜的MCU? 真的有因為用ARM based的MCU所以就有去實際接觸到ARM CPU嗎? 終究不也是只是一樣在應用MCU內的各式周邊(如UART、I2C、SPI等等)? 其實CPU這塊當然是要有人理解的,例如搞出這個MCU軟體編譯工具與開發環境的工程師們,但這塊大多數已經被開源社群與IC design house做掉了,對於MCU應用開發者來說,這塊已經是現成的工具。舉個例子,多數人玩MCU的C語言程式起跑點是main function,但是事實上在code flow跑到main function之前早就已經必須先去做其他事(startup),例如針對堆疊進行初始化等等(否則哪有C語言裡面這樣可以呼叫到函數跳來跳去的流程可用呢?),這塊是必要的,但是多數MCU應用者是拿現成的。好,把話題拉回來,用32bits MCU給初學者學,初學者真的會去細細探究這些已經是現成但較深入的部分嗎? 不會的,反而會因為32bits MCU的周邊大多較新穎又比8051的周邊複雜許多,而會去忽略一些重要的周邊操作員裡細節基礎,而且也會因此而不敢挑戰這裡所說的所謂現成的部分(如透過Assembly組合語言去熟悉指令集),畢竟ARM(即便是ARM Cortex-Mx系列)指令集對於多數的所謂MCU應用初學者來說太複雜了(當然做MCU系統應用開發也未必就一定要很懂CPU這部分,但是用簡單具體而微的平台來熟悉一次這些細節,其基礎不是會更紮實嗎? 而且也會包含一些重要的細節如中斷、堆疊等底層原理,這就是我說的為何MCU初學者應該要先以8051這類較簡單MCU來入門的原因。並不是拿8051來應用,而是透過較簡易的MCU來徹底的了解一次MCU底層的這些細節,在經歷過這樣的過程後,未來要再接觸較複雜的MCU基本上也不是太大的問題)。反過來,如果一開始就學32bits MCU,不但可能沒有真正學到什麼ARM CPU架構,而且反而可能會因為這類MCU周邊的複雜度而混淆初學者應該要學到的一些重點,反而未必會讓基礎紮實。例如某些32bits MCU的Timer模式眾多且其對應設定過程相對繁複,因為這是針對許多現代各式產品應用而生,但這對於多數初學者而言可能太複雜了,其實初學者只要從8051那類較簡易的Timer去理解什麼是Timer和實際上如何使用的原理就夠了,而往後如果需要了解更複雜的Timer相信也不會是太大的問題,寧可不要讓初學者因為太複雜的周邊導致觀念混淆或者提前放棄。

其實接觸國內名校的這些年來,我發現即便光是8位元的MCU,其實我沒看過有多少名校學生真正在第一次課程內就學得好的,至今依舊如此(MCU基礎範圍內其實還有基本介面電子電路等硬體觀念,並非只有MCU本身)。如果一開始就用複雜的MCU當教材,只是表面上好像用很新很強的平台在學習,但實際上並沒有讓初學者學得比較紮實,拿樹莓派為例,樹莓派其實是個非常非常龐大的系統,許多初學者或學生表面上都會用,但是這類平台下面的內容硬要說起來就多得跟大海一樣廣又深,表面上的功能會動並不代表學生已經掌握了這些內容,只是拿了很多現成的東西去做相當後續的應用而已...我的第一份工作的公司就是做這類平台的,從這種大SoC IC到上面的整個系統軟韌體,這個複雜度比MCU還高太多太多(所以這種公司的研發工程師人數也很多),而許多初學者或學生甚至規劃課程的老師們並沒有去了解以及看到這個面向。而自己曾經帶過的同學們也蠻多在國內知名的MCU IC設計公司服務,所以整體來說,從產業經驗來回頭看,我還是覺得8051蠻適合教學的。

--------

Q2: 8051時脈這麼慢,學這有用嗎?

A2: 其實這又是類似Q1的問題(千篇一律),我認為對於專業技術的學習效率應該不是硬體規格問題,學習一門技術所應該著重的是基礎,而不是在比較實驗教材的規格強弱(就像是使用個人電腦的人就代表懂個人電腦這麼複雜的系統設計嗎),何況MCU在多數的應用上通常本來就不是在比速度的呀(這是用途差異的問題),例如做許多I/O控制應用大多不需要太過於高速,畢竟需要等待例如馬達這些設備的反應,這些機電設備的反應動作速度是遠比不上MCU內的CPU的。如果在應用上需要複雜的演算,從系統設計的角度上來說,也未必適合在MCU端來做全部的演算,應由本身具備較強運算功能的平台專門做演算。(補充一下,近年來ST等大廠有一些很不像傳統MCU的較高速的MCU產品推出,通常用在某些具備多媒體應用功能的消費性電子產品裝置,但這類的MCU平台規格已經和網路多媒體類的SoC或Embedded Microprocessor這類通常具有MMU的CPU的平台的應用很相近了)。

--------

Q3: 近代新的MCU大多是32 bits,很多還是based on ARM Cortex-Mx CPU的MCU(如STM32/笙泉/盛群/新唐/松翰等廠商接有出產這類的MCU IC產品),若用8051會不會因為期開發環境太老舊而導致學習者在往後無法適應32 bits MCU呢?

A3: 這不太是問題,因為現代MCU應用開發,不論8051 MCU或者32bits MCU,其開發環境基本上都是使用現成的圖形介面IDE(整合開發環境,如KEILC、IAR、STM32Cube等等),其環境大同小異(應該說幾乎一樣)。真正與MCU開發環境差異大的是Embedded Linux或者更精確地說是Linux kernel space相關系統軟體的開發,幾乎全部都是透過terminal敲指令式的開發環境,這種環境下很可能根本沒有IDE這類現成的圖形化介面可用,且就開發文化/生態系而言大多還是指令式較多

--------

Q4: 繼Q1,初學者或學生們會因為用ARM based的MCU或SoC板子而突然神功附體、學習效益突飛猛進嗎?

A4: 不會。因為初學者和學生的普遍學習狀況並不會因為硬體平台規格增強,所以就學得比較好和比較多。實際上,對於大多數的初學者來說,硬體平台複雜反而容易忽略很多重要的觀念,正因為複雜,為了能看到東西會動(功能會動),反而會使用表面或現成的內容草草帶過,其觀念容易零碎化。與其如此,那還不如用麻雀雖小五臟俱全、具體而微、易於學習掌握的平台,還比較能夠掌握到底層的細節基礎,雖然是具體而微的平台,但在學習體會過這些基礎內容之後,未來再去接觸複雜的平台也比較能接受,也比較有觀念,比較不會太過零碎

--------

Q5: 那照上面這樣說,初學者學習MCU是否一定只能學8051不可?

A5: 當然不一定只能用8051不可! 我也不是要當什麼8051的死忠擁護愛戴者,這些東西(平台)都是死的,沒什麼好迷信或死忠的。關鍵是要能能從這些東西(平台)學到紮實且能延伸融會貫通的技術經驗和專業知識,才是核心重點。
如果今天有一款平台像是8051這樣,擁有麻雀雖小五臟俱全且具體而微的特性,複雜度不至於太高(對初學者來說其實如果談細節的話還是不容易)的MCU,而且又有很多技術資料可參考(容易取得),那當然絕對不一定只能用8051。
會推薦8051的原因只不過是因為這是一顆快要40年的長青樹等級的MCU,除了擁有較容易入門的特性外(事實上如果是用assembly並且針對MCU硬體架構細節原理去琢磨也已經有一些複雜度了),其技術資料和各路技術高手與網友經驗非常多,初學者相當容易取得這些資料來做為學習教材,所以才會這麼推薦用8051 MCU來作為教學平台。
另外再次重申/強調,教學應該著重於基礎技術觀念的紮實度,而不該只是看重讓東西(功能)會動就好,既然應該著重的是基礎的紮實程度(如堆疊、中斷、常見周邊的運作基本原理特性等),所以用8051這種在此些方面複雜度不算太高的平台是再適合不過了

【若需要阿良的嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

2019年2月12日 星期二

[python] 當遇到ValueError: need more than 1 value to unpack錯誤訊息


當撰寫python code時

如果透過split('符號')method去讀取某個文字檔的時後,遇到下列直譯錯誤訊息:

ValueError: need more than 1 value to unpack

通常就是讀取的文字檔可能有某行沒有你split method內所指定的符號(有時可能只是不小心按下enter產生的空白行,因為這種空白行通常不會有任何你指定的符號所以會錯誤)

如果是上述不小心按下enter產生的空白行可以刪掉該空白行就好,或者透過find method搭配條件式偵測該行有無指定符號,若無則透過continue跳過該次處理該行的迴圈,直接進行下一次迴圈的執行

關於這部分,網路上有篇文章說明得很清楚(有以實際範例來說明),可參考: https://www.jianshu.com/p/c0e43f918920

該篇文章的範例文字檔內容: http://python.itcarlow.ie/chapter3/sketch.txt 

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

2019年1月29日 星期二

方便好用的TCP/UDP傳輸測試軟體: SocketTest


當我們在做一些網路測試或物聯網系統應用開發時

有時會從上層去call Socket API來進行網路通訊資料傳輸

這邊介紹一下一個好用的GNU LGPL開源測試軟體(當然也可以自己寫一隻類似的程式, 應該不難, 但是畢竟這是人家寫好並開源分享出來的, 感謝他的貢獻orz)

SocketTest

這是一個java tool, 該軟體作者為Akshathkumar Shetty

軟體使用方式很簡單(註: 這邊我們是以windows 64位元環境及下載SocketTest v3.0版的binary file來直接進行使用測試)

首先可先到SocketTest官方網站下載其binary file或者source code
http://sockettest.sourceforge.net/




下載下來之後會是一個名為SocketTest-master的壓縮檔

透過解壓縮程式對該檔案進行解壓縮後(可用同為開源的7-Zip來解壓縮, 網址: https://www.developershome.com/7-zip/ )




再來進入到SocketTest-master中的dist, 裡面可以找到SocketTest.jar這個jar檔





由於這是一隻.jar檔, 如果我們要執行它的話, 需要jre環境(java runtime environment)
(註:若不知道jre或jdk是什麼的朋友可自行google搜尋一下相關資料)

可直接到java官網下載(這邊以windows 64來做示例): https://www.java.com/zh_TW/download/windows-64bit.jsp


下載完之後(檔名大約是jre-8u201-windows-x64之類的, 會有版本號差別)進行安裝

安裝過程似乎沒什麼需要特別注意的, 故就不再一一說明, 僅列出下圖




安裝完之後就可直接執行SocketTest.jar開啟這個程式

開啟之後可看到下圖畫面,  可利用上方的頁籤決定進行client或server的設定

這在將電腦作為server或client拿來測試嵌入式板端的socket時很方便




這邊會直接在自己這本機電腦上傳送封包給自己來進行測試實驗(當然也可以用嵌入式板子或另一台電腦傳socket封包過來給本機電腦測試)

該軟體預設的連線ip是127.0.0.1

可以改成自己電腦當下的ip來實驗 例如這邊以192.168.0.2為例

可將server設定為192.168.0.2  並設定port號  並按下Start Listening

並將client ip(connect to)設定為192.168.0.2 並設定port號   並按下Connect以進行連線

須注意 server須要先Listening, 然後client才能去連, 所以下面這張圖片故意放直的(有順序)




此時就可以在client或server的Message欄位輸入資料, 並按下send互相傳送資料



而如果是走UDP, 其設定方式也是類似, 不同的是client和server的設定在同一頁籤, 如下圖




雖然這範例說明是自己pc與自己連線

但筆者過去也曾經用過Raspberry pi 板子透過python socket API測試過

算是一款方便好用的工具!





2019年1月21日 星期一

HC藍牙模組基本設定



這篇分享一下HC系列的藍牙模組設定方式


首先要先確認您的HC藍牙模組是HC05還是HC06

如果是HC05 可設定為主(Master)和從(Slave)模式

而若是HC06 則只能設定為從(Slave)模式 (但根據熱心網友的分享,似乎也看過HC06但可以設定為主模式的狀況...大家可仔細確認一下手上的模組,感覺就算同樣是HC模組,還是可能都有差異...可能還是要以手上模組的實際狀況為主...進一步的細節待研究)

設定方式通常是透過之前介紹過的文章: USB_to_Serial轉換器或轉換線或轉換板

經由UART去下AT command來進行設定

另外,按照我本身的經驗,不同地方所買到的HC模組,其實在AT command的部分也會有些微的差異

這邊我們以透過PL2303 USB to Serial轉換線以及我手上的HC藍牙模組來說明其設定方式

安裝USB to Serial轉換線之驅動程式 之後(可參考連結文章)

將轉換線上之杜邦線端按照顏色接至藍牙模組

綠色(TX端): 接至藍牙模組之RX端
白色(RX端): 接至藍牙模組之TX端
黑色(接地): 接至藍牙模組之GND端
紅色(Vcc): 接至藍牙模組之+5V端


AT設定模式:先壓著藍芽模組上的按鈕,再接電 (按鈕標示如下圖紅色圓框圈起之部分)



前面提到,我們可以透過傳送UART資料的方式來傳送AT command到HC藍牙模組,以進行設定

我們可在PC端透過COM Port應用軟體下這些AT command到HC藍牙模組

COM Port應用軟體種類繁多,讀者們可自行線上google搜尋

這邊我是透過Arduino IDE內建的COM Port軟體來進行示範

首先在Arduino 選定PL2303 USB to Serial轉換線所對應的COM Port




然後打開"序列埠監控視窗"



接下來進行設定HC藍牙模組的配對密碼、名稱及Baudrate Rate(位元傳輸速度)設定示範

設定密碼指令:
AT+PSWD=xxxx     (xxxx為自己想設定的密碼)

名稱設定指令:
AT+NAME=xxxx    (xxxx為自己想設定的藍牙名稱)


Baudrate Rate設定指令:
AT+UART=9600,0,0   (設定為9600 bps, 後面第一個0代表設定為1 stop bit, 後面第二個0代表設定為None parity bit 也就不要同位元檢查.  若不清楚我在說什麼的讀者可Google搜尋一下UART基本協議)


主從模式設定指令:
可透過AT+ROLE?查詢目前模組是處於主(Master)還是從(Slave)狀態,預設通常都是從狀態
設定為模式: AT+ROLE=0
設定為模式: AT+ROLE=1


若設定指令輸入到HC藍芽模組成功, 則會如下圖所示



設定完成之後,為了離開AT模式,須重新上電給HC藍牙模組(這次不用按著按鈕),這時就是一般模式

後續測試步驟,原則上只要開啟手機藍牙,應該就會在掃描清單上看到我們所設定的HC藍牙模組了,首次連線會要求輸入上面我們設定的配對密碼(PSWD)進行配對,而第二次開始就可以在點擊該HC藍芽模組後直接連線

之後應該會再出一篇透過APP Inventor撰寫簡易與HC藍牙模組連線的Android APP文章


【若需要基礎C語言 與 嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章






USB_to_Serial轉換器或轉換線或轉換板


標題的Serial介面通常指的是UART (而不是I2C或SPI或其他)

通常在做嵌入式系統相關的開發時

由於軟韌體的開發通常是在PC端(Host)開發並編譯出給嵌入式系統板子(Target)跑(執行)的軟韌體

我們常會需要將嵌入式板子上的UART連接PC,透過UART來和板子進行溝通

例如在PC端上觀看嵌入式板子吐出來的Log,以利除錯

或者嵌入式板子上如果是跑Embedded Linux或Android這類系統時

Console字元的訊號來源常常就是嵌入式板子上的UART (當然也可以是走網路,如ssh,在此暫不談)

早期通常會透過嵌入式板子的UART訊號轉換為RS232訊號,並透過RS232連接線連接到PC (RS232端稱為COM Port)



但現今的PC大多已無RS232硬體介面

取而代之的是使用USB接收來自嵌入式板子UART的訊號,並且透過Virtual COM Port驅動程式,模擬過去接收RS232 Com port資料(實際是接收來自USB訊號)



以現在很流行的Arduino板子為例

在Arduino上面有一顆晶片專門轉換UART及USB訊號的chip(通常是燒有固定韌體的Atmega8U2/16U2 MCU或者CH340或者FTDI的IC)

這類的IC也可能是以在板子外的形式存在,例如下左圖的XBEE或Bluetooth Bee適配器,或如下右圖的Arduino USB2Serial Light適配器,


也可能是一塊上面有此類IC的小板子,或是如下這類PL2303 USB to Serial轉換線(IC位於靠近USB街頭端的黑塑膠殼子裡面的電路上),下一篇文章會介紹這種連接線的驅動程式之安裝步驟 (文章連結: 安裝PL2303 USB to Serial轉換線之驅動程式)

PL2303 UART/USB轉換線
紅色: +5V       黑色: GND      白色: RXD     綠色: TXD


【若需要基礎C語言 與 嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

Arduino IDE安裝及基本設定步驟


本篇文章針對Arduino IDE的下載、安裝及基本設定等方面進行操作步驟的簡介

牽涉Arduino板子的部分主要針對CH340 UART轉USB晶片(與arduino官方板子有些微不同)的Arduino Uno作簡介(許多在拍賣網站上都會買到此款Arduino Uno板子)



Step 1: 安裝Arduino軟體開發環境,網址: https://www.arduino.cc/en/Main/Software ,
點選Windows Installer進行下載並安裝(依個人作業系統進行下載)


Step 2: 選擇自己想要放置的目錄,並依序安裝完成後(請記得安裝驅動程式工具)。安裝完成後,即可在桌面看到Arduino圖示,如下圖所示


Step 3: 將Arduino板子透過USB線和電腦相連,並安裝驅動程式(通常電腦會自動搜尋驅動程 式並安裝,若無則需要自行下載CH340晶片的驅動程式)



驅動程式安裝完成後,即可在裝置管理員中看到Arduino開發板的COM編號


Step 4: 從桌面開啟Arduino應用程式,從主功能表的工具->開發板選項,選擇你的Arduino開發板型號


Step 5: 從工具->序列埠選單,選擇與Arduino開發板連接的電腦序列埠編號(COMx)


   Arduino IDE右下角會顯示您所選擇的板子型號名稱及COM號


Step 6: 若要顯示IDE之編輯器程式碼行數,可由: 檔案->偏好設定->勾選顯示行數 來設定



行號成功顯示出來,如下圖




謝謝觀賞!

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章