跳轉到內容

嵌入式系統/賽普拉斯PSoC微控制器

來自華夏公益教科書

賽普拉斯PSoC微控制器與所有微處理器一樣,也有其自身的怪癖。

如果您無法弄清楚某些內容,並且本常見問題解答無濟於事,請訪問以下論壇:

是一個良好的起點。

使用者文件

[編輯 | 編輯原始碼]

賽普拉斯PSoC常見問題解答

[編輯 | 編輯原始碼]

(如果我勾勒出的答案不正確,請*更正*它們)。

使用哪個PSoC

[編輯 | 編輯原始碼]

有些人建議愛好者使用DIP封裝中可用的大型且功能最強大的晶片——截至2008年9月,即CY8C29466 28-DIP。

CY8C29466 28-DIP——與CY8C29466 28-SSOP或28-SOIC相同晶片,類似於CY8C29566 44-TQFP、CY8C29666 48-SSOP或48-QFN,以及CY8C29866 100TQFP。除了封裝外,差異在於I/O引腳的數量。這些器件具有比任何其他PSoC(除了27xxx系列具有相同數量的模擬塊)更多的Flash(32 KByte Flash)和更多的RAM(2 KByte RAM)以及更多的數字塊(16)和更多的模擬塊(12)。

CY8C27143 8-DIP:比任何8引腳PSoC具有更多的Flash(16 KByte Flash)和更多的數字塊(8)以及更多的模擬塊(12),並且具有同樣多的RAM(256位元組)。

CY8CNP102:尚未上市(截至2008年9月),但預計將擁有256 KByte非易失性儲存器和2 KByte RAM。

(類似於嵌入式系統/PIC微控制器#使用哪個PIC

許多PSoC開發板的價格都低於100美元。其中包括

其他常見問題解答

[編輯 | 編輯原始碼]

問:它不工作!
答:您是否查看了"軟體清單:使用PSoC的技巧",作者Zlatko Saravanja,2004年?使用PSoC的技巧PSoC(R)技術參考手冊(TRM)"PSoC入門(首先閱讀本指南) - AN2010"

問:我在嘗試使用PSoC MiniProg程式設計CY8C26443時遇到問題。
答:MiniProgrammer不支援25/26系列。您必須使用ICE-4000或ICE-cube。或者切換到MiniProg支援的晶片,例如27/29系列。[待辦事項:列出晶片,並用“Y -- 已知可與MiniProg一起使用”,“N -- 不支援MiniProg”或“? -- 未知”標記每個晶片]。 http://www.psocdeveloper.com/forums/viewtopic.php?t=2057 http://www.psocdeveloper.com/forums/viewtopic.php?t=2022(我們應該將此改為表格,包含各種程式設計器——m8cprogs開源硬體、MiniProg、ICE-cube等與各種晶片的對比)。

中斷處理程式

[編輯 | 編輯原始碼]

問:如何在C語言中編寫中斷處理程式?
答:請參閱[1] "軟體清單:使用PSoC的技巧"。此外,在PSoC IDE中,選擇“幫助”>“文件”,然後選擇"C語言編譯器使用者指南"。更多討論:http://www.psocdeveloper.com/forums/viewtopic.php?t=2089 和“使用PSoC的技巧”http://www.psocdeveloper.com/old/index.php?page=8&mode=article&k=11 http://www.psocdeveloper.com/forums/viewtopic.php?t=1902 http://www.psocdeveloper.com/forums/viewtopic.php?t=2102 http://www.psocdeveloper.com/forums/viewtopic.php?t=2099 http://www.psocdeveloper.com/forums/viewtopic.php?t=2089

警告:區域“myproject_RAM”未定義

[編輯 | 編輯原始碼]

問:我收到以下訊息:

警告:區域“myproject_RAM”在啟動檔案“./obj/boot.o”中未定義,並且
沒有連結時地址。

如何消除該警告?
答:(來自http://www.psocdeveloper.com/forums/viewtopic.php?t=1761)開啟boot.tpl。最後,您將看到在RAM中定義的許多區域。在現有的RAM區域宣告下方、AREA bss宣告上方新增以下行:AREA myproject_RAM (RAM, REL, CON) 然後儲存boot.tpl檔案並選擇“配置”>“生成應用程式”。

查詢表

[編輯 | 編輯原始碼]

問:如何在組合語言中建立查詢表?
答:請參閱http://www.psocdeveloper.com/old/index.php?page=8&mode=article&k=10(嗯……您是否還需要在該表期間停用“程式碼壓縮”?)

注意事項

[編輯 | 編輯原始碼]

問:我需要注意哪些注意事項?
答:“使用PSoC的技巧”http://www.psocdeveloper.com/old/index.php?page=8&mode=article&k=11

模擬器和其他程式語言

[編輯 | 編輯原始碼]

問:除了(免費的)PSoC Designer 和 ImageCraft PSoC C 編譯器,還有哪些其他選擇? (因為它們還沒有移植到 Linux)
A1: m8cutils: http://m8cutils.sourceforge.net/ Werner 正在為 Linux 開發一個彙編器、一個模擬器和一個程式設計器 [2] [3] http://www.psocdeveloper.com/forums/viewtopic.php?t=1616
A2: Forth/PSoC Forth: Christopher Burns 寫了一個 PSoC Forth。原始碼可在 http://www.psocdeveloper.com/tools/misc_dev_tools/ 獲取。截至 2007 年,David Cary 正在 Forth/PSoC Forth 上維護它(之前是:http://forthfreak.net/index.cgi?M8cForth)。這個 Forth 編譯器可以在 Linux、Mac、Windows、Solaris、Palm 甚至 VT-100 啞終端上執行。

I/O 引腳

[edit | edit source]

問:如何將輸出引腳設定為高電平和低電平?
A:通常將輸出引腳連線到某些數字“模組”(例如 PWM 模組)。如果沒有任何“模組”可以實現你想要的功能,可以在軟體中設定它們 - 請參閱 GPIO 參考 http://www.psocdeveloper.com/articles/fundamentals_of_psoc_gpio/、GPIO 讀寫示例專案 http://www.psocdeveloper.com/docs/example-project.html、GPIO 幫助 http://www.psocdeveloper.com/forums/viewtopic.php?t=83 http://www.psocdeveloper.com/forums/viewtopic.php?t=1950(警告:請注意,PRTxDR 暫存器是隻寫暫存器 - 你無法從該暫存器讀取資料。如果你從 PRTxDR 地址讀取資料,你是在直接讀取引腳上的值,這通常*不*是你剛剛寫入的值。如果你錯誤地認為它們是一樣的,你遲早會遇到讀-改-寫問題)。(警告:“你無法從主程式碼中讀取配置為“從上次讀取更改時中斷”的埠,並且使 ISR 功能可靠地工作。” 請參閱 http://www.psocdeveloper.com/forums/viewtopic.php?t=2094)。“如何設定單個埠引腳?” http://www.cypress.com/portal/server.pt/gateway/PTARGS_0_652034_739_205_211_43/http%3B/sjapp20/cf_apps/design_supports/forums/messageview.cfm?catid=3&threadid=18055 PSoC I/O 引腳-埠配置 - AN2094 http://www.cypress.com/portal/server.pt?space=CommunityPage&control=SetCommunity&CommunityID=285&PageID=552&shortlink=DA_240474 “Zee 先生的 GPIO 簡介”,“GPIO 的基本原理” by mrzee http://www.psocdeveloper.com/forums/viewtopic.php?t=2058 http://www.psocdeveloper.com/forums/viewtopic.php?t=1667

問:對於不使用的引腳,應該怎麼辦? A:不用管它們。Designer 預設會將它們置於高阻抗模式。即使懸空,它們也能正常工作。如果真的讓你困擾,可以將它們設定為上拉或下拉。

問:XRES 應該連線到... 什麼?
A:雖然它有一個內部下拉電阻,但最好透過一個 470,1K,... 歐姆電阻將它連線到地。

I/O 引腳

[edit | edit source]

問:如何讀取單個數字輸入引腳的狀態?
A:通常將輸入引腳連線到某些數字“模組”(例如計時器模組)。如果沒有任何“模組”可以實現你想要的功能,可以在軟體中設定它們 - 請參閱上一個問題中的 GPIO 參考。

中斷

[edit | edit source]

問:如何設定一個數字輸入引腳以觸發中斷? 在哪裡放置處理該中斷的程式碼?
A:??? http://www.psocdeveloper.com/forums/viewtopic.php?t=1586 “如何確定 GPIO 中斷的來源” http://www.psocdeveloper.com/forums/viewtopic.php?t=1524

我到底需要多少位元組的堆疊?

[edit | edit source]

問:我快用完 RAM 了 - 我到底*需要*多少位元組的堆疊?
A:“stalkwalk” 實用程式執行靜態堆疊分析 http://www.psocdeveloper.com/forums/viewtopic.php?t=9,提供一個保守的估計,說明需要多少位元組。 (它還需要一些改進...)。

RS485

[edit | edit source]

問:如何將我的 PSoC 連線到 RS485 匯流排?
A1: http://www.psocdeveloper.com/forums/viewtopic.php?t=1640 提到了“第 9 位中斷... 應用筆記 AN2269 “在 PSoC™ UART 上實現 9 位協議””。
A2: 半雙工問題在 http://www.psocdeveloper.com/forums/viewtopic.php?t=1731 http://www.psocdeveloper.com/forums/viewtopic.php?t=2397 中討論。

問:UART 不工作!我快要抓狂了!
A:請以問題的形式重新說明。

混合 C 和組合語言

[edit | edit source]

問:如何從彙編中呼叫 C 函式?
A:在彙編中呼叫 C 函式時,可以在函式名前新增下劃線。例如,如果你想從彙編中呼叫名為 foo() 的 C 函式,則可以使用

 call _foo

. 這適用於不帶任何引數的 C 函式。如果你想呼叫帶引數的函式,則需要在呼叫它之前將這些引數傳遞到堆疊中。引數從右到左、從 MSB 到 LSB 推入堆疊。例如:要呼叫的 C 函式

 void foo(WORD Arg1, WORD Arg2)

彙編程式碼

 mov A,[Arg2 MSB]
 push A
 mov A,[Arg2 LSB]
 push A
 mov A,[Arg1 MSB]
 push A
 mov A,[Arg1 LSB]
 push A
 xcall _foo
 add SP,-4

中斷

[edit | edit source]

問:如何從彙編 ISR 中呼叫 C 函式?
A1:簡單方法:使用 "#pragma interrupt_handler" 來標記 C 函式。在 ISR 端,LJUMP 到 C 函式(不用費心將任何內容推入堆疊)。請參考“如何用 C 編寫中斷處理程式?”問題的答案。使用 "#pragma interrupt_handler" 標記的 C 函式可以呼叫普通的 C 函式(以及普通的彙編函式) - 但普通的 C 函式*不能*呼叫任何使用 "#pragma interrupt_handler" 標記的 C 函式。

A2:如果你堅持你的彙編 ISR *必須*“呼叫”一個普通的 C 函式,那就比較棘手。

你需要注意儲存和恢復 C 函式使用的虛擬暫存器。開啟 .lst 檔案並檢查 C 函式使用的虛擬暫存器。例如,如果 C 函式 foo() 使用虛擬暫存器 __r0 和 __r1: (假設 void foo(void)。如果 foo 有引數,請參閱“如何從彙編中呼叫 C 函式?”)

 mov A,[__r0]
 push A
 mov A,[__r1]
 push A
 xcall _foo
 pop A
 mov [__r1],A
 pop A
 mov [__r0],A

除了儲存和恢復虛擬暫存器外,還需要儲存和恢復 A 和 X。如果你正在使用啟用了 LMM 的程式,那麼在呼叫 C 函式之前必須將分頁模式恢復為本機分頁,並且還必須儲存和恢復分頁暫存器。

如果使用 "#pragma interrupt_handler" 標記了該 C 函式,並且你的組合語言 LJUMP 到該 C 函式,那麼編譯器會自動為你處理所有這些事情。

目的碼大小

[edit | edit source]

問:如何最佳化 PSoC C 編譯器生成的目的碼大小?

A1:在 SRAM 大於 256 位元組的 MCU 上,如果可能,請儘量不要使用 LMM。分頁管理帶來的開銷非常大。

A2: 除非絕對必要,請勿使用 32 位變數。

A3: 如果可能,請堅持使用 8 位 BYTE 型別的變數,僅在必要時使用 16 位 WORD。

A4: 如果可讀性沒有過度降低,請嘗試僅使用全域性變數。

A5: 避免使用指向結構體的指標和結構體陣列。 這尤其意味著避免將結構體指標傳遞給函式。

A6: 考慮限制函式引數的數量,並將所有函式可以直接訪問的通用資料設為全域性變數。

問:PSoC 支援 JTAG 嗎?
答:不支援。 但是,JTAG 的許多功能可以透過其他方式實現。 使用“m8cbscan”進行 PSoC 邊界掃描

問:PSoC 中執行的程式能否修改同一個 PSoC 中的快閃記憶體?(而不是正常情況下將程式燒錄到 PSoC 中,然後不再修改程式)
A1:... 使用 EEPROM 模組 ...
A2:... "Flash Write Routine" 執行緒中有一些提示 ...
A3:... Forth/PSoC Forth 給出了一個在 PSoC 中執行並修改同一個 PSoC 中快閃記憶體的程式示例。

進一步閱讀

[編輯 | 編輯原始碼]
  • Forth/PSoC Forth 給出了 PSoC 組合語言的示例。
  • "自制 MIDI 轉盤" 由 casainho 編寫,非常簡要地展示了 PCB 的原理圖和照片,該 PCB 上有一個 CY7C63723 微控制器(在光學滑鼠內部)... 儘管最終專案最終使用了 Atmel AVR 而不是 PSoC。
華夏公益教科書