各位攻城獅好,由逐飛科技設(shè)計制作的全新的 IoT 開發(fā)板推出啦!這是一款基于恩智浦 LPC55S69 芯片設(shè)計的簡約而又不簡單的開發(fā)板,下面直接讓我們來看看這塊小小開發(fā)板都有些什么特別的地方吧!
一、LPC55S69 芯片怎么樣
首先來看看這個小板子的核心,了解下 LPC55S69 這顆芯片怎么樣。
LPC55S6x 家族是全球首款基于通用 Cortex-M33 的微控制器,并且它是第一款基于 40nm 工藝的 MCU,動態(tài)功耗僅僅 32μA/MHz。采用 Armv8-M 架構(gòu)以及 TrustZone-M 和協(xié)處理器擴展,性能和高級安全功能達到新水平。
它的內(nèi)核是雙核架構(gòu),由兩顆 Cortex-M33 組成。這里特別注意的是這兩顆內(nèi)核有大小之分,Core0 內(nèi)核是全功能的 Cortex-M33,而 Core1 則去除了 TrustZone、MPU、SAU、FPU、SIMD 等內(nèi)核增強的功能。Armv8-M 架構(gòu)允許客制化的協(xié)處理器,NXP 利用這一特性加入了 DSP 加速器 PowerQuad 和加密引擎 CASPER,分別從運算和安全兩個角度顯著提升 MCU 本身的性能。
這款 MCU 運行頻率高達 150MHz,擁有高達 640KB 的 FLASH,以及 320KB 的 SRAM。
1.1、安全性上:除了 TrustZone-M,還有 PRINCE 模塊對寫入到片上閃存的數(shù)據(jù)進行實時加密,擁有 AES-256 加密 / 解密引擎、安全散列算法 (SHA1/SHA2) 模塊,可以通過專用 SRAM 上的芯片指紋提供物理不可克隆功能(PUF),還擁有隨機數(shù)生成器(RNG)、唯一的 128 位設(shè)備識別序列號(UUID)、安全通用 IO。
1.2、模擬外設(shè)上:
1.ADC 是這次 LPC 的 MCU 升級最大的地方,ADC 升級到 16 位 1M 采樣率,具有 5 個差分通道對(或 10 個單端通道)以及多個內(nèi)部和外部觸發(fā)器輸入,且支持 2 個獨立的轉(zhuǎn)換序列,同時擁有連接至 ADC 的內(nèi)置溫度傳感器;
2. 具有 5 個輸入引腳和外部或內(nèi)部基準電壓的比較器;
同時通信接口上極為豐富:
1.8 組 FlexComm 接口,可以讓用戶靈活的配置得到最多 8 路串行接口(UART、I2C 和 SPI 任意組合,最多 8 個)或者 4 組全雙工模式的 I2S 接口。
2. 一個獨立高速 SPI 接口,最高可運行在 50MHz 的頻率,流暢刷一個小屏幕的 LCD 不再是夢想。
3.USB 接口一如以往的領(lǐng)先業(yè)界,一個高速 USB 和一個全速 USB 接口,均集成 PHY 以及支持主機和從機模式。
4.SDIO 接口也在以前的 LPC 基礎(chǔ)上做出了重大改進,安全的數(shù)字輸入輸出(SD/MMC 和 SDIO)卡接口, DMA SDIO 支持兩個卡。支持的卡類型為 MMC、SDIO 和 CE-ATA。支持 SD2.0 和 SR25。
1.3、數(shù)字外設(shè)上:
1.2 個 DMA 控制器,DMA0 控制器,具有 23 個通道和多達 22 個可編程觸發(fā)器;DMA1 控制器,具有 10 個通道和 16 個可編程觸發(fā)器;
2.1 個 CRC 引擎模塊,可使用支持 DMA 的 3 個標準多項式中的一個計算所提供數(shù)據(jù)的 CRC;
3. 最多 8 個通用 IO 可選為引腳中斷(PINT),由上升沿、下降沿或兩種輸入沿觸發(fā);
4. 兩組通用 IO 中斷(GINT)支持基于輸入狀態(tài)邏輯(AND/OR)組合的中斷;
1.4、并且定時器上還配備了:
1.5 個 32 位標準通用異步定時器 / 計數(shù)器,支持多達 4 個采集輸入和 4 個比較輸出,可選擇特定的定時器事件生成 DMA 請求;
2.1 個 SCTimer/PWM,具有 8 個輸入和 10 個輸出函數(shù)(包括捕獲和匹配),輸入和輸出可引至或引自外部引腳,內(nèi)部引至或引自所選外設(shè),在內(nèi)部,SCTimer/PWM 支持 16 個捕獲 / 匹配,16 個事件和 32 個狀態(tài);
3.1 個 32 位實時時鐘(RTC), RTC 中的定時器可用于喚醒所有低功耗模式(包括深度節(jié)電模式),具有 1 ms 分辨率;
4.1 個多通道多速率 24 位定時器(MRT),可用于在多達 4 種可編程固定速率下重復生成中斷;
5.1 個窗口看門狗定時器 (WWDT),使用 1MHz 的 FRO 作為時鐘源;
6.1 個微節(jié)拍定時器,通過看門狗振蕩器運行,可用于將器件從睡眠和深度睡眠模式中喚醒;
7.1 個 42 位自運行 OS 定時器作為系統(tǒng)的連續(xù)時基,適用于任何低功耗的模式;
可謂外設(shè)豐富、功能強大,各位 MCU 玩家是不是想上手折騰一下了呢。
二、如何使用 IoT 主板快速入門
2.1、首先自然是硬件平臺
進入正題,首先我們需要一個配套的開發(fā)硬件,這里就需要 IoT 開發(fā)板上線了!這個開發(fā)板只有 54*78.75mm 的尺寸大小,比掌心還要小一點。雖然體積小巧,但該有的接口一個不少,接口形式豐富,涵蓋了所有的片上功能所需引腳。
兩個 Type-C 類型的全 / 高速 USB 接口,MICRO SD 形式的短體卡座一個,6 個 FlexComm,UART、I2C 和 SPI 任意組合,按需分配復用。
上述都是固定的接口,不能自行 DIY 接口接線,需要可以自定義的,功能又完備的接口?那擴展的 Arduino 接口怎么樣呢?
該 IoT 開發(fā)板拓展的 Arduino 接口上囊括了 GPIO、ADC、PWM、USART、I2C、高速 SPI 功能,不僅可以接入配套傳感器、自行拓展接線,也能接入部分 Arduino 接口的外設(shè)與器件,DIY 性能 MAX。
豐富的接口搭配上配套的傳感器(持續(xù)更新增加中)等外設(shè),就能涵蓋絕大多數(shù)的學習、原型階段開發(fā)的需求。
2.2、當前配套傳感器、模塊(后續(xù)也會持續(xù)新增添加):
1. 氣壓計 MS5611 模塊,一款高精度氣壓傳感器,量程 10~1200mbar,精確度(25℃,750mbar)±1.5mbar,電源 1.8V~3.6V;
2. 溫濕度計 SHT31 模塊,量程 0~100%RH/-40~125℃(精度±2% RH/±0.2℃),電源 2.15V-5.5V,能耗 4.8μW (在 2.4 V 時低重復性, 1 次 / 秒);
3. 激光 TOF 測距 VL53L0X 模塊,絕對范圍 2M,精度(23℃電壓 2.8V 下不含蓋板玻璃測試)典型偏移為±10mm,電源電壓 2.6V~3.5V;
4.2.4 寸的 TFT 彩色屏幕,以及可選的配套 FT6336 驅(qū)動的電容觸摸屏,支持最多兩點觸控;
5.ESP8266,應用比較廣泛、功能也比較齊全的一款 WIFI 模塊。
重點介紹:這塊開發(fā)板上有一個全新的接口形式:FlexComm 接口,這是為了統(tǒng)一傳感器接口而定義的一種新的 2*5pin 接口,與 LPC 系列的 FlexComm 外設(shè)對應,可以復用成 UART、I2C、SPI 或者 I2S 功能。
接口具有防呆設(shè)計,即使插反也不會導致傳感器損壞,含有 5V 以及 3.3V 供電接口,GND 對腳設(shè)計。上述的配套硬件的傳感器皆為使用 FlexComm 接口設(shè)計,可以直接插在任意一個 FlexComm 接口上使用。
使用這個接口,統(tǒng)一外設(shè)接口形式,設(shè)計時可以根據(jù)不同需求進行定制,這樣可以將傳感器設(shè)計成 Plug-in Card 形式,對于可拓展性、復用性與升級系統(tǒng)有相當良好的支持。
這個接口目的是達成傳感器的接口統(tǒng)一,從而向著可以實現(xiàn)傳感器自動識別的方向?qū)崿F(xiàn)真正意義上的統(tǒng)一性與標準化。試想,如果可以實現(xiàn)升級項目產(chǎn)品而不用在硬件傳感器連接上改動,只用替換掉器件升級產(chǎn)品固件即可,甚至可以進一步實現(xiàn)固件不變,產(chǎn)品固件自動識別傳感器進行數(shù)據(jù)采集,是不是很有吸引力。
2.3、開源的軟件資料
IoT 主板可以直接使用 NXP 官方 SDK 進行學習、開發(fā)哦,只需要按照 IoT 主板引腳進行細微調(diào)整即可。像 USB、SD-Card 這類的較為復雜的接口,雙核協(xié)作以及各類安全性的外設(shè)與模塊的使用,官方的 SDK 已有完善的 Demo 和說明,同時相關(guān) SDK 的問題還能在恩智浦社區(qū)發(fā)帖提問哦。
當然,為了更方便的使用這塊開發(fā)板,逐飛科技精心編寫了“逐飛”風格的基于官方 SDK 進行二次開發(fā)的接口庫,封裝了常用的一部分外設(shè)驅(qū)動,并附上了說明注釋詳盡的 Demo,同時也對配套硬件有完善的驅(qū)動庫,以及使用的 Demo。已經(jīng)包含的外設(shè)接口有 ADC、CTimer、GINT、PINT、GPIO、HSPI、FlexComm、SCTimer、UTICK 定時器,基本覆蓋了 IOT 主板上接口的所有功能需求。
Gitee 開源鏈接:https://gitee.com/seekfree/LPC55S69_Library
說明:開源軟件資料主要針對芯片的常用模塊進行編寫,更適合配合逐飛的 LPC55S69 核心板進行擴展開發(fā)使用,IoT 部分的應用 demo 需要聯(lián)系逐飛科技獲取相關(guān)軟件資料。
封裝完成的接口調(diào)用方便簡潔,例如 Ctimer 的調(diào)用,三種功能初始化:
//BOARD_InitPins();?? ??? ??? ??? ??? ??? ??? ??? ?// 引腳初始化
pin_param_t?config;?? ??? ??? ??? ??? ??? ??? ??? ?//?管腳配置結(jié)構(gòu)體??
zf_gpio_get_default_config(&config);?? ??? ??? ??? ?//?獲取默認設(shè)置??
zf_gpio_init(PIO1,?PIN03,?&config,?PIN_DIR_OUT);?? ?//?默認輸出初始化一個測試用?LED??
config.param_bit.pin_param_func?=?PIN_FUNC_3;?? ??? ?//?切換到?FUNC3??
zf_gpio_init(PIO1,?PIN02,?&config,?PIN_DIR_OUT);?? ?//?CT0-MAT3?PWM?輸出??
zf_gpio_init(PIO1,?PIN15,?&config,?PIN_DIR_IN);?? ?//?CT_INP07_P1_15?輸入??
//?定時器模式初始化?設(shè)置?周期通道?頻率
zf_ctimer_timer_init(CTM_0,?CTM_CH_0,?10000);
zf_ctimer_pwm_setup(CTM_0,?CTM_CH_3);?? ??? ??? ??? ?//?啟動?PWM??
zf_ctiemr_start(CTM_0);?? ??? ??? ??? ??? ??? ??? ?//?啟動定時器??
//?初始化為輸入捕獲
zf_ctimer_capture_init(CTM_1,?CTIMER_TIMER_MODE_CAP_RISING_EDGE,?CT_INP07_P1_15);?
zf_ctiemr_start(CTM_1);?? ??? ??? ??? ??? ??? ??? ?//?啟動定時器??
//?定時器模式初始化?設(shè)置?周期通道?頻率
zf_ctimer_timer_init(CTM_2,?CTM_CH_0,?100);
zf_ctimer_intterupt_enable(CTM_2,?ctiemr2_handler);//?設(shè)置定時器中斷??
zf_ctiemr_start(CTM_2);?? ??? ??? ??? ??? ??? ??? ?//?啟動定時器??
調(diào)用接口如上即可完成 Ctimer 0 的 PWM 輸出、Ctimer 1 的輸入捕獲以及測試用 LED 引腳的初始化。BOARD_InitPins 函數(shù)為兼容 MCUXpresso Config Tools 軟件輸出的引腳配置文件的接口,用戶可以使用 MCUXpresso Config Tools 進行快捷的引腳配置,然后直接導入到工程即可。
并使能 Ctimer 0 的輸出通道 3 產(chǎn)生一個 10KHz 的 PWM 輸出;啟動 Ctimer 1 的輸入通道 7 為上升沿信號輸入捕獲;并且使 Ctimer 2 產(chǎn)生一個頻率為 100Hz 的中斷觸發(fā),并且將中斷處理指向為用戶自定義的中斷服務(wù)函數(shù) ctimer_handler。
而傳感器、外設(shè)等的調(diào)用同樣簡單:
uint32_t data;
BOARD_InitPins();?? ??? ??? ??? ??? ??? ??? ?// 引腳初始化
vl53l0x_init(IIC_DEMO);?? ??? ??? ??? ??? ??? ?// VL53L0X 初始化 IIC
vl53l0x_start_continuous(IIC_DEMO,?100);?? ??? ?// 設(shè)置采樣間隔時間 ms 開始連續(xù)測距
while(1)
{
?? ?data = vl53l0x_read_range_continuous_millimeters(IIC_DEMO);?
?? ?PRINTF("nvl53l0x_read: %d.%dcm.", data_buffer/10, data_buffer%10);
?? ?delay_ms(1000);
}
使用 MCUXpresso Config Tools 進行快捷的引腳配置,導入到工程,然后直接調(diào)用 BOARD_InitPins 完成 IIC 引腳的配置,之后調(diào)用獲取數(shù)據(jù)的接口即可。
同時,我們還在開源庫中移植了 RT-Thread,并提供了一個移植 Demo 供參考學習。RT-Thread 使用 finsh 控制臺插件,支持 MSH 命令行操作,對于調(diào)試、log 管理、消息查詢是一大利器。
2.4、針對 IOT 主板的軟件接口庫
逐飛科技還為 IoT 主板配備了專門的的 IoT 庫,能完全適配各個物理接口,在庫中有軟件接口實現(xiàn),并且有非常詳細的傳感器 Demo 說明,用來入門相當省時省力哦!同時還可以用作參考,深入對 SDK 接口與芯片的理解。(Tips. 配套 IoT 庫會持續(xù)更新哦)
舉例說明:同樣的 Ctimer 輸出 PWM,會有什么不一樣呢?來看一下:
//?先設(shè)置頻率?因為每個?CTIMER?模塊只能有一個頻率
arduino_ctimer_pwm_set_freq(ARDUINO_PWM_CTM0,?10000);
//?再設(shè)置管腳?對齊方式有效電平無法選擇?對應管腳請看主板背面絲印
arduino_pwm_ctimer_init(ARDUINO_PIN_D02);
這里并沒有引腳初始化相關(guān)的語句,就已經(jīng)完成了所有的配置,可以輸出 PWM 了。接下來再看看 ADC 采樣:
int?main(void)
{
????//?IOT?主板初始化 設(shè)置時鐘?150Mhz?并且開啟?USART7?的 debug 輸出
IoT_board_init(CLOCKPLL150M,?BOARD_USART7_DEBUG_ENABLED);
????//?初始化?ADC?采集管腳
arduino_adc_sample_default_init(ARDUINO_PIN_A01);
//?初始化?ADC?差分對管腳
????arduino_adc_diff_default_init(ARDUINO_ADC_DIFF_A2_A3);?
????while?(1)
{
//?采集?ADC?電壓
?????????PRINTF("nADC?get?data:?%d.",?arduino_adc_get_voltage(ARDUINO_PIN_A01));?
//?采集?ADC?差分電壓
?????????PRINTF("nADC?get?diff_data:?%d.",?arduino_adc_get_diff_voltage(ARDUINO_ADC_DIFF_A2_A3));
????????delay_ms(1000);
????}
}
這里通篇沒有引腳初始化,僅有對應 IoT 主板上的引腳編碼,直接調(diào)用 IoT 庫的功能接口,即完成了所有的初始化,可以正常進行使用了。對于開發(fā)者來說,是不是方面了很多呢,下圖是庫函數(shù)實現(xiàn)的基本邏輯,供參考理解。
該 IoT 開發(fā)庫適用于快速上手、快速入門,可以在較短的時間內(nèi)實現(xiàn)開發(fā)效果與展現(xiàn)運行現(xiàn)象。同時,這也是基于逐飛 LPC55S69 開源庫以及 SDK 來封裝實現(xiàn)的,這既可以說是針對 IoT 主板的 IoT 接口庫,也可以說是為了實現(xiàn) FlexComm 與 Arduino 接口統(tǒng)一而封裝的接口。
IoT 庫封裝了繁瑣的 IO 分配、初始化部分,將各個功能外設(shè)的接口調(diào)用、功能處理清晰化。用戶可以從 IoT 庫開始,快速體驗到 IoT 主板的功能的強大與便捷,再研究學習內(nèi)部驅(qū)動與結(jié)構(gòu),進一步應用于產(chǎn)品開發(fā),循序漸進。
三、為什么叫 IOT 開發(fā)板?
既然叫 IoT 開發(fā)板,自然是要奔著 IoT 開發(fā)方向前進的!這塊 IoT 主板的目標就是一塊綜合性的 IoT 開發(fā)套件的基礎(chǔ),也就是可以通過 FlexComm 接口拓展、替換、升級功能的 IoT 項目應用的目的。
舉個例子,在這塊主板上,使用一個 FlexComm 來接入 ESP8266 模塊,用以與云服務(wù)器通信,此時可以通過云端 OTA 支持進行空中下載升級固件,在需要升級硬件傳感器時,僅需要升級固件并替換、接入通用 FlexComm 接口的傳感器即可。這只是一個簡單的例子,具體的應用可以根據(jù)實際需求進行創(chuàng)新拓展。
IoT 庫當前編入了一個簡易的 MQTT 協(xié)議處理,可用于連接物聯(lián)網(wǎng)云端服務(wù)器,可用于對接 ALI 云,ALI 云是當前實用性強、適用范圍廣、上手也比較簡單迅速的一個選擇,相關(guān)資料支持與配套環(huán)境都相對齊全。
//------------------------------------------------------------------------
//??@brief??????與服務(wù)器建立?TCP?連接并與對應設(shè)備完成對接??
//??@param??????message?????????設(shè)備三元組??
//??@return?????bool????????????是否成功與服務(wù)器建立?TCP?連接并對接到對應設(shè)備??
//------------------------------------------------------------------------
bool?mqtt_aliyun_init?(aliyun_device_message_t?*message)
{
????//?設(shè)置?FlexComm_index
????aliyun_device.Index?=?message->Index;
????//?設(shè)置?productkey
????mqtt_set_productkey(message->productkey,?message->productkey_len);
????//?設(shè)置?devicename
????mqtt_set_devicename(message->devicename,?message->devicename_len);
????//?設(shè)置?devicesecre
????mqtt_set_devicesecre(message->devicesecre,?message->devicesecre_len);
? ? //?初始化服務(wù)器連接參數(shù)?連接服務(wù)器
????if(!mqtt_aliyun_tcp_init())
????????return?false;
????return?true;
}
那怎么入門物聯(lián)網(wǎng)呢?IoT 庫中提供了一個簡易的 ALI 云連接通信 Demo,向各位有意開始學習、準備實踐的客戶提供一個入門參考,附有說明文檔。
aliyun_device_message_t?aliyun_init_t;?? ??? ??? ??? ??? ?//?新建一個參數(shù)結(jié)構(gòu)體
aliyun_init_t.Index?=?IOT_FLEXCOMM_0;?? ??? ??? ??? ??? ?//?指定使用的?FlexComm
memset(aliyun_init_t.productkey,?0,?32);?? ??? ??? ??? ?//?清空?productkey
memcpy(aliyun_init_t.productkey,?"a13WwZVmHl6",?11);?? ?//?寫入?productkey
aliyun_init_t.productkey_len?=?11;?? ??? ??? ??? ??? ??? ?//?寫入?productkey?長度
memset(aliyun_init_t.devicename,?0,?32);?? ??? ??? ??? ?//?清空?devicename
memcpy(aliyun_init_t.devicename,?"device_demo",?11);?? ?//?寫入?devicename
aliyun_init_t.devicename_len?=?11;?? ??? ??? ??? ??? ??? ?//?寫入?devicename?長度
memset(aliyun_init_t.devicesecre,?0,?32);?? ??? ??? ??? ?//?清空?devicesecre
//?寫入?devicesecre
memcpy(aliyun_init_t.devicesecre,?"af27d6b2368ce1a10fa95f7762d414a6",?32);?
aliyun_init_t.devicesecre_len?=?32;?? ??? ??? ??? ??? ?//?寫入 devicesecre 長度??
rt_kprintf("aliyun_init?start.rn");?? ??? ??? ??? ??? ?//?RTT?控制臺輸出?log??
if(!mqtt_aliyun_init(&aliyun_init_t))?? ??? ??? ??? ??? ?//?ali?云連接??
{??
????rt_kprintf("aliyun_init?error.rn");?? ??? ??? ??? ?//?RTT?控制臺輸出?log??
????while(1);??
}
rt_kprintf("aliyun_init?success.rn");?? ??? ??? ??? ?//?RTT?控制臺輸出?log?
?
怎么樣,各位攻城獅,看小編嘚吧嘚了這么多,是否想要親自上手把玩一下呢? 購買渠道某寶,大家自行搜索即可,購買可享 NXP 聯(lián)合推廣價。