各位攻城狮好,由逐飞科技设计制作的全新的 IoT 开发板推出啦!这是一款基于恩智浦 LPC55S69 芯片设计的简约而又不简单的开发板,下面直接让我们来看看这块小小开发板都有些什么特别的地方吧!

 


一、LPC55S69 芯片怎么样
首先来看看这个小板子的核心,了解下 LPC55S69 这颗芯片怎么样。


LPC55S6x 家族是全球首款基于通用 Cortex-M33 的微控制器,并且它是第一款基于 40nm 工艺的 MCU,动态功耗仅仅 32μA/MHz。采用 Armv8-M 架构以及 TrustZone-M 和协处理器扩展,性能和高级安全功能达到新水平。

 

 

它的内核是双核架构,由两颗 Cortex-M33 组成。这里特别注意的是这两颗内核有大小之分,Core0 内核是全功能的 Cortex-M33,而 Core1 则去除了 TrustZone、MPU、SAU、FPU、SIMD 等内核增强的功能。Armv8-M 架构允许客制化的协处理器,NXP 利用这一特性加入了 DSP 加速器 PowerQuad 和加密引擎 CASPER,分别从运算和安全两个角度显著提升 MCU 本身的性能。


这款 MCU 运行频率高达 150MHz,拥有高达 640KB 的 FLASH,以及 320KB 的 SRAM。


1.1、安全性上:除了 TrustZone-M,还有 PRINCE 模块对写入到片上闪存的数据进行实时加密,拥有 AES-256 加密 / 解密引擎、安全散列算法 (SHA1/SHA2) 模块,可以通过专用 SRAM 上的芯片指纹提供物理不可克隆功能(PUF),还拥有随机数生成器(RNG)、唯一的 128 位设备识别序列号(UUID)、安全通用 IO。


1.2、模拟外设上:
1.ADC 是这次 LPC 的 MCU 升级最大的地方,ADC 升级到 16 位 1M 采样率,具有 5 个差分通道对(或 10 个单端通道)以及多个内部和外部触发器输入,且支持 2 个独立的转换序列,同时拥有连接至 ADC 的内置温度传感器


2. 具有 5 个输入引脚和外部或内部基准电压的比较器


同时通信接口上极为丰富:


1.8 组 FlexComm 接口,可以让用户灵活的配置得到最多 8 路串行接口(UART、I2C 和 SPI 任意组合,最多 8 个)或者 4 组全双工模式的 I2S 接口。


2. 一个独立高速 SPI 接口,最高可运行在 50MHz 的频率,流畅刷一个小屏幕的 LCD 不再是梦想。


3.USB 接口一如以往的领先业界,一个高速 USB 和一个全速 USB 接口,均集成 PHY 以及支持主机和从机模式。


4.SDIO 接口也在以前的 LPC 基础上做出了重大改进,安全的数字输入输出(SD/MMC 和 SDIO)卡接口, DMA SDIO 支持两个卡。支持的卡类型为 MMC、SDIO 和 CE-ATA。支持 SD2.0 和 SR25。


1.3、数字外设上:
1.2 个 DMA 控制器,DMA0 控制器,具有 23 个通道和多达 22 个可编程触发器;DMA1 控制器,具有 10 个通道和 16 个可编程触发器;
2.1 个 CRC 引擎模块,可使用支持 DMA 的 3 个标准多项式中的一个计算所提供数据的 CRC;


3. 最多 8 个通用 IO 可选为引脚中断(PINT),由上升沿、下降沿或两种输入沿触发;


4. 两组通用 IO 中断(GINT)支持基于输入状态逻辑(AND/OR)组合的中断;


1.4、并且定时器上还配备了:
1.5 个 32 位标准通用异步定时器 / 计数器,支持多达 4 个采集输入和 4 个比较输出,可选择特定的定时器事件生成 DMA 请求;


2.1 个 SCTimer/PWM,具有 8 个输入和 10 个输出函数(包括捕获和匹配),输入和输出可引至或引自外部引脚,内部引至或引自所选外设,在内部,SCTimer/PWM 支持 16 个捕获 / 匹配,16 个事件和 32 个状态;


3.1 个 32 位实时时钟(RTC), RTC 中的定时器可用于唤醒所有低功耗模式(包括深度节电模式),具有 1 ms 分辨率;


4.1 个多通道多速率 24 位定时器(MRT),可用于在多达 4 种可编程固定速率下重复生成中断;


5.1 个窗口看门狗定时器 (WWDT),使用 1MHz 的 FRO 作为时钟源;


6.1 个微节拍定时器,通过看门狗振荡器运行,可用于将器件从睡眠和深度睡眠模式中唤醒;


7.1 个 42 位自运行 OS 定时器作为系统的连续时基,适用于任何低功耗的模式;


可谓外设丰富、功能强大,各位 MCU 玩家是不是想上手折腾一下了呢。


二、如何使用 IoT 主板快速入门
2.1、首先自然是硬件平台

进入正题,首先我们需要一个配套的开发硬件,这里就需要 IoT 开发板上线了!这个开发板只有 54*78.75mm 的尺寸大小,比掌心还要小一点。虽然体积小巧,但该有的接口一个不少,接口形式丰富,涵盖了所有的片上功能所需引脚。


两个 Type-C 类型的全 / 高速 USB 接口,MICRO SD 形式的短体卡座一个,6 个 FlexComm,UART、I2C 和 SPI 任意组合,按需分配复用。

 

 

上述都是固定的接口,不能自行 DIY 接口接线,需要可以自定义的,功能又完备的接口?那扩展的 Arduino 接口怎么样呢?

 

 

该 IoT 开发板拓展的 Arduino 接口上囊括了 GPIO、ADC、PWM、USART、I2C、高速 SPI 功能,不仅可以接入配套传感器、自行拓展接线,也能接入部分 Arduino 接口的外设与器件,DIY 性能 MAX。


丰富的接口搭配上配套的传感器(持续更新增加中)等外设,就能涵盖绝大多数的学习、原型阶段开发的需求。

 

 

2.2、当前配套传感器、模块(后续也会持续新增添加):
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 驱动的电容触摸屏,支持最多两点触控;


5.ESP8266,应用比较广泛、功能也比较齐全的一款 WIFI 模块。


重点介绍:这块开发板上有一个全新的接口形式:FlexComm 接口,这是为了统一传感器接口而定义的一种新的 2*5pin 接口,与 LPC 系列的 FlexComm 外设对应,可以复用成 UART、I2C、SPI 或者 I2S 功能。

 

 

接口具有防呆设计,即使插反也不会导致传感器损坏,含有 5V 以及 3.3V 供电接口,GND 对脚设计。上述的配套硬件的传感器皆为使用 FlexComm 接口设计,可以直接插在任意一个 FlexComm 接口上使用。

 

 

使用这个接口,统一外设接口形式,设计时可以根据不同需求进行定制,这样可以将传感器设计成 Plug-in Card 形式,对于可拓展性、复用性与升级系统有相当良好的支持。


这个接口目的是达成传感器的接口统一,从而向着可以实现传感器自动识别的方向实现真正意义上的统一性与标准化。试想,如果可以实现升级项目产品而不用在硬件传感器连接上改动,只用替换掉器件升级产品固件即可,甚至可以进一步实现固件不变,产品固件自动识别传感器进行数据采集,是不是很有吸引力。

 

2.3、开源的软件资料
IoT 主板可以直接使用 NXP 官方 SDK 进行学习、开发哦,只需要按照 IoT 主板引脚进行细微调整即可。像 USB、SD-Card 这类的较为复杂的接口,双核协作以及各类安全性的外设与模块的使用,官方的 SDK 已有完善的 Demo 和说明,同时相关 SDK 的问题还能在恩智浦社区发帖提问哦。


当然,为了更方便的使用这块开发板,逐飞科技精心编写了“逐飞”风格的基于官方 SDK 进行二次开发的接口库,封装了常用的一部分外设驱动,并附上了说明注释详尽的 Demo,同时也对配套硬件有完善的驱动库,以及使用的 Demo。已经包含的外设接口有 ADC、CTimer、GINT、PINT、GPIO、HSPI、FlexComm、SCTimer、UTICK 定时器,基本覆盖了 IOT 主板上接口的所有功能需求。


Gitee 开源链接:https://gitee.com/seekfree/LPC55S69_Library


说明:开源软件资料主要针对芯片的常用模块进行编写,更适合配合逐飞的 LPC55S69 核心板进行扩展开发使用,IoT 部分的应用 demo 需要联系逐飞科技获取相关软件资料。


封装完成的接口调用方便简洁,例如 Ctimer 的调用,三种功能初始化:


//BOARD_InitPins();                                // 引脚初始化

 

pin_param_t config;                                // 管脚配置结构体  


zf_gpio_get_default_config(&config);                // 获取默认设置  


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 输入  

 

// 定时器模式初始化 设置 周期通道 频率


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);                            // 启动定时器  

 

// 定时器模式初始化 设置 周期通道 频率


zf_ctimer_timer_init(CTM_2, CTM_CH_0, 100);


zf_ctimer_intterupt_enable(CTM_2, ctiemr2_handler);// 设置定时器中断  


zf_ctiemr_start(CTM_2);                            // 启动定时器  


调用接口如上即可完成 Ctimer 0 的 PWM 输出、Ctimer 1 的输入捕获以及测试用 LED 引脚的初始化。BOARD_InitPins 函数为兼容 MCUXpresso Config Tools 软件输出的引脚配置文件的接口,用户可以使用 MCUXpresso Config Tools 进行快捷的引脚配置,然后直接导入到工程即可。


并使能 Ctimer 0 的输出通道 3 产生一个 10KHz 的 PWM 输出;启动 Ctimer 1 的输入通道 7 为上升沿信号输入捕获;并且使 Ctimer 2 产生一个频率为 100Hz 的中断触发,并且将中断处理指向为用户自定义的中断服务函数 ctimer_handler。


而传感器、外设等的调用同样简单:


uint32_t data;


BOARD_InitPins();                            // 引脚初始化

 

vl53l0x_init(IIC_DEMO);                        // VL53L0X 初始化 IIC


vl53l0x_start_continuous(IIC_DEMO, 100);        // 设置采样间隔时间 ms 开始连续测距

 

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 进行快捷的引脚配置,导入到工程,然后直接调用 BOARD_InitPins 完成 IIC 引脚的配置,之后调用获取数据的接口即可。


同时,我们还在开源库中移植了 RT-Thread,并提供了一个移植 Demo 供参考学习。RT-Thread 使用 finsh 控制台插件,支持 MSH 命令行操作,对于调试、log 管理、消息查询是一大利器。

 


2.4、针对 IOT 主板的软件接口库
逐飞科技还为 IoT 主板配备了专门的的 IoT 库,能完全适配各个物理接口,在库中有软件接口实现,并且有非常详细的传感器 Demo 说明,用来入门相当省时省力哦!同时还可以用作参考,深入对 SDK 接口与芯片的理解。(Tips. 配套 IoT 库会持续更新哦)


举例说明:同样的 Ctimer 输出 PWM,会有什么不一样呢?来看一下:


// 先设置频率 因为每个 CTIMER 模块只能有一个频率


arduino_ctimer_pwm_set_freq(ARDUINO_PWM_CTM0, 10000);


// 再设置管脚 对齐方式有效电平无法选择 对应管脚请看主板背面丝印


arduino_pwm_ctimer_init(ARDUINO_PIN_D02);


这里并没有引脚初始化相关的语句,就已经完成了所有的配置,可以输出 PWM 了。接下来再看看 ADC 采样:


int main(void)


{


    // IOT 主板初始化 设置时钟 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 主板上的引脚编码,直接调用 IoT 库的功能接口,即完成了所有的初始化,可以正常进行使用了。对于开发者来说,是不是方面了很多呢,下图是库函数实现的基本逻辑,供参考理解。

 

 

该 IoT 开发库适用于快速上手、快速入门,可以在较短的时间内实现开发效果与展现运行现象。同时,这也是基于逐飞 LPC55S69 开源库以及 SDK 来封装实现的,这既可以说是针对 IoT 主板的 IoT 接口库,也可以说是为了实现 FlexComm 与 Arduino 接口统一而封装的接口。
IoT 库封装了繁琐的 IO 分配、初始化部分,将各个功能外设的接口调用、功能处理清晰化。用户可以从 IoT 库开始,快速体验到 IoT 主板的功能的强大与便捷,再研究学习内部驱动与结构,进一步应用于产品开发,循序渐进。


三、为什么叫 IOT 开发板?
既然叫 IoT 开发板,自然是要奔着 IoT 开发方向前进的!这块 IoT 主板的目标就是一块综合性的 IoT 开发套件的基础,也就是可以通过 FlexComm 接口拓展、替换、升级功能的 IoT 项目应用的目的。


举个例子,在这块主板上,使用一个 FlexComm 来接入 ESP8266 模块,用以与云服务器通信,此时可以通过云端 OTA 支持进行空中下载升级固件,在需要升级硬件传感器时,仅需要升级固件并替换、接入通用 FlexComm 接口的传感器即可。这只是一个简单的例子,具体的应用可以根据实际需求进行创新拓展。

 

 

IoT 库当前编入了一个简易的 MQTT 协议处理,可用于连接物联网云端服务器,可用于对接 ALI 云,ALI 云是当前实用性强、适用范围广、上手也比较简单迅速的一个选择,相关资料支持与配套环境都相对齐全。


//------------------------------------------------------------------------


//  @brief      与服务器建立 TCP 连接并与对应设备完成对接  


//  @param      message         设备三元组  


//  @return     bool            是否成功与服务器建立 TCP 连接并对接到对应设备  


//------------------------------------------------------------------------


bool mqtt_aliyun_init (aliyun_device_message_t *message)


{


    // 设置 FlexComm_index


    aliyun_device.Index = message->Index;


    // 设置 productkey


    mqtt_set_productkey(message->productkey, message->productkey_len);


    // 设置 devicename


    mqtt_set_devicename(message->devicename, message->devicename_len);


    // 设置 devicesecre


    mqtt_set_devicesecre(message->devicesecre, message->devicesecre_len);


    // 初始化服务器连接参数 连接服务器


    if(!mqtt_aliyun_tcp_init())


        return false;


    return true;


}


那怎么入门物联网呢?IoT 库中提供了一个简易的 ALI 云连接通信 Demo,向各位有意开始学习、准备实践的客户提供一个入门参考,附有说明文档。


aliyun_device_message_t aliyun_init_t;                    // 新建一个参数结构体


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.\r\n");                    // RTT 控制台输出 log  


if(!mqtt_aliyun_init(&aliyun_init_t))                    // ali 云连接  


{  


    rt_kprintf("aliyun_init error.\r\n");                // RTT 控制台输出 log  


    while(1);  


}


rt_kprintf("aliyun_init success.\r\n");                // RTT 控制台输出 log 

 

 


怎么样,各位攻城狮,看小编嘚吧嘚了这么多,是否想要亲自上手把玩一下呢? 购买渠道某宝,大家自行搜索即可,购买可享 NXP 联合推广价。