題:
如何從“基本”微控制器過渡到ARM Cortex?
AaronD
2015-06-23 04:14:11 UTC
view on stackexchange narkive permalink

我在使用來自多家製造商的8位內核(即8051,PIC和AVR)方面有著多年的經驗,現在我有了一個Cortex M0。具體來說是這個,但我希望我們可以比這更籠統。

事實證明,這比我所討價還價要多,它包含多個描述不同部分的文檔。該系統的詳細程度各不相同,而且我還沒有真正將其連接在一起。相比之下,只有一份數據手冊可以解釋所有內容。我知道首先需要編寫更多文檔,但是格式的變化使我陷入循環。

上面的網站有一個文檔,很好地概述了每個子系統和外圍設備,還有一個詳細描述每個寄存器的代碼,我擁有其SDK的所有源代碼,包括頭文件和一些複雜的示例,但是我仍然看不到任何描述它們如何連接在一起的東西。

Cortex架構的簡要介紹,解釋了小型控制器所不具備的功能-例如從CPU到外設的多層總線,每個總線都有自己的看門狗定時器-以及它們如何連接在一起?

根據您的描述,我無法確定您是否從製造商那裡獲得了處理器的實際數據表/用戶手冊。那應該給你一個很好的整體印象和細節。從您鏈接的站點上的一張圖片中,它看起來像一個NXP處理器。查看製造商的零件編號,並在其站點上搜索處理器的說明文件。還有ARM的網站http://www.arm.com/products/processors/cortex-m/cortex-m0.php。
抱歉,延遲返回此;我一直在忙其他項目。感謝@Adam的心聲。
還要感謝@Richard提供了有關如何思考的概述以及有關打印引腳配置的注意事項。我贊成你們兩個。
除非您發現某些“極端”價格要求,否則您將永遠不會回去。即使那樣,您也會被吸引,因為有很多便宜的Cortex-M。
六 答案:
Adam Haun
2015-06-23 07:06:38 UTC
view on stackexchange narkive permalink

我研究過AVR和基於ARM Cortex-M3 / M4 / R4的MCU。我想我可以提供一些一般性建議。這將假定您使用的是C語言,而不是彙編語言。

CPU實際上是最簡單的部分。基本的C數據類型將具有不同的大小,但是無論如何您都在使用uint8 / 16 / 32_t,對嗎? :-)現在,所有整數類型都應該相當快,其中32位(int)是最快的。您可能沒有FPU,所以請繼續避免浮動和重複。

首先,請您對系統級體系結構有所了解。這意味著IO,時鐘,存儲器,復位和中斷。同樣,您需要習慣於內存映射外設的想法。在AVR上,您可以避免考慮這一點,因為寄存器具有唯一的名稱,並為其定義了唯一的全局變量。在更複雜的系統上,通常通過基地址和偏移量來引用寄存器。一切歸結為指針算法。如果您對指針不滿意,請立即開始學習。

對於IO,請弄清楚如何處理外圍多路復用。是否有中央多路復用器控件來選擇哪些引腳是外設信號以及哪些是GPIO?還是使用外設寄存器將引腳設置為外設模式?當然,您將需要知道如何將GPIO配置為輸入和輸出,並啟用漏極開路模式和上拉/下拉功能。外部中斷通常也屬於此類。 GPIO非常通用,因此您的經驗將在這里為您服務。

時鐘歸結為幾件事。您從時鐘源開始,通常是晶體或內部RC振盪器。這用於創建一個或多個系統級時鐘域。高速芯片將使用PLL,您可以將其視為倍頻器。在各個點上還將有時鐘分頻器。他們需要考慮的關鍵因素是您的CPU時鐘頻率應該是多少,以及通信外圍設備所需的比特率。通常,這是非常靈活的。當您變得更高級時,您可以了解低功耗模式之類的東西,這些通常基於時鐘門控。

內存意味著閃存和RAM。如果您有足夠的RAM,那麼在早期開發期間將程序保存在其中通常會更快,因此您不必一遍又一遍地編程閃存。這裡最大的問題是內存管理。您的供應商應提供示例鏈接腳本,但您可能需要根據程序的性質為代碼,常量,全局變量或堆棧分配更多的內存。更高級的主題包括代碼安全性和運行時Flash編程。

重置非常簡單。通常,您只需要注意看門狗定時器即可,默認情況下可以啟用它。一遍又一遍地運行相同的代碼時,重置在調試過程中更為重要。通過這種方式的順序問題很容易錯過一個錯誤。 AVR-GCC使用ISR()宏為您完成後者,但是在其他體系結構上,您可能必須手動將功能地址寫入寄存器。

微控制器外圍設備通常彼此獨立,因此您一次可以學習一次。選擇一個外圍設備並使用它來學習系統級內容的一部分可能會有所幫助。 Comm外設和PWM適用於時鐘和IO,定時器適用於中斷。

不要被複雜性所嚇倒。這些“基本”微控制器已經教會了您很多需要了解的知識。請讓我知道是否需要我澄清任何事情。

好答案。需要注意的另一件事是DMA外設,以我的經驗,這些外設往往具有復雜且文檔不足的接口。
*“現在所有整數類型都應該同樣快。” *實際上,由於C語言中的整數提升規則,使用8/16位類型會導致很多符號/零擴展,並且在閃存中可能會出現問題。低。因此,如果有可用的RAM,使用更多的32位類型或至少將`int` /`int_leastN_T`類型用於堆棧變量可能會有所回報。
我的評論有誤。我的意思是說;使用`int_fastN_t`類型,而不是`int_leastN_t`類型。
@user694733:我希望C標准允許代碼要求一個整數,該整數佔用內存中的給定大小,並且可以對特定範圍內的值進行操作,但是當超出該範圍時具有寬鬆指定的語義。在ARM之類的設備上,對於存儲在內存中的值來說,`int16_t`通常與`int32_t`一樣快,但是標準要求在`int`為17位或更大的平台上,`int16_t x = 32767;x + = 2;`必須將x設置為-32767,即使代碼永遠不會使用包裝行為,也經常需要使用符號擴展指令。
@supercat C標準僅要求對無符號類型進行包裝。對於帶符號的類型,由於可能的表示形式不同,所以任何包裝都是UB。因此,在x + = 2的情況下,對16位類型使用指令是合法的,因為編譯器可能會假設值不會自動換行,因此使用它不會改變可觀察的行為。但是我*認為* ARM沒有16位ADD指令,這使這成為可能。(我可能是錯的,我對ARM指令集的了解並不那麼好。)
@user694733:將有符號值的強制轉換和強制轉換為小於`int`的有符號類型,是指將值轉換為相同大小的無符號類型,然後將其轉換為有符號整數。如果該值在為有符號整數類型指定的範圍內,則結果是實現定義的,而不是未定義的。我認為,在大多數32位平台上,鑑於`int16_t i;是愚蠢的。在uint16_t u;中,為所有i值定義了語句i * = i;但並未為所有u值定義u * = u;但我沒有寫規則。
@user694733:我希望C的類型在很大程度上類似於`int16_t`,但是授予編譯器額外的自由,即如果將超出範圍的值存儲到該類型的變量中,則允許編譯器執行以下操作:可以任意讀取變量,得出與存儲值mod 65536一致的任何值,儘管需要* cast *才能截斷到-32768..32767範圍;相反,我要求將加法,乘法或左移運算符的結果強制轉換為或強制轉換為小於int的無符號類型。
...運算符必須將其操作數強制轉換為較小的無符號類型,並表現為對該類型執行了該操作。在將結果分配回uint16_t的情況下,允許兩個uint16_t值的乘積觸發未定義行為無濟於事。
Edward
2015-06-23 04:30:48 UTC
view on stackexchange narkive permalink

請記住,ARM擁有微處理器的知識產權,但實際上並不構成零件,這很有用。取而代之的是,製造商許可使用各種ARM處理器版本,並通過功能和外圍設備的單獨混合來生產自己的獨特部件。

話雖如此,如果您是該體系結構的新手,則可能很有意義。使用ARM的文檔,從本質上講,它是所有此類微處理器的基准文檔。

例如,在ARM網站上描述了Cortex-M0

還有一個與ARM相關的書籍清單,可以滿足各種各樣的需求和興趣。

最後,還有特定製造商的數據表。 。對於M0,賽普拉斯,恩智浦和意法半導體只是眾多基於Cortex-M0的實際零件製造商中的三個。

(不,我不曾為ARM工作,也從未如此。)

這是一個非常通用的答案,除了鏈接到某些Cortex-M0文檔之外,別無他法,我相信OP可以自己找到。
它直接解決了尋求整體文檔幫助的問題。該答案直接回答了需要,並解釋了為什麼*保持原樣。
bitsmack
2015-06-23 05:27:02 UTC
view on stackexchange narkive permalink

很大的不同是使用供應商提供的庫。對於PIC,Atmels等而言,大多數開發人員並未大量使用基本庫(用於gpio,計時器,ADC等)。以我的經驗,在編寫自己的代碼時,人們(最多)會將它們用作指導。

但是,對於ARM,幾乎總是使用這些庫。建議製造商遵循一個標準“ CMSIS”。大多數都做。它有助於代碼的可移植性(在不同的ARM之間和製造商之間),並提供了一種“標準化”的方法來構造代碼。人們習慣於看到和理解庫的功能。

肯定有一些開發人員可以直接訪問寄存器,但它們是離群值:)

為回答您的問題,我發現通讀圖書館文檔非常有幫助。 ST擁有完善的代碼,並帶有由Doxygen創建的大型幫助文件。您可以看到每個硬件模塊的所有選項。

以GPIO為例,初始化函數處理:

  • 方向(輸入或輸出)
  • 上拉/下拉
  • 集電極開/推拉
  • 壓擺率
  • 等。

通過查看選項,您可以看到可能的結果。而且,當然,您將學習如何將這些選項傳遞給Init函數!

好,現在我已經說過,我發現您的特定ARM沒有兼容CMSIS的庫。相反,他們可以下載其專有的SDK。我將開始研究他們的SDK文檔。

如果您還不喜歡該特定產品,則建議您找到其他具有更多兼容庫的供應商。無論如何,您都將攀登學習曲線,因此也可能使您的投資更便攜...

ARM很有趣!我沒回頭。

“對於PIC,Atmels等,大多數開發人員並沒有太多使用這些庫。”不知道從哪裡來。我只使用了PIC,而沒有使用AVR,但是我當然不想編寫自己的庫,例如,用於USB主機接口,TCP堆棧或SD卡文件系統。Microchip的所有這些庫似乎都足夠。
嗯,@tcrosley,您絕對正確。我只是想參考基本外圍設備所涵蓋的功能:gpio,計時器,adc等。
我同意,我通常直接訪問GPIO,計時器,時鐘和UART R / W。我*有時*將它們的庫調用用於I2C,SPI,ADC和UART設置,但並非總是如此。大量寄存器,無論您使用的是PIC(尤其是PIC32)還是ARM。
我認為此答案是針對該問題列出的最實用的答案,即使它不適用於OP的特定控制器也是如此。我認為您可以在不了解AHB或NVIC的情況下做很多出色的嵌入式工程。
@JayCarlson謝謝!您對此答案的修改已被拒絕,因為我們不應該對他人的帖子進行如此重大的更改。但這確實是個很好的信息!我建議您將其發佈為您自己的答案,這樣不僅可以幫助人們,也可以被:惱:)
-1
哦,好吧。編輯表單中說:“編輯應該是重大的改進,而不是微小的更改”
Richard Aplin
2015-06-24 15:13:50 UTC
view on stackexchange narkive permalink

移動的好時機; 8位快要死了;當您以5美元的價格購買帶有STM32F103的闆卡時,STM32F103是功能強大的32位ARM微控制器(甚至帶有USB!),毫無疑問,時代已經改變。

您已經有了一些很好的答案,但主要是我會說“忘記組裝”,幾乎會說“忘記關心cpu的工作原理”-有一天會有一個極端的案例在您需要深入研究(特定的優化或用於調試)的地方,但是ARM內核(根據設計)可以很好地運行C代碼,並且您很少需要深入研究內膽。

這確實意味著您將花費一定的時間來應對編譯器(尤其是鏈接器和makefile)的問題,以掩蓋您看不到的錯誤,但是這些錯誤都是可以克服的。

關於ARM的工作原理(即ARM cpu書籍)的內容非常繁瑣,而且直到您真正需要優化的那一天才變得非常有趣(您會驚訝地發現,當您擁有最高級的ARM時) 32位寄存器,並且PLL的CPU時鐘在100mhz左右)。

與較新的“ Thumb2”相比,“老套”的ARM指令集更容易閱讀反彙編,後者是您在大多數現代微控制器級ARM(Cortex)上發現的-但是彙編語言說明的內幕大多淡出背景。如果您擁有正確的工具集(尤其是具有斷點/單個步驟等的不錯的源代碼級調試器),則根本就不必擔心它完全是ARM。

一旦您進入世界32位寄存器和32位數據總線寬度,以及您想在片上獲得的所有東西,您再也不需要回到8位CPU了;基本上,“放輕鬆”並且編寫代碼更易讀而不是效率通常沒有任何懲罰。

但是……外圍設備……是的,這就是問題所在。

您肯定會在現代MCU上玩很多東西,其中很多都是花哨的東西。您經常會發現複雜的世界,遠遠超出了AVR,PIC和8051片上外圍設備。

一個可編程計時器?不,有八個! DMA? 12個具有可編程優先級和突發模式,鏈接模式以及自動重載和.. and ..和... i>的通道怎麼樣? I2S?數十個引腳混合選項?重新編程片上閃存的十五種不同方式?肯定!

通常感覺就像您從飢荒過渡到外圍設備的盛宴一樣,通常您會佩服整塊芯片,但卻很少使用(因此,時鐘門控)。

如今,片上硬件的數量(以及僅一個供應商的芯片產品線的變化)就令人難以置信。一個芯片供應商當然會傾向於重複使用IP塊,因此,一旦您熟悉某個品牌,它就會變得更容易,但“如今完成工作變得瘋狂起來。”

如果有任何外圍設備及其交互(以及DMA和中斷,總線分配以及and and ...)非常複雜(有時,數據手冊中描述的精確並非如此),因此工程師經常擁有最喜歡的ARM MCU系列,並且傾向於僅僅因為他們熟悉外圍設備和開發工具就想堅持使用它。

好的庫和開發工具(例如,使用適當的調試器進行快速的編譯+調試週期)和大量可運行的示例代碼對於當今選擇ARM MCU而言,項目絕對至關重要。似乎大多數供應商現在都擁有極其便宜的評估板(

我確信您已經註意到,一旦您超越了具有ARM的微控制器級別並進入SOC級別(例如Raspberry Pi / etc風格的SOC),那麼這些規則徹底改變這一切都關於哪種類型的Linux你要運行,因為 - 有難以察覺的例外 - 你會狂叫瘋嘗試別的

基本上;無論在這次演出中為您預先選擇的CPU是多少,都可以購買一些來自不同供應商(TI,STM,Freescale等)的基於超便宜Cortex的評估板,並且 div>

最後的建議;一旦在數據表中找到描述所使用的 exact 零件編號芯片的引腳混合選項的頁面或三頁,您可能需要將其打印出來並粘貼在壁。在項目後期發現由於引腳混合而無法實現某種外圍設備的組合是沒有意思的,有時信息被掩埋了,您發誓他們會試圖隱藏它:-)

一個快速的附錄-如果您的項目遠不只是最簡單的控制器,請考慮使用RTOS-您選擇的內容都有一定的學習曲線,但即使是最小的ARM,如今也有足夠的運氣運行多線程OS。我個人發現ChibiOS是具有精益功能的強大組合(特別是在STM32上運行,它帶有一個不錯的外設庫),但是有很多選擇。
Ronan Paixão
2016-12-09 23:08:03 UTC
view on stackexchange narkive permalink

我也來自AVR,現在通常堅持使用STM32(Cortex-M)。這是我對初學者的建議,並反映了我剛開始時遇到的困難:

  1. 獲得帶有調試器或至少一個JTAG連接器的電路板(然後購買JTAG調試器)。周圍有很多便宜的東西,使用它可以節省很多時間。

  2. 獲得包含所有內容的良好IDE。我很久以前就推薦過 CooCox CoIDE。從那時起,它停止並重新開始了開發,所以我不確定現在情況如何。 “良好的IDE”使您可以立即使基本的Hello World LED閃爍。

  3. “一個好的IDE”應設置製造商的CMSIS標頭。基本上,這是寄存器映射,可以更輕鬆地編寫C / C ++程序,並使用變量名代替純數字和指針。

  4. 如果不需要絕對最佳的性能,請嘗試使用製造商的外圍設備庫。實際上,由於您正在學習,您現在暫時不這樣做。如果以後發現需要進一步壓縮,請查看庫代碼以了解其作用。關於庫的好處還在於,它們通常允許您使用同一製造商提供的具有相同代碼的許多不同芯片。

  5. 與AVR不同,ARM芯片從禁用外設開始。您需要先啟用它們。一個好的外圍設備庫將提供有關如何正確使用外圍設備的示例,您可以從設備的數據表中獲取更多信息。因此,請記住在使用時鐘和外設之前先啟用它們。是的,即使I / O端口也被視為外圍設備。

  6. 所學的代碼。不要試圖一次完成所有操作,因為這確實很複雜。我將從學習時鍾樹(APB,AHB等總線)以及時鐘和時鐘分頻器如何交互開始。然後,我將查看IDE在何處為您的設備存儲鏈接器腳本啟動代碼。鏈接描述文件幾乎就是您組織內存(RAM,閃存,ISR向量表等)的方式。啟動腳本會設置您的程序(諸如將全局變量初始化器從閃存複製到RAM等操作)。有些IDE在ASM中具有啟動腳本,而有些在C中具有啟動腳本。有時候,您可以使用自己喜歡的語言,用Google編寫另一個腳本。

  7. 讓調試器盡快運行。一開始會犯一個錯誤,通常是按照與您應該執行的順序不同的方式進行一些操作(通常是硬件初始化)。有時會觸發一個ISR異常,使您進入 while(1); 無限循環(該ISR的默認實現),該循環會暫停您的程序,即使使用調試器也很難跟踪。想像沒有調試器。

  8. 談論調試器,嘗試使UART也運行,然後使用串行USB適配器讀取該信息。 printf()調試總是有用的:-)

  9. ol>
Mahendra Gunawardena
2015-06-23 05:27:05 UTC
view on stackexchange narkive permalink

我在8051,AVR或PIC上工作不多。但是最近我開始研究ARM Cortex MX系列處理器。因此,對於從8051,AVR或PIC過渡的內容,我知之甚少,但主要還是從初學者的角度出發。

ARM®Cortex™-M4處理器基於哈佛架構,因此具有獨立的數據和指令總線。以下是高級圖片。

enter image description here

本週,恩智浦代表將訪問我們的工廠。我將與他們一起檢查是否有NXP ARM-Cortex Mx資源,並將其發佈在此處。飛思卡爾具有基於ARM®Cortex®-M內核的 Kinetis低功耗32位微控制器(MCU),據我了解,它們也具有學習ARM處理器的類似指南。不幸的是我還沒有研究它們。


參考文獻:



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...