總網頁瀏覽量

顯示具有 C語言 標籤的文章。 顯示所有文章
顯示具有 C語言 標籤的文章。 顯示所有文章

2025年8月26日 星期二

台科大機械工程系學員 跨領域學習 韌體工程師所需的 嵌入式Linux系統建置 團體課程 專業

 



台科大機械工程系碩士班(一般生)畢業,目前在產業界擔任韌體工程師的學員(目前正在我開的團體課程學 嵌入式Linux系統建置)

----------

近期我在台北 自強基金會 開的 團體課:

1. [台北假日班]【適合非電機電子科系背景學員的電子電路入門】使用Tinkercad平台學習電子電路原理與實作

https://iws6645.pixnet.net/blog/post/347570356

2. [台北班]ARM Cortex-M based MCU嵌入式單晶片微控制器韌體開發(基礎)(自備NB)

https://edu.tcfst.org.tw/web/tw/class/show.asp?tcfst=yes&courseidori=14C066&fbclid=IwY2xjawMaOn5leHRuA2FlbQIxMABicmlkETF1VkszbjV4bVlwZWhwaFM5AR54cO77f0vpcPGkVxXXfJZQr3nNPIwgbYcNXRmyD1zyy0Kf9HKIyPuJFS19PQ_aem_zUcXH3T5HMFxf9iKs-bC3w

(這門有可能會延期到9月13開課,因前面有課程)



近期已對 設計大廠 聯詠(Novatek)公司 進行專業領域內容的廠訓授課完成


近期已對 顯示器驅動 IC(Display Driver IC, DDIC) 市佔率 全世界第一 以及 數位電視SoC等 IC 的 設計大廠 聯詠(Novatek)公司 進行專業領域內容的廠訓授課完成。



資料來源:

https://zh.m.wikipedia.org/zh-tw/%E8%81%AF%E8%A9%A0%E7%A7%91%E6%8A%80?fbclid=IwY2xjawMaMnFleHRuA2FlbQIxMQABHsiHkKaoAWldr4AHXkAAaMd_98yOFrpvFR7HKztM1dMTmeCtm6nBLc5prR6H_aem_xm8nosiMmgpvddoL1z-JFw


2025年7月8日 星期二

(7/12本周六開課 最後3個名額) 自強基金會(台北分會) 加開班[台北班] ARM Cortex-A based 平台之嵌入式Linux作業系統基礎建置實作 (附贈可跑Linux的嵌入式系統開發板 及 相關材料,課程現場實作)(自備NB) 如期開班

 

(最後3個名額) 自強基金會(台北分會)  加開班[台北班]  ARM Cortex-A based 平台之嵌入式Linux作業系統基礎建置實作 (附贈可跑Linux的嵌入式系統開發板 及 相關材料,課程現場實作)(自備NB)  如期開班 

報名連結 : https://edu.tcfst.org.tw/web/tw/class/show.asp?tcfst=yes&courseidori=14C065&fbclid=IwY2xjawLZaSVleHRuA2FlbQIxMABicmlkETFkMEFZb3VFYk81QnZZTHFrAR7tos6xwsLxux7ZfpjOhZH4Rj17zfL0wNqK9_MgSaBu0Kivx0cUXmo6aKkWAA_aem_nuZimA1fP_DQvjMfGE-GNA

因為有3位學員因臨時有事無法全程參與課程(想改成其他梯次上課),所以目前這梯課程目前有3位空缺,請有興趣或者原本是候補備取的學員,若想早些上課,可考慮報名這個梯次喔~ (7/12也就是本周六開始上課,上午9:00~下午16:00,中午1小時午餐休息)。 

每梯次課程的學員人數會有所限制  (因兼顧課程品質,所以會限制每梯次上課人數,學員當場聽我講解完原理及實驗步驟講解之後,馬上當場進行實作實驗操作,我會當場協助解決每位學員實際遇到的問題,所以要花時間,故限制每梯次人數)

課程內容大綱 (包含Linux GPIO驅動程式demo影片) 如下方連結所示:

https://www.facebook.com/sun.wen.liang.580515/posts/pfbid0kaH649i56VadgQqHw1dWoPKya8MRP1eYQNWioFwApHvLd2TGHbj6Kgu8CsaxFJ5Bl?__cft__[0]=AZWfbGKL6LYtzDTu088827Ns3WLAtCWDx5rl1dckyiGuqATaqJz34KTxUib9rocJOrGQGytMGBFXAKc_RifouHIzMuOdSnQrQiKQNVyo693AfWfLvurFGMHsYEEGW4dGnOOn6TJbTG6FcOpkqayeWvbXyW3F430sayWxft9h1qT1Mg&__tn__=%2CO%2CP-R

從GNU ARM Linux Cross compilation toolchain(GNU ARM Linux編譯工具鏈 arm-linux-gnueabi- )、samba server等基礎開發環境建置、及於Host PC Linux distribution(Ubuntu)之上建置 for ARM cortex-A based SoC為核心單元之嵌入式系統開發板(Embedded system dev. board )之 開機啟動程式 Bootloader (U-Boot)、Linux kernel(Linux作業系統核心) 及 根目錄檔案系統 Root filesystem (Busybox)、U-Boot階段Tftp upload kernel image(from PC to the dev. board)等,並於嵌入式系統開發板實際執行驗證之後,接續的課程單元為Linux核心驅動程式的基礎。

Linux核心驅動程式課程基礎課程內容包含Beaglebone black Rev C.的BJT作為開關的電子電路原理、AM3358 SoC(系統晶片)內的 GPIO registers (clock、pinmux、output enable 、clear data及set data等暫存器)、Linux kernel module(driver program/.ko file)撰寫(包含各式基本的系統呼叫System Call、file operation struct、copy_from_user/copy_to_user、裝置註冊相關的Kernel API等等)、及上層應用程式等觀念與實際範例皆逐一介紹,從硬體(電子電路、系統晶片架構、GPIO周邊裝置驅動)到 系統軟/韌體程式開發 皆完整涵蓋(原理與實作實驗)。

#Linux裝置驅動程式

#嵌入式Linux系統

#Linux_kernel_driver

#Linux_kernel_module

#Linux

#Embedded_Linux

#Device_driver

#ARM_CortexA_based_SoC

#TI_AM3358_SoC

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

歡迎各方洽談合作,務實/踏實追求共好。歡迎各方洽談合作,務實/踏實追求共好。歡迎電機電子資工本科系學員,也很歡迎非電機電子資工本科系的學員加入學習嵌入式系統技術/尋求轉職成為研發工程師的行列。

孫文良 個人簡歷: https://sites.google.com/view/wenliangsun/


‼本園區開設之技術課程進一步詳情請參見下方blog網頁的課程介紹👇:
本學習區之Facebook粉絲頁如下:

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

孫文良 (阿良的嵌入式系統技術學習區)

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

2024年9月26日 星期四

用ARM based的MCU或SoC晶片平台,並不代表就是在學ARM

 在台灣,許多人用了ARM based的MCU/SoC為主晶片的板子,就以為自己在學ARM,其實一輩子都完全沒真正接觸過ARM processor的內容,所以可見很多人其實根本不曉得自己口中的ARM到底是是指什麼/講什麼,也沒有很清楚自己做了一堆周邊應用但到底在實作什麼挖糕,其理論基礎對應的學科我想應該是計算機概論。


十幾二十年下來,這早已經變成嚴重的以訛傳訛。這類似的觀念在台灣真的很多。

另一個例子,有不少人以為學80x86原理沒意義,但其實Intel 在2016年所推出的Inte lQuark系列微控制器(MCU) D2000就是基於1993年推出的Pentium CPU。平台和技術年份根本不是重點,哪時會被拿來套在新平台或衍伸出新技術都不一定。用什麼款式的平台去學基礎其實不是該執著的點,只要適合學習即可。


-----

歡迎各方洽談合作,務實/踏實追求共好。歡迎電機電子資工本科系學員,也很歡迎非電機電子資工本科系的學員加入學習嵌入式系統技術/尋求轉職成為研發工程師的行列。

孫文良 個人簡歷: https://sites.google.com/view/wenliangsun/


‼本園區開設之技術課程進一步詳情請參見下方blog網頁的課程介紹👇:
本學習區之Facebook粉絲頁如下:

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

孫文良 (阿良的嵌入式系統技術學習區)

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



本園區之嵌入式系統基礎技術課程的導向,偏重產業開發所需的基礎,而非讓初學者看到花俏功能為目的

多年來對於嵌入式系統領域的開發與教學經驗讓我感受到,多數產業公司找工程師來開發產品的功能目標是應用,但是開發技術的訓練/基礎奠定的過程,絕對不適合是應用導向 (例如單純call API/現成函數而沒有深入了解其原理細節),不能只是用現成的模組和函數去湊出功能,起碼要了解最基本的基礎觀念與系統架構。以背後設計原理為主,不以主打看到花俏功能為目標,所以我的教學基本上不會強調及主打主流媒體喜歡提及的AI、IoT及應用功能,而是著重在軟韌體開發的細節(如C語言的語法細節原理、軟硬體系統架構),主要希望栽培開發所需要的基礎。

因為在真實去產業界做真實的產品開發階段(嵌入式系統軟韌體/軟硬體整合),不太可能都只純粹依靠那些高度現成的開發板及太過上層的API做應用(即便是使用API也常要懂其背後原理,也可能是要從更底層去做開發),因為實際做產品開發和純創意maker角度需求、所需的背景基礎程度大多是不同的。

在訓練課程中,一旦主打應用功能或者花俏的趨勢 (AI或IoT應用功能之類的),就容易掩蓋掉基礎,而讓初學者誤以為自己會了,但其實只是綁在某塊開發板及其現成的範例程式或函數(常見的例子就是使用標準Arduino API函數所集成的範例程式去兜出應用功能,而沒有去懂更進一步的原理)。而實際上要從頭開發(或較有深度的開發)時,就會發現自己其實沒有具備該有的能力和觀念(其實即便是應用這些API,要做好產品也是需要懂原理,否則將容易產生許多問題)


-----

歡迎各方洽談合作,務實/踏實追求共好。歡迎各方洽談合作,務實/踏實追求共好。歡迎電機電子資工本科系學員,也很歡迎非電機電子資工本科系的學員加入學習嵌入式系統技術/尋求轉職成為研發工程師的行列。

孫文良 個人簡歷: https://sites.google.com/view/wenliangsun/


‼本園區開設之技術課程進一步詳情請參見下方blog網頁的課程介紹👇:
本學習區之Facebook粉絲頁如下:

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

孫文良 (阿良的嵌入式系統技術學習區)

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

2023年5月24日 星期三

嵌入式「系統」不是純軟體,包含軟體與硬體(亦包含電路)。推薦全華科技出版的一本電子電路相關書籍


多年前還在讀碩士班時,覺得這本電子電路的書籍(如下圖,來源連結)很不錯(並非刻意幫該書籍打廣告)。雖然後來是以嵌入式系統軟硬體整合開發為主(包含沒有作業系統以及有作業系統的系統軟韌體開發以及周邊電路整合設計),但從高職開始接觸這些始終覺得很有親切感。


來源連結


不過印象深刻的是,當時在成功大學工程科學系資訊組(資訊工程與應用組)的研究所讀碩士班時,該組的所有師生,除了自己之外,幾乎完全沒有其他任何人對於類比電子電路有基礎及興趣....(甚至對數位電路有興趣的也不多),只有一位大學部專題生跟著我做一些相關方面。

其實對於物聯網(IoT)之中的感測單元/嵌入式系統來說,上述的方面絕對是重要的,否則如果一個IoT系統之中的感測電路子系統所產生的訊號是錯的,導致raw data是錯的,如果這些基本的輸入內容本身就是有問題的,根本不能期望用了(輸入到)什麼酷炫神奇AI演算法並以上層軟體整合執行之後,系統的結果就會正常,就好比人吃白飯,不可能會拉出金銀珠寶;又好比不可能用純語音訓練出來的語音model去做影像辨識、不可能沒有任何硬體單元之下就可以拿到感測資料(精確來說,世界上沒有甚麼「純軟體」這種事情,只是藉由可程式化的方式(分層)操控電腦這個「硬體系統」去完成功能)。但坦白說從碩士班許多同儕、業界的同事發甚至主管的狀況來看,「以為數據資料處理辨識演算法可以取代感測訊號處理電路」是某些純軟體的人有些觀念錯誤的地方(包含業界一些老闆和主管),但是成大工程科學系其實在大學部有一些電路相關的必修學科課程,也有微控制器系統相關的必選課程,但顯然對於許多人來說,修課的效果可能是極為有限,許多人其實有修過課,但就幾乎好像是沒修過一樣。而其實我在一些選擇走資訊軟體方向的電機系畢業學生身上也有看到一樣的狀況,並不是工程科學系的學生才有如此的狀況。

此外,也有一些具備電路、MCU韌體開發相關背景的資深業界主管,誤以為自己所做的系統不是嵌入式系統。換句話說,很多方面都問題來自於自身不擅長的跨領域問題(雖然以學校科系來說,工程科學系號稱是主打跨領域的系所)。

嵌入式系統是具備特定功能的電腦「系統」,包含硬體與軟體,絕對 不是 只有作業系統或者只有上層應用程式,很多人常誤以為嵌入式系統就是有跑作業系統軟體的系統,這也是常見的錯誤認知。事實上,多去查詢基本定義即可得知,歐美的專業領域課本也常列出,例如Muhammad Ali Mazidi等人所著作的「The 8051 Microcontroller and Embedded Systems (2nd Edition)」,從書名就可理解我上述所說,該原文書的進一步詳情可參考留言處,而這類原文書通常會將這些基本名詞的定義做出說明。

又要講實話了,台灣有很多人很愛嘴上談「學術」兩字,但是實際上似乎大多不太會想去把基本名詞定義給弄清楚,這是蠻奇怪的事情,如果重視學術就該有基本的嚴謹度,而不是只是把「學術」兩字掛在嘴巴上好像很高尚,但卻缺乏實質的內涵,偉大的工程開發貴在對細節的用心,包含這些名詞基本定義和用語。


-----

歡迎各方洽談合作,務實/踏實追求共好。

個人簡歷: https://sites.google.com/view/wenliangsun/


‼本園區開設之技術課程進一步詳情請參見下方blog網頁的課程介紹👇:
本學習區之Facebook粉絲頁如下:

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

孫文良 (阿良的嵌入式系統技術學習區)

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


2023年5月16日 星期二

「應付考試」 真的 不一定等於 「 學習」

 在臉書上看到 曹齊平老師/學長的這篇 貼文:




而 後輩我 個人的感觸如下:

曹齊平老師/學長 是大約在40年前的成大工程科學系畢業的學士、以及清大動力機械系畢業的碩士,那年代的大學很少、碩士更少,當年要考上這些學校,難度比近20年來考上這些學校的難度困難太多。要論考試,他絕對是高手,然而他勇於講出許多人不願意去面對的事實,也就是「考試不一定等於真正的學習」。

我個人近年來輔導許多工程師/名校生/產學公司主管/名校大學教授等 的經驗及感觸也是如此 (嵌入式系統工程技術開發設計領域),很多「基本」的內容或者基礎名詞的含義等方面,反而鮮為人知,因為缺乏深入的思考內化,且容易滿足於考試分數的表象以及這些表象所帶來的現實面好處/表面上的成就,導致許多人在需要實際進行工程技術專案開發時遭遇到許多障礙,大多肇因於真正的基礎(不是應付考試的那套,需要實際搭配實務去了解內化內容)不好。

考試確實只是一種容易量化競爭比較的方式,不一定真的等於「學習」,事實上,學歷也是類似的道理,但社會因應多人的情況,制度上就是以這些表面易於量化篩選的方式為主,久而久之就形成了根深蒂固且難以變通的文化/價值觀。

想起了幾年前一位名校碩士生跟我說的:「考試前再熬夜準備,這樣子CP值比較高」。但其實這種做法/習慣/觀念 ,對於專業工程技術的學習 及 「研究/開發」過程是極度不合適的,但是這確實就是多數人被台灣教育體系所培養出來的觀念。

以現實面而論,或許考試制度仍有其一定程度的必要性和作用,有其優點但也有很多缺點,但關鍵是社會大眾看待考試制度的態度/心態,不必過於極端、過度看重,應該可以更多元的去深入了解思考專業知識內容,以及更多包容/理解那些較不喜歡這種篩選方式的族群(絕對也有其強處,也不一定比較不聰明)。

我覺得如果在台灣大家很愛講「學術 」這兩字,那就更應該去多深入花時間面對許多表象以外的真實內容以及含義,而不是嘴巴整天講學術而其實都「只是」喜愛易於量化的表象(例如分數幾分、學歷有沒有拿到、年薪多少、論文數量績效、計畫經費數量績效、頭銜、年資數量等),這些一點都不「學術」。

或許沒有任何一種制度/體制是十全十美的,但重點其實是在於群眾看待這些制度體制的態度,不應該去過度迷信任何一種體制/制度,因為那樣只會造成體制/制度的缺點持續放大或者腐敗,應該要客觀地因應時代去看待/監督並動態調整。

-----

個人簡歷: https://sites.google.com/view/wenliangsun/


‼本園區開設之技術課程進一步詳情請參見下方blog網頁的課程介紹👇:
本學習區之Facebook粉絲頁如下:

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

孫文良 (阿良的嵌入式系統技術學習區)

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



感謝各家產業界工程師學員的在課後的主動心得分享回饋肯定

最近對於一位AIoT相關產品開發的軟韌體工程師學員於其開發過程中所遇到的 Arm Cortex-A9 processor(with MMU) based SoC/MCU(廠牌為 瑞薩/Renesas之 bootloader、chip internal/external RAM的access以及對應的flow、linker script等方面的相關問題和狀況進行解析及說明。


-------



-------


另外,於上個月的另一位於IC設計產業任職的軟韌體工程師在之前的課後主動心得分享回饋如下:


(現在較重視保養喉嚨&課程學員人數控管了)


感謝各路軟韌體工程師學員們,對於我的嵌入式系統技術諮詢課程的支持鼓勵~!!
歡迎各方洽談合作,務實/踏實追求共好!

-----

個人簡歷: https://sites.google.com/view/wenliangsun/


‼本園區開設之技術課程進一步詳情請參見下方blog網頁的課程介紹👇:
本學習區之Facebook粉絲頁如下:

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

孫文良 (阿良的嵌入式系統技術學習區)

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




2023年4月20日 星期四

近來,收到來自國內一線 IC design house 公司之研發工程師 的 技術輔導課程需求

近來開始有收到國內一線 IC design house 公司軟韌體工程師學員來尋求軟韌體系統開發基礎的輔導諮詢課程需求,有這方面課程需求的人明顯比過去還多。

長期以來,我很感謝所有工程師學員的認可和支持。

對於各類工程師的相關需求,都非常歡迎。

因自身一路以來的經歷和體會,多年來對於多數學校在軟韌體系統設計開發、軟硬體整合技術方面的巨大學用落差(亦包含許多產業公司對於招募機制的問題與輕忽)與技術輔導的看法及評估,至今已得到結果方面的證實。

(許多問題的根源是來自整個台灣社會長期以來的觀念和文化,並非單一方或者單一問題所致)

事實上,許多嵌入式系統開發的實際面向來說,絕對不單只是coding純軟體方面的技術問題(例如很多實際的軟硬體整合或/週邊驅動應用的開發、SoC(系統晶片)/MCU(微控制器)晶片中的內部硬體架構觀念,與這些年在某些公司面試與年輕求職者之間所盛行的純軟體刷題幾乎無直接相關,許多是軟體與基礎硬體觀念之間的隔閡問題;反過來說,許多較偏向純韌體的工程開發單位,普遍較缺乏對於計算機系統、作業系統方面的基礎觀念理解),實際狀況牽涉許多對於系統的理解、背景知識、自身對於軟硬體基礎的缺乏及實際開發除錯的經驗與思考等等。

歡迎各方洽談合作,務實/踏實追求共好。


-----

個人簡歷: https://sites.google.com/view/wenliangsun/


‼本園區開設之技術課程進一步詳情請參見下方blog網頁的課程介紹👇:
本學習區之Facebook粉絲頁如下:

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

孫文良 (阿良的嵌入式系統技術學習區)

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


2021年12月16日 星期四

【嵌入式系統基礎原理與實務課程】ADC驅動應用基礎教學

昨天替一位有十幾年業界經驗的工程師學員上課 (嵌入式系統基礎課程,該學員希望未來有機會轉職嵌入式系統韌體程式開發),

到了ADC (Analog to Digital Converter)基礎應用原理與實作應用的單元。

實驗平台使用ADC0804 (沒想到在過了十年後,又接觸到這顆IC),雖然這顆IC的型號款式似乎停產(?) 目前在各大通路都缺貨導致價格昂貴 (似乎有些地方的賣價漲到單顆IC數百元),

且這顆ADC0804是並列輸出(Parallel Output),現在的產品或許應該已經很少會用這顆IC。現在許多ADC都已整入於MCU/SoC之中,就算外接通常也會使用串列輸出(SPI、I2C)類型的ADC chip(例如Microchip的MCP30XX系列ADC)。

但是,這顆ADC(ADC0804)拿來作為嵌入式系統韌體初學者的教材仍然很好用,其中許多基礎包含MCU IC 與 周邊IC 之間的整合,還是有值得初學者學習之處,

例如ADC上的CS(Chip Select)、RD(Read)、WR(Write)、INTR(Interrupt)等腳位(Pin)的驅動存取 與 整合應用、ADC IC Datasheet內容(包含訊號的電氣特性、時序 等等)、與輸出類比訊號的感測器sensor(如光敏電阻作為環境亮度感測器之間的基礎整合應用)。

嵌入式系統軟韌硬體的初學者可藉此學習到以核心處理單元(如各式MCU/SoC)存取像是這類周邊裝置IC(如ADC)的一些相關基礎。

本單元課程內容包含ADC基礎應用原理(A/D的取樣、量化、解析度規格等),實驗方面以8051 MCU與這顆ADC0804之間的整合應用為主,以C語言撰寫MCU韌體去擷取ADC0804輸出的數位訊號教學,實驗方式包含透過MCU的GPIO與中斷控制器,去針對ADC0804 INTR訊號與轉換完畢的數位輸出訊號作輪詢(Polling) 與 中斷(Interupt),這兩種機制都會作完整介紹並且帶學員進行實驗。

黑線IC的部分修改自TI ADC080X Datasheet的general schematic來進行教學實驗中的電路繪製

TI ADC080X Datasheet

TI ADC080X Datasheet

TI ADC080X Datasheet

TI ADC080X Datasheet


註: 此課程專注在嵌入式系統韌體的ADC應用基礎教學,而不是在純硬體電路設計,所以該課程實驗教學沒有到去區分各種接地的差異。 

此外,課程也提供使用 別種形式的ADC實驗平台的教學選擇,例如使用MCU/SoC內部的ADC (例如: 該單元可用Atmega328P MCU內部ADC進行實驗教學)。

------

‼課程進一步詳情請參見下方blog網頁的課程介紹👇:

2021年9月4日 星期六

適合初學者的【嵌入式系統基礎原理與實務課程】

‼ 在此推廣一下 適合初學者的【嵌入式系統基礎原理與實務課程】‼

👉 本po文的影片內容為一個簡易的小範例,由8051 MCU GPIO之Output(輸出)驅動LED完成簡易跑馬燈功能。

影片內容包含從操作KEIL C51 IDE的免費評估版對程式碼進行編譯,並且藉由 ISP (In System Programming) 燒錄方式(便宜又好用) 對8051 MCU進行燒錄並觀察執行結果。


.

❓ 看完這篇po文的demo影片,或許有些學員會感到疑惑,這影片的跑馬燈功能,豈不是在學校課程裡面就看過/做過了? 這不是都很簡單嗎? 

 

不用擔心 🥸,其實這些表面上簡單的demo功能的背後,其實有著許多深入的學問和需要學習的基礎觀念,在業界做深入的技術問題時很可能會需要這些觀念,而許多大學學校課程不一定會詳細教背後詳細原理,也可能是學員過去從來沒有仔細思考過的較深入的基礎內容。

.

以這個po文的demo影片內容來舉例背後涵蓋的基礎內容,例如: 

👉 以8051實際實作範例說明低階語言 (組合語言,Assembly Language)與C語言(高階語言)的實際差異介紹

👉 介紹8051 指令集 (組合語言 其實即為對應指令集 的 助憶符號)

👉 MCU的原廠官方Datasheet技術手冊的基本閱讀能力

👉 MCU內部架構、GPIO架構原理(例如Port0的open drain是指什麼)、暫存器存取、記憶體組織架構

👉 MCU外部介面電子電路原理(與基礎,包含數位電路和類比電路及訊號的基本觀念)

👉 C語言的各種技巧與重點(包含8051基礎應用以外的平台的韌體開發常見內容和觀念),韌體程式流程追蹤與撰寫

👉 整合開發環境(IDE)操作

👉 ISP燒錄韌體之方式,以及燒錄器所對應軟體之操作 


上述內容在本學習區所開設的課程內容中都會詳細講述,

.

許多學校課程會講的內容,本課程當然會涵蓋到;而就連許多學校課程裡面沒講到的(詳細細節原理與實務開發經驗),在本課程內還是會學到。

.

註: 這門課的核心並不只是教你8051 Microcontroller,而是關於嵌入式系統(Embedded System)的軟硬體入門理論觀念與技術基礎,

同時也會補充許多「真正的計算機概論」的重要內容,不要懷疑,多數人不一定真的有理解過,包含: 

👉 何謂電腦?

👉 何謂嵌入式系統? 

👉 何謂跑non-OS及何謂有跑OS的電腦(計算機)系統

👉 何謂CPU? 何謂MCU(微控制器)? 何謂微處理機? 何謂SoC(系統晶片)? 

👉 產業相關職缺類別與實際可能的工作內容情況(講師分享自身的產業工作經驗與曾經輔導多位學員的經驗)

👉 以8051 MCU作為範例實作的目標教材,目標是希望學員能打下紮實的嵌入式系統基礎,課程內容中會有一系列的基礎實作教學

.


本園區之FB粉絲專頁如下:

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

孫文良 (阿良的嵌入式系統技術學習區)

個人簡介: https://sites.google.com/view/wenliangsun/

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先參考 課程招生網頁連結


2021年7月30日 星期五

於10年前,在大二暑假時期設計製作的以8051 MCU為核心的PCB電路,順便聊聊某些名校大學系所的推甄文化。

想當初就讀大學時期,除了堅持學業成績常保持在第一之外,幾乎每個寒暑假、甚至修課讀書以外的時間都自願在實驗室做專題專案度過(坦白說比起多數人的大學生活來說,真的不輕鬆,但很充實,將碩班生活提前到大學時期來過),

當時主要為了想要多參加教育部競賽,以便推甄名校大學的碩士班。沒想到後來到了所謂名校大學,看到不少名校大學大學部直升的學生幾乎是不用花太多時間做專題,更不用積極參加校外全國競賽,很輕易就可以直升本系碩士班(有些系所真的只看考生大學就讀的校名、系名,或者看是否有認識的教授推薦,就佔了大部分的錄取因素,但如此的作法確實也錄取了許多大學時期不太用心在專業方面的直升學生,說真的不少人的專業實力在大學時期是真的沒什麼累積,就連學科理論基礎也未必比較有概念),坦白說,時至今日,個人對某些不太客觀的推甄錄取標準現象仍感到有些感慨。

分享一下10年前,於大二升大三的暑假時期,在實驗室開發的一個小作品(印象中這個小作品後來沒有拿去正式參賽,後續我和同學們還做了另外四至五個作品專案去參加教育部舉辦的競賽,也在大三這一年內,拿到了4個教育部競賽獎項),這是一個8051 MCU為核心的PCB電路,包含MCU韌體程式的撰寫(使用KEILC開發環境)、電路設計、PCB電路Layout和製作。這是就讀大學時期的第一個PCB電路  (記得在更久以前,在就讀高職時期,就有做過小型電子琴電路,當時也是洗板子,但印象中當時Layout好像是用手繪的方式..所以當時電子琴電路的走線沒辦法這麼筆直)。

而當時還不流行Arduino這類的現成MCU板子,所以除了韌體程式和PC端GUI程式的撰寫之外,我們大學那間實驗室的電路板幾乎都是學生們自己做電路設計、Layout設計 和 洗版製作的。

主要透過Counter計數來自8051 MCU外部的紅外線遮斷模組的訊號,並透過GPIO顯示於LCD,同時也藉由UART輸出串列資料,再藉由ICL232  IC將8051 UART訊號電氣位準轉換為RS232 Cable訊號位準,將資料傳輸資料至PC端由GUI程式做後續應用處理。

當時設計製作的PCB電路,如下FB貼文中的照片所示。



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

孫文良 (阿良的嵌入式系統技術學習區)

個人簡介: https://sites.google.com/view/wenliangsun/

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先參考 課程招生網頁連結

2020年12月11日 星期五

【STM32】【ARM 】ARM Cortex-M3 CPU bit-banding功能機制講解,以STM32F103之GPIO範例程式為例

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

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

< 簡介 >

這篇文章以市面上很流行的俗稱STM32F103C8T6 MCU最小系統開發板隨附的簡易GPIO驅動範例程式為例,因為這是一個淺顯的應用範例,所以適合寫成文章分享。相信許多初學者都曾以此範例來測試板子以及開發環境,但是許多人可能對於內容細節的方面沒有較深入的探討及了解,這邊會針對一些重點部分的細節做些說明

(註: ARM Cortex-M3 CPU2004年就被推出了。而本文所講的ARM Cortex-M3 CPU basedSTM32F103這款MCU2007年推出,但至今現在市場上似乎還是供不應求)

STM32F103C8T6 MCU最小系統開發板

這個板子隨附的應用範例是個以MDK-ARM(KEILC)為開發環境的範例專案,我們這邊主要以編輯器將程式碼開起來並搭配官方硬體手冊資料來trace其流程和重點細節。專案裡面的主程式流程是屬於non-OS類的程式(沒有跑作業系統)

觀察main.c的main function不難看出其主要應用流程(目的/功能),該流程是要驅動/控制STM32 MCUGPIO,以驅動開發板上面的LED,達到一般肉眼可見的亮/滅閃爍的功能。

程式碼的註解是我加上去方便讀者觀看


雖然它這個範例main function的回傳值型態寫int,然後其實沒有return,這方面不太標準

這篇文章主要針對PCout()的內容原理進行詳細的追蹤與分析探討


< 主要內容探討 >

PCout()從表面上看起來是一支函式(function),但其實是個macro(巨集),內容在GPIOLIKE51.h這支檔案裡面,其主要內容為BIT_ADDR(GPIOC_ODR_Addr,n)


(: C語言之中,巨集和一般函式各有其特性,須看場合挑選合適的方式來應用。若以相同使用量的狀況下來比較兩者,則簡單來說,前者相對較省執行時間但是較耗費儲存空間;而後者相對較省儲存空間但較耗費執行時間。使用量越多則各自的特性所帶來的結果和差異也越顯著)

#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))

#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))

(volatile unsigned long  *)(addr)是將addr整數數值轉型為位址(address),以利存取(定址)記憶體空間或周邊裝置的暫存器(這屬於memory-map IO的方式去存取周邊,後面會說明)。而PCout()的狀況來說,addr就是會被代入GPIOC的暫存器(register)address(位址)數值,也就是0x4001100C

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

補充: 關於volatile關鍵字

C語言中的volatile關鍵字用來提醒編譯器,避免編譯器過度最佳化的狀況在所修飾的變數上發生

我們用GPIO input應用當例子來說明,如果GPIO外接一個按鈕,這個按鈕被按下的時機是由user按壓按鈕的狀況而定。所以,如果我們上面談到的這指標((volatile unsigned long  *)(addr))指向放置GPIO input digital signal的暫存器的位址,也就是將addr這個欄位代入正確對應的暫存器的位址,而該暫存器的內容()會隨user對按鈕的按壓狀況而改變(從單一bit來看就是10,下面再進一步解釋),所以這指標((volatile unsigned long  *)(addr))須使用volatile關鍵字修飾

user對按鈕的按壓狀況而改變的狀況,以下面這個電路為例(截取自範例中的部分電路來說明),按鈕按下就是0(low level),沒按的就是1(high level)。當然可能有些按鈕的機械彈跳狀況須要透過軟體或硬體的方式去避免(debounce,因為不是這篇文章的重點,所以這部分就不在此贅述)

按鈕電路

再額外補充一個指標指向I/O周邊時可能會使用到volatile關鍵字的例子,特別是在嵌入式系統上面常見到的狀況。

ADC(Analog to Digital Converter)轉換由感測器輸出的類比訊號進而轉換為數位訊號(數位值)之後,依照現在許多ADC的設計,這個數位值通常會被硬體自動放置在某個暫存器(舉個別款MCU的例子,例如Arduino uno/nano/mini/fio等板子上面的Atmega328這顆同樣有內含ADCMCU的狀況,這個數位值就會被放在ADC Result Registers,因為是轉成10bits的數位值,所以因為一個byte長度的暫存器放不下,所以就放在兩個暫存器內,ADCH的和ADCL),而這個暫存器內的數位值就會因為感測器感測的環境變化而跟著改變),現在為了方便說明,我們假設這個暫存器只有一個,而我們宣告一個指標變數指向這個暫存器,那這個指標變數在宣告時通常也須要加上volatile關鍵字以防止編譯器做了過度的最佳化導致非預期的後果(告知編譯器,在程式裡面指定要讀取的時候就真的是須要從ADCregister(暫存器)去讀值,不可因優化而簡化掉)

所以addr被轉型為unsigned long的address(為了對硬體做存取),也須用volatile關鍵字修飾,以避免非預期的狀況發生

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

補充: 關於memory-map I/O port-mapped I/O

STM32F103 MCU內的ARM Cortex-M3 CPU是使用memory-map I/O的方式[4][5],簡單來說也就是CPU透過nativeload/store指令去存取記憶體(SRAM空間)與周邊裝置(GPIOUARTI2CSPIADC…等等,更嚴格精確來說就是存取這些周邊裝置的控制或讀取相關功能的暫存器),如同將這些周邊裝置的暫存器當成記憶體空間來存取。至今ARM Cortex-M系列CPU應該都是屬於使用memory-map I/O的方式去存取周邊(有沒有特殊的例外不清楚)

另一種出現在其它平台(x86)的方式為port-mapped I/O,可以讓I/O周邊和記憶體空間獨立區分開來,也就是表面上同一個address號碼,可以是存取記憶體空間的address,也可以是存取周邊裝置暫存器的address,雖然表面上是同一個address位址數字號碼,但是在兩邊是獨立不同的實體硬體空間。而既然要獨立區分兩種空間這種port-mapped I/O方式要使用特定的CPU指令去存取I/O周邊(而不是一般的load/store指令),而以CPU架構設計的角度,設計這些特定的CPU指令就要耗費相對的電晶體資源。

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


回到主題,多了一個'*'字號的 *((volatile unsigned long  *)(addr)) 的意思就是這個指標所指向的位址的硬體(記憶體或暫存器)的內容值(以這邊的例子來說就是GPIO暫存器的內容值)。多嘮叨補充一下,這內容值以實際硬體的角度來看,其實就是數位訊號。

所以綜上所述,如果有仔細理解上述內容的讀者應該可以得知為何我們在main function之中去寫PCout(13)=1就得以直接驅動GPIO輸出high level(邏輯1)的數位訊號。因為在上述巨集的實作方面,就已經讓PCout(13)=1直接對應存取GPIO之對應暫存器的內容值

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))這個BITBAND(addr, bitnum)這個macro的功能/目的就是要將addr和bitnum轉化對應到正確的暫存器位址並且可以atomic operation完成對暫存器的存取(後續會說明),可先參考這支GPIOLIKE51.h:

#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C

我們可以從STSTM32F103x8 Datasheet[1]memory map以及RM0008 Reference manual[2]GPIO registers的說明內容得知,0x4001100C是這顆STM32 MCUGPIOCODR(Output Data Register)暫存器的位址,並且可在STM32F10x_StdPeriph_Driver之中的stm32f10x.h裡看到對應的GPIOC_BASEAPB2PERIPH_BASE#define值。

Ref:[1]

Ref:[2]

而一大串的((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))主要是為了能正確存取Bit-banding功能方面的alias region的位址,這邊先針對Bit-banding功能機制作些說明。

Bit-bandingSTM32F103 MCU內的ARM Cortex-M3 CPU的一種功能特性(ARM Cortex-M系列的其他款式CPU應該也有,詳情請參照對應的ARM官方手冊確認),當CPU(執行我們寫的程式碼)alias region之中的word做存取(STM32word長度是32bits),就會對應存取到bit-band regionSRAM記憶體空間 周邊裝置暫存器的某個對應的bit,如下ARM Cortex-M3 Technical Reference Manual官方手冊[3]的圖所示(這個圖是以存取SRAM空間為例)。而在這個STM32F103C8小板子的範例程式之中就是要存取GPIOC_ODR暫存器的bit13


Ref:[3]

STM32F103 MCU的規劃(搭配ARM Cortex-M3功能特性),在SRAMPeripheral的方面都有這種Bit-banding機制/功能各有1MBbit-band region範圍,如下方的ARM Cortex-M3 Technical Reference Manual[3]的System address map圖。而因為alias region的一個word對應bit-band region1bit,一個word長度是32bits,所以對應的存取設定區域也就是的alias region的長度範圍為32MB(SRAMPeripheral各有32MBalias region對應各自的1MBbit-band region)

(提醒:前述已有提到ARM Cortex-M系列CPU basedSTM32 MCU是以memory-map I/O式的方式去存取Peripheral周邊裝置)

Ref:[3]


在寫入的方面,對
alias regionword寫入0x01或者0xff(其實就是必須針對對應的wordbit0寫入1)都會讓bit-band region的對應bitset1,另外這個寫的過程其實會被轉換成atomic(操作過程不會被打斷)
read-modify-write operation
;而在讀取的方面,將會從alias region所讀到的wordbit0讀回所要讀取的bit-band regionbitstatus(1 or 0)

Bit-Banding機制/功能的優點就是讓CPU能透過使用一般的Load/Store指令即可完成bit的讀/寫,這和過往只能先透過執行read(load相關指令)、modify(通常是邏輯運算相關指令)、write(store相關指令)流程的一連串相關獨立指令來完成bit讀/寫的傳統方式不同。所以Bit-Banding機制/功能也有助於節省code size

另外官方手冊[2]也有提到CPU在進行bit-band operations時,除了特殊狀況之外,基本上是不會停頓(stall)

對於BITBAND這個macroARM官方的Cortex-M3 Technical Reference Manual[3]有直接給出公式如下,本文的後續內容也會針對這些公式內容的由來進行詳細解說

Ref:[3](紅色框起的是我認為命名不直覺的部分)

回頭來看我們範例程式內的macro,前面內容提過addr0x4001100C

關於#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))之中的(addr & 0xF0000000):

0x4001100C(addr)0xF0000000AND運算的目的是為了取出/取得結果為0x40000000也就是peripheral的起始位址或稱peripheral base address(由上面官方手冊內的Ref:[1]memory map圖可得知)

接下來的+0x2000000(加上0x2000000)之目的就是為了得到我們peripheralalias regionstarting address,也就是公式中的bit_band_base(Cortex-M3 Technical Reference Manual官方手冊[3]裡面的內容: bit_band_base is the starting address of the alias region.),也就是0x42000000

ARM Cortex-M3官方手冊[3]這個公式裡面的bit_band_base我認為在命名的方面有些不直覺的問題(因為會讓人導致誤解以為是bit-band regionstarting address,但其實是alias regionstarting address)。所以我認為應該要將公式內的此項目名稱改叫作bit_band_alias_base或者alias_base才對,畢竟是alias regionstarting address!才剛想完,我就上網google搜尋了一下,在加拿大有間大學Ryerson University的電機與電腦工程系2019年開設的Embedded System Design課程[7]Lab 2: Exploring Cortex-M3 Features for Performance Efficiency講義內容[6]就真的在他們的講義內將bit_band_base改以Bit Band Alias Base Address表示,如下圖:

Ref:[6]


:其實0x2000000就是十進制的33,554,432,也就是32M(32*1024*1024)alias region的起始位址就是bit-band region起始位址加上32M之後的address

((addr &0xFFFFF)<<5)+(bitnum<<2)也就是bit_word_offset也就是(byte_offset x 32) + (bit_number × 4)。其中(addr &0xFFFFF)取出0x0001100C0x1100CGPIOC_ODR暫存器的offset位址偏移量,左移5位等於乘以32(公式中的*32),等於0x220180

(如果不想了解上面公式原理的讀者可直接參照公式,跳過這個註解): 為何要左移5(等同乘以32)?細心的讀者如果搭配上面內容的Ref:[3]的官方例圖來觀察就應該可以發現,因為每一個word32 bits也就是4bytes也就是會占掉4address號碼(每一個byte的資料會對應存放於一個address,這是電腦的基本rulebyte-addressable。暫存器和其位址的對應也是一樣),而alias region的一個word是對應到bit-band region的一個bit,換句話說,在bit-band region差了1bit就等同在alias region差了4address號碼的距離(1word)的位址距離。而如果是在bit-band region差了1byte(8bits)的位址距離,就等同在alias region差了32address號碼(8word)的位址距離(8*4=32),但這只能知道這個長度為32bitsGPIOC_ODR暫存器的位址(bit-band region)對應到alias region的一段空間的32word的開頭的位址(對應暫存器的32個位元,一個位元對應一個word)

但實際上我們所希望存取的暫存器的bit,是哪個word(其位於alias region的位址到底是哪個),就還要加上bitnum*4也就是bitnum<<2 (左移兩位),例如如果我們想存取暫存器的bit00*4=0,代表的就是該word就是從上述alias region的一段空間的32word(包含128個位址)的開頭的位址(對應暫存器的32個位元)的開頭(+0)的這個word去存取;如果是想存取暫存器的bit11*4=4,代表的就是該word就是從上述alias region的一段空間的32word(對應暫存器的32個位元)的開頭的位址去加上4(+4)的這個位址(這個word)去存取,所以到此也已經說明為何macro內容的最後要加上(bitnum<<2)。而在我們這個範例的例子中就是bitnum13,故bitnum<<2(乘以4)的結果就是52(十六進制的0x34)

(2020/12/13更正,原先我誤將13<<2的結果看成24,其實是十進制的52,也就是十六進制的0x34)

所以最後我們將公式內的各項結果相加: 0x42000000 + 0x220180 + 0x34 = 0x422201B4

這個0x422201B4就是GPIOC_ODR暫存器的bit13alias region所對應的word的位址

上面關於bit-banding的這部分比較複雜,初學者可能要多花點耐心才比較能看懂。如果想進一步閱讀關於Bit-banding功能機制(alias regionbit-band region)的官方說明資料,可參考ARM官方的Cortex-M3 Technical Reference Manual[3]或者STRM0008 Reference manual[2]3.3.2章節。或者如果有對上述內容不清楚的朋友,我的課程內容(未來預計將會陸續開設STM32 MCU應用開發實務基礎的相關課程)會有相關的引導。

另外,我手上的範例程式中的stm32f10x.h中的某些巨集的註解將alias regionbit-band region給寫反了,看日期得知這應該是2010年code

範例程式專案中的stm32f10x.h有錯誤的部分


< 結語 >

雖然這篇文章是用一個淺顯的應用範例(控制GPIO以驅動LED閃爍)來作為說明對象,寫這篇文章的用意有二: 

(一) 為協助初學者與有興趣了解相關專業內容的人

(二) 希望讓一些習慣看技術表面的族群不要只看到表面,雖然這只是個LED閃爍的範例,但內容包含的學問可不少,光是看了上面的細節內容我想就可以讓更多人理解,工程實務不是簡單的事情,不要以為驅動GPIO沒什麼。如果覺得簡單,通常是有以下兩個原因

(1)只看到表面功能,只看到東西功能會動即滿足,但沒有去思考這背後要作多少事情及其原理,才會有眼下的這個應用功能

(2)因為用的是現成的東西,有人幫你做好太多事情,如果都要自己從頭來,恐怕沒幾個人有能力在短時間內做好,因為這絕對不是call現成的APIOK的事

何況這文章的內容這還只是這範例專案中一個部分而已,事實上如果要細說細節真的講不完,例如booting flow、進入main()之前還有一系列的初始流程(如將stack初始化)、clock init、GPIO init等等,只是太多東西都是廠家在事先所做好的(前人的累積)。

我想還是希望能藉由這類文章,讓一些比較少親自動手或長年來基本上沒從事過開發的族群,特別像是多數的資深專任大學老師或者已經很久沒動手的公司高層大咖們了解實際真實的工程實務的難度和重要性。


如果因為對於這些內容的本質不夠深入了解,可能會有些誤解,例如誤以為什麼這些範例程式的寫法過時了。而其實基本上根本就沒有這個問題,原因如下:

1. 除了本文所探討的bit-banding方式,以及傳統的直接對GPIO_ODR暫存器做讀(read)-(modify)-(write)的存取之外,STM32F103 MCU存取GPIO_ODR暫存器確實也其它方式。例如去設定GPIOx_BSRR對應GPIOx_ODRbit set/clear(而另一個暫存器GPIOx_BRR只能做clear),但是也是只能一次寫32bits也就是一個word(設定GPIO_BSRRGPIO_BRR)去對應控制GPIOx_ODR的狀態(按照[2]針對GPIOx_BSRR的說明所述的:These bits are write-only and can be accessed in Word mode only)

上述這使用GPIOx_BSRR的例子,和本文所探討的bit-banding是不同的方式,而且bit-banding機制不是只有針對周邊裝置,還可以針對SRAM空間做存取,SRAM有什麼BSRR可用嗎?何況bit-banding本來就也是一種ARM Cortex-M3 CPU所提供的方式/機制,讓開發者可以獨立去set/clear registerSRAM的單一bit。這機制有它合適的應用場合,只要不是被官方公開宣稱其功能必須被完全取代的狀況下,機制/方法的選擇沒有什麼絕對的優劣好壞之分,只有開發者自己會不會用的問題,而沒有什麼過時不過時的問題,畢竟這顆MCU的硬體特性/功能提供的選擇就是如此(就是有這些方式),既然這個功能特性仍存在,那就不會失去探討的意義

如前面提到的,ARM Cortex-M3 CPU2004年就被推出了。而本文所講的ARM Cortex-M3 CPU basedSTM32F103這款MCU是在2007年被推出的,但至今現在市場上似乎還是供不應求。

另外,bit-banding功能機制在ARM Cortex-M4 CPU是個optional feature [8]。

2. 有用的知識就是有用(有核心重點知識/觀念上的通用性和可延伸性),例如C語言就是C語言,C語言已經被用了好幾十年了,C語言的指標也被用了好幾十年了,暫存器的觀念也好幾十年了,所以這和過時不過時有何相關如前所述,只有開發者自己會不會用的問題,而沒有什麼過時不過時的問題。

 

< 參考資料 >

Ref:

[1] STM32F103x8 STM32F103xB Datasheet - production data, https://www.st.com/resource/en/datasheet/cd00161566.pdf

[2] ST RM0008 Reference manual - STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced Arm®-based 32-bit MCUs, https://www.st.com/resource/en/reference_manual/cd00171190-stm32f101xx-stm32f102xx-stm32f103xx-stm32f105xx-and-stm32f107xx-advanced-arm-based-32-bit-mcus-stmicroelectronics.pdf

[3] ARM Cortex-M3 Technical Reference Manual, https://developer.arm.com/documentation/ddi0337/h/programmers-model/bit-banding?fbclid=IwAR1OuCvOHza3oUnJK68PiIX9ytKBJhsTwatgI6Jg_zF6D9GfMZVvTmesI5o

[4] Memory-mapped I/O, https://en.wikipedia.org/wiki/Memory-mapped_I/O

[5] Lecture 5: Memory Mapped I/O, https://www.youtube.com/watch?v=aT5XMOrid7Y

[6] Ryerson University Dept. of Electrical and Computer Engineering - Embedded System Design course - Lab 2: Exploring Cortex-M3 Features for Performance Efficiency, https://www.ee.ryerson.ca/~courses/coe718/labs/Lab2.pdf

[7] Ryerson University Dept. of Electrical and Computer Engineering - Embedded System Design course, https://www.ee.ryerson.ca/~courses/coe718/

[8] ARM Cortex-M4 Processor Technical Reference Manual, https://developer.arm.com/documentation/100166/0001


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

孫文良 (阿良的嵌入式系統技術學習區)

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