[筆記] 整合NXP LPC11x 與 KEIL C 開發環境

        三~四年前,當開發恩智浦的 LPC11xx (ARM Cortex-M0) 韌體時,設計者必須在名為 LPCXpresso 的套裝軟體下執行,它提供各系列晶片的周邊驅動程式與原始碼,方便使用者 compile & link。如果要除錯程式的話,這套軟體必須再搭配使用名為 LPC-Link 的除錯器,我們用它來除錯也可燒錄代碼。幾年前,LPC 並不支援在 KEIL C 的環境開發 (當時很多 ARM 晶片都用 KEIL 環境開發),所以只能安裝 LPCXpresso,後來 LPC 已經成功整合到 IAR / KEIL 等環境了。有關的開發軟體與除錯器可以連結到 LPCware 的網站上。

        最近我的 LPC-Link 好像壽終正寢,USB 完全偵測不到它。原本想再買一個 LPC-Link,不過因工作需要我也常常使用 ULINK2 在開發與除錯意法半導體 STM32 晶片 (ARM Cortex-M3),於是想要將 LPC 開發環境移植到 KEIL C上面,這樣就只要維護一套開發軟體和一個除錯器,也能開發設計 STM32 和 LPC11x 韌體了。圖一就是移植到 KEIL 所需的重要檔案,原本的驅動程式原始碼移過來,並替換掉下列的檔案,基本上就大功告成了。
              core_cm0.c
              system_LPC11xx.c
              startup_LPC11xx.s   (原 cr_startup_lpc11.c in LPCXpresso)

圖一:LPC11xx 整合到 KEIL環境

        除錯的方面,因為不用 LPC-Link 後,首先要將 ULINK2 除錯器接到晶片接腳上。我的 ULINK2 一端連著一條 20-pin JTAG 排線,而真正使用到 debug 的腳只有五根,分別是 Vcc, GND, NReset, SwClk, SwDio。因此,只要將上述的五根接腳接到 LPC111x 晶片對應的 pin 腳,大致上就完成了。

              NReset <---> PIO 0_0
              SwClk  <---> PIO 0_10
              SwDio  <---> PIO 1_3

<< FreeRTOS >>

        即使 LPC11xx 是低階的 ARM Cortex-M0 晶片,如果沒有整合 RTOS 的話,基本上使用起來也沒甚麼問題 (main 函式裡用一個無窮迴圈處理所有的事情)。不過,如果想要讓系統開發更具效率,更容易維護整體程式碼的話,整合一套 OS 是不錯的方法。這裡介紹 FreeRTOS 這套作業系統,從它的官方網站來看,它已經成功地將 RTOS 整合到多家 MCU 晶片製造商。之前,我經常使用的意法半導體 STM32 晶片也早就使用 FreeRTOS v6.1 當作作業系統了,所以我也有意把 LPC11xx 與 RTOS 整合起來,讓整個系統開發具有效率,運行也會有效率。圖二所示是整合 FreeRTOS 的相關檔案。

圖二:LPC11xx 整合 FreeRTOS 環境



<< 功耗模式 >>

        省電是 ARM-based 讓市場受歡迎的原因之一,恩智浦的 LPC11xx 提供四種功耗模式:全速 (active)、小憩 (sleep)、休眠 (deep sleep)、關機 (deep power down)。


  •  全速模式 -  晶片的  ARM 核心和晶片的周邊都提供系統時脈,所以是耗電最多的模式,但也是系統能全速運算的模式。


  •  小憩模式 -  仍舊供電給晶片的周邊並且提供系統時脈,但是 ARM 核心進入小憩模式,暫時不執行運算指令,直到有中斷產生喚醒 ARM 核心。這個模式與全速的功耗不會相差太多,因為只有節省到晶片核心的耗電量而已。一般來說,只要呼叫  __WFI()函式就會自動進入小憩模式了。


  •  休眠模式 -  這個模式除了停止供電給核心之外,連晶片周邊的模組也暫停供電了,所以這個模式省電的效果比起前一個模式會更加顯著。注意:當進入休眠模式後,晶片內的暫存器、記憶體和周邊的狀態還是能保留在休眠的前一刻,只要被喚醒後,晶片就能從休眠的點繼續原本的程式。喚醒休眠的方式主要透過 12 根腳位 (PIO 0_0 ~ 0_11 和 PIO 1_0) 的變化來喚醒系統,我們可以配置暫存器決定哪個腳位或哪些腳位的變化來喚醒。

  • 關機模式 -  這個模式把晶片核心和周邊的電源都關閉了,連內部暫存器、記憶體的資料都不再保留,所以這模式最為省電。雖然所有記憶體的資料都可能不見了,但唯一有五個 32-bit  暫存器能保存關機時的資料。因此,在進入關機模式前,我們必須將想要保存的資料先放到這五個暫存器裡面,等到開機喚醒之後,再從這五個暫存器將資料取回。喚醒關機模式的方式必須透過 WAKEUP 接腳的變化 (由高電位轉成低電位時) 來喚醒整顆晶片。


留言

此網誌的熱門文章

[筆記] Raspberry Pi 樹莓派的軟體開發

[應用] 在 ESP32 Audio 開發板的 VoIP 範例

[筆記] Android APP 藍芽範例說明 -- BluetoothChat

[筆記] ESP32 在 VS Code 開發環境的編譯與除錯

[筆記] Android APP BLE範例程式 -- BluetoothLeGatt

[筆記] Visual Studio 遠端偵錯的設定步驟

[應用] 藍芽 BLE client/server 架構:BLE remote controller