在线时间4805 小时
UID3441752
注册时间2017-11-21
NXP金币76755
TA的每日心情 | 开心 2025-7-11 08:53 |
---|
签到天数: 301 天 连续签到: 2 天 [LV.8]以坛为家I
管理员
  
- 积分
- 40106
- 最后登录
- 2025-9-1
|
逐飞科技LPC55S69开源库发布及简介
各位朋友好,距离上次20天备战智能车专辑连载结束后,逐飞科技已经有一个多月没在公众号上更新内容了,但其实我们没闲着,为了生存嘛,所以今天又给玩儿MCU、玩儿嵌入式开发的各位带了点东西来分享:逐飞基于LPC55S69的开源库发布,同时也带来了LPC55S69的特价核心板和基于LPC55S69的特价IoT开发板,现在已经可以通过逐飞科技淘宝店下单购买了(PS:活动价低到超乎你的想象),进入逐飞科技淘宝店后店内搜索LPC,即可找到相关产品,希望大家喜欢。
可能有朋友会问,为什么是LPC55S69呢,为什么今天带来的东西能做到这么低的价格呢,这就得感谢NXP原厂的支持了,感谢NXP相关领导及工程师的信任,把LPC系列芯片的推广的任务分派了一些给我们这样一个小团队,有了原厂的推广及技术支持,我们也就放心的开启了这个项目,并且基于LPC系列芯片做了一些东西出来,希望能对NXP的LPC系列芯片推广帮上忙,也希望大家能认可逐飞科技这个草根团队基于LPC系列芯片精心制作的硬件产品和软件开源资料。关于IoT开发板的相关介绍会在“恩智浦MCU加油站”及恩智浦社区进行官方推荐,所以本文只涉及到了IoT开发板的一些图片,没有详细介绍,欢迎大家关注“恩智浦MCU加油站”及恩智浦社区,今天的LPC开源库推荐算是一个预热。
一、逐飞LPC55S69开源库发布
今天的主要内容是“逐飞LPC55S69开源库”发布及简介,如下图所示,该项目已经开源到Gitee,需要的朋友们可以直接下载使用了:
附上Gitee开源链接:https://gitee.com/seekfree/LPC55S69_Library
二、逐飞LPC55S69开源库简介
该开源库是基于NXP官方SDK进行二次开发,封装常用接口,方便使用与学习开发的一个开源项目。主要针对LPC55S69核心板<以下简称核心板>进行更新优化。
简介将从开源库的目录结构开始,为您讲解整个开源库的结构,与详细的使用示范。
目录结构图
2.1、【文档】说明书 芯片手册等
该目录下包含开源库项目的说明文档、核心板的说明书以及官方的芯片文档。
2.2、example_project
该目录下包含开源库项目的例程,请注意本库例程并不包括USB以及SD-Card部分,相关例程请参考SDK。
本开源库统一在该目录下放置Demo工程,Demo工程中不包含完整的开源库,用户工程可以在coreboard_user_project_part目录下新建或者直接使用该目录下样板工程进行修改。包含路径为相对路径,详情请参考各个示例工程中的包含路径设置。开源库目录下也包含一个样板空工程,同样可以作为模板使用(区别见1.3.4.user_project_demo)。
2.2.1、xx_drivers_example
该目录下包含芯片外设驱动的例程,供学习与参考使用。
2.2.2、xx_peripheral_example
该目录下包含了一些常用的传感器的例程,当前已经支持WIFI模块ESP8266、陀螺仪模块MPU6050、气压计模块MS5611、温湿度模块SHT31、TOF激光测距模块VL53L0X、以及2.4寸ILI9341芯片TFT屏幕搭配FTF6336的触摸屏。
2.2.3、xx_project_part
该目录下包含了开源库的一个示例工程,是使用核心搭配已有驱动传感器外设作为硬件平台,调用开源库接口实现的一个示例。
2.2.4、xx_user_project_example
该目录下放置用户程序,我们在其中放置一个样板工程,是一个添加了开源库的空工程。
2.3、Seekfree_LPC55SXX_Opensource_Library
2.3.1、55S69_SDK
该目录下包含LPC55S69的官方SDK,整个IOT开源项目基于官方SDK进行二次开发,用户亦可参考BSP进行自拟定的个性开发。如若想要替换SDK版本,只需要将该文件下对应的文件替换成您所需要的SDK版本的文件即可。
2.3.2、RT_Thread
该目录下包含V4.0.3版本的RT-Thread OS源码,包含完整版的RTOS与相关组件。当前RT-Thread暂时并不支持Cortex M-33双核移植,当前使用的移植文件是基于Cortex M-4的单核文件移植,只提供core 0的单核RT-Thread移植。并且使用RT-Thread OS时请注意使用的启动文件(.s)不支持V6编译,详细实现请参考例程。
2.3.3、seekfree_ali_mqtt
该目录下包含针对于ALI云服务器的MQTT协议实现的对接协议,可供参考与学习。
2.3.4、user_project_demo
该目录下是一个空的样板工程,与example_project目录下工程有所区别,包含路径为相对路径,所以包含路径设置不一样。
2.3.5、seekfree_drives_Library
该目录下的内容为该开源库的核心内容,由逐飞科技精心编写而成,是基于NXP官方SDK进行二次开发,将繁琐结构体与接口操作的调用封装为简明的一键化接口,为大家提供便捷的常用函数库,详情请参考源码及注释。
board
该目录下是关于时钟配置初始化的配置文件。
drivers
该目录下是基于SDK进行的外设二次封装接口,简化用户调用过程,简化操作流程。
seekfree_peripheral
该目录下是基于开源库进行编写的外设驱动文件,可直接驱动对应的外设模块进行工作。
2.3.6、doc
该目录是开源库的版本等相关文件的存放目录。
三、seekfree_drives_Library的调用方式示例
3.1、drivers的接口调用
我们以GPIO初始化为例子进行讲解,我们提供丰富的接口方式,在满足用户简化操作的同时也预留足够的DIY空间。下列代码示例为一键式初始化GPIO管脚,只需输入GPIO的组别、编号与方向即可完成初始化。
- //-----------------------------------------------------------------------------
- // @brief 端口管脚 GPIO 功能初始化
- // @param group_index 管脚组别
- // @param pin_index 管脚索引
- // @param dir 管脚方向
- // Sample usage: zf_gpio_default_init( GPIO0, PIN00, IOCON_PIO_DIR_OUT);
- //-----------------------------------------------------------------------------
- void zf_gpio_default_init (group_index _list group_index, pin_index_list pin_index,iocon_pio_dir_list dir)
- {
- pin_param_t config;
- zf_gpio_get_default_config (&config);
- IOCON->PIO [group_index] [pin_index] = (config.pin_config & 0x000007FF);
-
- // 设置方向
- GPIO->DIR [group_index] |= ((dir && 0x01) << pin_index);
-
- if(pin_side == GPIO1)
- CLOCK_EnableClock(kCLOCK_Gpio1); // 开启 GPIO1 时钟
- else
- CLOCK_EnableClock(kCLOCK_Gpio0); // 开启 GPIO0 时钟
- }
复制代码 为保证用户DIY需求,我们预留了对应的接口进行拓展,下图为获取默认GPIO设置。
- //----------------------------------------------------------------------------
- // @brief 端口管脚 GPIO 功能获取默认配置
- // @param config 管脚配置结构体
- // Sample usage: zf_gpio_get_default_config (config);
- //----------------------------------------------------------------------------
- void zf_gpio_get_default_config (pin_param_t *config)
- {
- // 默认设置GPIO
- config->param_bit.pin_param_func = PIN_FUNC0;
- // 默认设置悬空
- config->param_bit.pin_param_mode = PIN_MODE_INACTIVE;
- // 默认设置标准速率
- config->param_bit.pin_param_slew = PIN_SLEW_STANDARD;
- // 默认设置禁止反相
- config->param_bit.pin_param_invert = PIN_INVERT_DISABLED;
- // 默认设置数字模式
- config->param_bit.pin_param_digimode = PIN_DIGIMODE_ENABLED;
- // 默认设置禁止开漏
- config->param_bit.pin_param_od = PIN_OD_DISABLED;
- // 默认设置禁止模拟模式
- config->param_bit.pin_param_asw = PIN_ASW_DISABLED;
- }
复制代码 通过获取默认设置后,可以通过调用参数修改接口或者直接对结构体进行赋值来修改GPIO的设置参数,从而达到满足用户高度自定义的接口自由性,参数修改接口如下:
- //----------------------------------------------------------------------------
- // @brief 端口管脚参数设置
- // @param config 参数结构体
- // @param pin_param_list 参数选项
- // @param pin_config 参数值
- // Sample usage: zf_pin_param_set( config, PIN_PARAM_MODE, IOCON_PIO_MODE_INACTIVE);
- //----------------------------------------------------------------------------
- void zf_pin_param_set (pin_param_t *config,pin_param_list param_index,uint32_t pin_config)
- {
- switch(param_index)
- {
- case PIN_PARAM_FUNC:
- // 设置引脚内部工作模式
- config->param_bit.pin_param_func = (pin_func_list)pin_config;
- break;
- case PIN_PARAM_MODE:
- // 设置引脚内部工作模式
- config->param_bit.pin_param_mode = (pin_mode_list)pin_config;
- break;
- case PIN_PARAM_SLEW:
- // 设置引脚速率
- config->param_bit.pin_param_slew = (pin_slew_list)pin_config;
- break;
- case PIN_PARAM_INVERT:
- // 设置反相设置
- config->param_bit.pin_param_invert = (pin_invert_list)pin_config;
- break;
- case PIN_PARAM_DIGIMODE:
- // 设置数字模式使能
- config->param_bit.pin_param_digimode = (pin_digimode_list)pin_config;
- break;
- case PIN_PARAM_OD:
- // 设置开漏模式使能
- config->param_bit.pin_param_od = (pin_od_list)pin_config;
- break;
- case PIN_PARAM_ASW:
- // 设置ADC输入使能 A type 引脚才有
- config->param_bit.pin_param_asw = (pin_asw_list)pin_config;
- break;
- default:
- break;
- }
- }
复制代码
通过调用上述两个接口后,完成了参数的个性化设置,最后调用初始化接口如下如图:
- //----------------------------------------------------------------------------
- // @brief 端口管脚 GPIO 功能初始化
- // @param group_index 管脚组别
- // @param pin_index 管脚索引
- // @param config 管脚配置
- // @param dir 管脚方向
- // Sample usage: zf_gpio_init ( GPIO0,PIN00, config,IOCON_PIO_DIR_OUT);
- //----------------------------------------------------------------------------
- void zf_gpio_init (group_index _list group_index, pin_index_list pin_index, pin_param_t *config, iocon_pio_dir_list dir)
- {
- IOCON->PIO [group_index] [pin_index] = (config->pin_config & 0x000007FF);
- // 设置方向
- GPIO->DIR [group_index] |= ((dir && 0x01) << pin_index);
- if(pin_side == GPIO1)
- CLOCK_EnableClock(kCLOCK_Gpio1); // 开启 GPIO1 时钟
- else
- CLOCK_EnableClock(kCLOCK_Gpio0); // 开启 GPIO0 时钟
- }
复制代码 至此完成整个DIY定义初始化GPIO的流程,整个过程为新手入门或者简化开发、学习流程服务,用户可参考我们的注释与代码进行完全的自由开发。
在整个外设调用接口封装系统中,我们添加了完备的注释与必要的说明性文字,有较高的代码可阅读性与复用性,推荐参考例程结合注释进行学习。
3.2、seekfree_peripheral的接口调用
外设部分为了兼容我们以mpu6050外设模块驱动为例子进行讲解,下如为mpu6050的初始化接口,只需要根据使用的对应的Flex COMM接口输入参数就可以了,内部会完成片上接口的初始化,如果是从IOT的接口进行调用配合IOT主板使用可以不需要关心管脚初始化,IOT接口中会根据接口参数自动完成管脚初始化。
- //----------------------------------------------------------------------------
- // @brief 初始化MPU6050
- // @param Index 使用的 FlexCOMM 端口
- // @return void
- // @since v1.0
- //----------------------------------------------------------------------------
- #ifdef IOT_BOARD
- void mpu6050_init(iot_flexcomm_index_list Index)
- #else
- void mpu6050_init(flexcomm_index_list Index)
- #endif
- {
- // 定义一个 Flex COMM 配置结构体
- i2c_master_config_t iic_mpu6050_config;
- // 初始化 MPU6050 FlexCOMM 接口部分
- // 获取默认设置
- zf_iic_master_get_default_config( &iic_mpu6050_config);
- #ifdef IOT_BOARD
- // 初始化 IOT 主板上 FlexCOMM-USART 接口
- iot_flexcomm_init(Index, FLEX_COMM_IIC_MASTER, &iic_mpu6050_config);
- #else
- zf_flexcomm_init(Index, FLEX_COMM_IIC_MASTER, &iic_mpu6050_config);
- #endif
- //上电延时
- delay_ms(100);
-
- mpu6050_self1_check(Index);
- //解除休眠状态
- zf_iic_write_reg(Index, MPU6050_DEV_ADDR, PWR_MGMT_1, 0x00);
- //125HZ采样率
- zf_iic_write_reg(Index, MPU6050_DEV_ADDR, SMPLRT_DIV, 0x07);
- zf_iic_write_reg(Index, MPU6050_DEV_ADDR, MPU6050_CONFIG, 0x04);
- zf_iic_write_reg(Index, MPU6050_DEV_ADDR, GYRO_CONFIG, 0x18);
- zf_iic_write_reg(Index, MPU6050_DEV_ADDR, ACCEL_CONFIG, 0x10);
- zf_iic_write_reg(Index, MPU6050_DEV_ADDR, User_Control, 0x00);
- zf_iic_write_reg(Index, MPU6050_DEV_ADDR, INT_PIN_CFG, 0x02);
- }
复制代码 后续的读取也是直接输入接口参数调用即可,为什么这里还要输入选用的接口的Index呢?因为考虑到如果用户将这套方案真正应用到IOT方案上,那么就可能存在接入好几个相同的传感器来检测不同节点的状态,那么就可以直接使用这一套驱动而不用再费心了。
- //----------------------------------------------------------------------------
- // @brief 获取MPU6050陀螺仪数据
- // @param Index 使用的 FlexCOMM 端口
- // @return void
- // @since v1.0
- // Sample usage: 执行该函数后,直接查看对应的变量即可
- //----------------------------------------------------------------------------
- void mpu6050_get_gyro(flexcomm_index_list Index)
- {
- uint8_t dat[6];
-
- zf_iic_read_reg(Index, MPU6050_DEV_ADDR, GYRO_XOUT_H, dat, 6);
- mpu_gyro_x = (int16_t)(((uint16_t)dat[0]<<8 | dat[1]));
- mpu_gyro_y = (int16_t)(((uint16_t)dat[2]<<8 | dat[3]));
- mpu_gyro_z = (int16_t)(((uint16_t)dat[4]<<8 | dat[5]));
- }
复制代码 四、seekfree_ali_mqtt的云端连接讲解
本部分讲解使用RT-Thread OS搭配MQTT协议通过ESP8266 WIFI模块进行针对ALI云连接,仅供参考。
本部分参考《MQTT 协议 3.1.1》进行编程,建议以该文档为标准进行设计参考,下方示例中三元组<< span="">productkey,devicename,devicesecre>为我们测试时使用,请各位在使用本教程时将其替换为自己设备的三元组,否则无法对接到自己的设备。
其次,本部分仅进行了MQTT协议的部分封装接口的设计,如有特殊个性化设计需求,请详细参考《MQTT 协议 3.1.1》进行设计,本部分仅作参考使用,且本部分不包括服务器JSON字符串处理,例程中仅有部分特定提取解析,关于JSON解析请参考JSON格式相关规则。
4.1、mqtt_aliyun_init的接口调用
MQTT接口部分我们封装了PUBLISH、SUBSCRIBE、UNSUBSCRIBE、PINGREQ几个控制报文,CONNECT报文与TCP建立连接一同封装在mqtt_aliyun_init接口函数中。
关于连接服务器建立与设备的对接如同下方代码示例,只需要将ALI云端设备的三元组输入到MQTT部分的接口,调用mqtt_aliyun_init接口函数即可。
- // 新建一个参数结构体
- aliyun_device_message_t aliyun_init_t;
- // 指定使用的 Flexcomm
- aliyun_init_t.Index = IOT_FLEXCOMM_0;
- // 写入 productkey
- memset(aliyun_init_t.productkey, 0, 32);
- memcpy(aliyun_init_t.productkey, "a13WwZVmHl6", 11);
- aliyun_init_t.productkey_len = 11;
- // 写入 devicename
- memset(aliyun_init_t.devicename, 0, 32);
- memcpy(aliyun_init_t.devicename, "device_demo", 11);
- aliyun_init_t.devicename_len = 11;
- // 写入 devicesecre
- memset(aliyun_init_t.devicesecre, 0, 32);
- memcpy(aliyun_init_t.devicesecre, "af27d6b2368ce1a10fa95f7762d414a6", 32);
- aliyun_init_t.devicesecre_len = 32;
- 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");
复制代码 关于三元组信息,可在阿里云物联网平台进行查看,本文档中给出的是我们测试例程所用的设备三元组,请各位在使用时替换为自己的设备三元组。
请注意:我们的例程中,使用的是生活物联网平台创建的产品,产品类目为插座,详情见《关于ALI云例程调试的说明书》文档,创建设备后,请注意设备属性是否与例程中相符,否则可能需要对例程进行修改才可以正常运行!
设备属性在物联网平台->设备管理->产品->产品详情->功能定义下查看,我们的程序示例中使用的属性标识符为PowerSwtich!
如果这里与本文档不符,请修改例程中识别的属性,详情请参考《关于ALI云例程调试的说明书》文档。
4.2、mqtt_pingreq_pack的接口调用
该接口为心跳包发送接口,无需输入参数,在完成了ALI云对接后可直接调用,调用后返回是否完成PINGREQ包的发送,如果发送失败可能是设备被服务器踢掉或者网络波动,请再发送几次PINGREQ包,如果依旧发送失败则可能与服务器断开连接或者网络出现故障。
- /----------------------------------------------------------------------------
- // @brief 设备心跳 PINGREQ 包发送函数
- // @return bool PINGREQ是否成功
- // Sample usage: mqtt_pingreq_pack();
- //----------------------------------------------------------------------------
- bool mqtt_pingreq_pack (void)
复制代码 4.3、mqtt_subscribe_pack的接口调用
该接口为订阅对应Topic的接口,需要输入Topic以及长度与此次订阅的报文标识符,返回是否订阅成功。这里只执行一条Topic订阅,从发送订阅消息到收到订阅回复,所以报文标识符可以都填一个值。如果需要同时并发多个订阅Topic,需要自行构建接口。
- //----------------------------------------------------------------------------
- // @brief 订阅 topic
- // @param topic 目标 topic
- // @param topic_len topic 长度
- // @param flag 报文标识符
- // @return bool 订阅是否成功
- // Sample usage: mqtt_subscribe_pack(&topic, 55, 0x01);
- //----------------------------------------------------------------------------
- bool mqtt_subscribe_pack (char *topic, uint8_t topic_len, uint8_t flag)
复制代码 4.4、mqtt_unsubscribe_pack的接口调用
该接口对应取消订阅,参数与介绍与订阅类似。
- //----------------------------------------------------------------------------
- // @brief 取消订阅 topic
- // @param topic 目标 topic
- // @param topic_len topic 长度
- // @param flag 报文标识符
- // @return bool 取消是否成功
- // Sample usage: mqtt_unsubscribe_pack(&topic, 55, 0x01);
- //----------------------------------------------------------------------------
- bool mqtt_unsubscribe_pack (char *topic, uint8_t topic_len, uint8_t flag)
复制代码 4.5、mqtt_publish_pack的接口调用
该接口是向指定Topic推送消息使用,需要输入Topic以及长度与消息已经消息长度,请注意ALI云常用为JSON字符消息格式,请按照相关规则进行消息编辑。
- //----------------------------------------------------------------------------
- // @brief 推送消息
- // @param topic 目标 topic
- // @param topic_len topic 长度
- // @param message json 消息 这个需要自行根据设备进行解析
- // @param message_len 消息长度
- // @return bool 推送是否成功
- // Sample usage: mqtt_publish_pack(&topic, topic_len, &message, message_len);
- //----------------------------------------------------------------------------
- bool mqtt_publish_pack (char *topic, uint8_t topic_len, char *message, uint16_t message_len)
复制代码 五、结束语
截止到目前为止,逐飞已经在gitee上发布了8个开源项目,对其他开源项目感兴趣的朋友们也可通过此链接:https://gitee.com/seekfree/projects了解到具体内容,感谢您的阅读,本期逐飞LPC55S69开源库介绍就到这里了,在使用过程中遇到相关疑问或有更好的建议欢迎留言告诉我们。
最后,关于LPC系列的产品,不仅仅有已经在逐飞淘宝店上架LPC55S69核心板和基于LPC55S69的 IoT开发板,还有一款基于LPC845制作的多功能传感器模拟模块,可以模拟多种传感器的数据输出方式,这个模拟模块主要用于大家调试学习使用,可以替代多款传感器的调试学习,对于做设计的嵌入式工程师来说应该是一款神器了,后面会推出一篇专门的介绍来介绍这个神器的模块,欢迎关注,最最后,逐飞还有一款老产品LPC54606核心板,大家应该比较熟悉了,就不再赘述,至此,关于NXP LPC系列芯片我们已经有了4款主要产品,希望大家喜欢。下期再见!
基于LPC845的传感器模拟模块
|
|