0x00 CREELINKS平台简介
CREELINKS(创e联)是由大信科技有限公司研发,集合软硬件、操作系统、数据云储存、开发工具于一体,用于物联网产品的设计、研发与生产的平台。
平台涉及智能硬件、车联网、智能家居、可穿戴设备、工业控制等各个物联网领域。旨在辅助中小型企业快速完成物联网产品原型的设计与开发;并为开源软硬件爱好者、硬件DIY极客、教育机构等提供更高效的资源。
平台包含通用功能模块、操作系统、核心库、模块驱动库、物联网典型产品的解决方案及相关开发工具。
CREELINKS www.creelinks.com
0x01 处理器CeCcp资源是什么?
CeCcp资源是CREELINKS平台中将不同处理器平台中计数器(脉冲计数器)的共性提取出来,整理并编写出来的标准库。CeAd标准库包含了Ad操作相关的所有属性及API接口函数,如: 开始计数、停止计数、获得当前Ccp计数的值、清除计数等、。其标准库的头文件为CeCcp.h,不同处理器平台实现的源文件名统一为CeCcp.c。
详细介绍如下:
1、资源介绍
Creelinks平台Ccp对象的操作头文件,包含有关处理器平台Ccp内容的相关操作。可能不同处理器平台,Ccp计数的最大值有所不同,所以使用Ccp资源时,尽量使用CeMcu.h中的相关Ccp属性宏定义。
2、相关配置
在CeMcu.h中有与处理器平台有关的配置项如下:
1 #define CE_CCP_MAX_COUNT (uint32)65535 /*!< CCP所支持的最大计数值*/
其中:
CE_CCP_MAX_COUNT:因受处理器的计数器硬件结构限制,不同处理器平台的计数器可计数的最大值不同,则用户在设定计数器的最大值时,请误超过此值。
3、属性对象
1 /** 2 * @brief 结构体,CCP对象可用属性集合 3 */ 4 typedef struct 5 { 6 CE_RESOURCE ceResource; /*!< Ccp对应的资源号*/ 7 uint32 ceCntVal; /*!< 用户设定的Ccp计数临界值*/ 8 void* pAddPar; /*!< 空指针,可用于传递额外参数*/ 9 void (*callBackReachCntVal)(void* pAddPar); /*!< Ccp计数到达用户设置的临界值后,需要执行的回调函数*/ 10 11 CeExCcpPar ceExCcpPar; /*!< 与处理器平台相关的额外参数结构体,用以提高代码效率,用户无须关注*/ 12 }CeCcp;
其中:
ceResource:对应核心模块的Ccp资源号, 只要在核心板上,资源接口中带C标号即可。
ceCntVal:用户需设定的当前最大计数值,即达到此计数后即进入中断并调用用户提供的回调函数。
pAddPar:在调用回调函数时,传入的对象,可指向任意值。
callBackReachCntVal:用户需提供的当达到设定的最大计数值后,系统调用的用户回调,此回调一般均在中断中执行,故用户不要在回调内做大量耗时操作,以免影响系统性能。
ceExPwmPar:用于存不同的处理器平台,Ccp属性对象需要的额外参数。此结构体在CeMcu.h文件中定义。
4、操作对象
1 /** 2 * @brief 结构体,CCP对象可用操作集合 3 */ 4 typedef struct 5 { 6 CE_STATUS (*initial)(CeCcp* ceCcp); /*!< @brief 初始化Ccp计数器 7 @param ceCcp:ceCcp属性对象指针*/ 8 9 void (*start)(CeCcp* ceCcp); /*!< @brief 开始Ccp计数 10 @param ceCcp:ceCcp属性对象指针*/ 11 12 void (*stop)(CeCcp* ceCcp); /*!< @brief 停止Ccp计数 13 @param ceCcp:ceCcp属性对象指针*/ 14 15 uint32 (*getNowCcpCnt)(CeCcp* ceCcp); /*!< @brief 获得当前Ccp计数的值,此值一定小于等于ceMaxCnt 16 @param ceCcp:ceCcp属性对象指针 17 @return 获取本次计数周期的计数值*/ 18 19 uint32 (*getAllCcpCnt)(CeCcp* ceCcp); /*!< @brief 获得从开始计数起(调用startCcp时开始),到现在一共的计数值 20 @param ceCcp:ceCcp属性对象指针 21 @return 获取从开始计数到目前为止总的计数值*/ 22 23 void (*clearCcpCnt)(CeCcp* ceCcp); /*!< @brief 清除计数,从0开始重新计数 24 @param ceCcp:ceCcp属性对象指针*/ 25 }CeCcpOpBase; 26 extern const CeCcpOpBase ceCcpOp; /*!< 所有与Ccp相关的操作*/
其中:
initial:对一个Ccp资源进行初始化,如果在CeMcu.h中的宏定义 __CE_CHECK_PAR__处于打开状态,则会对输入的CeCcp属性对象进行参数检查。
start:开始Ccp计数,开始计数时不会重置当前的计数值。
stop:停止Ccp计数,停止后,Ccp计数器操持各个寄存器的值不变,在下次调用start时,还将会在之前的基础上进行脉冲计数。
getNowCcpCnt:获得当前的计数值,即在未达到用户提供的最大计数值时,当前的计数值。一旦到达最大值后,调用回调后,则清空此值,并重新计数。
getAllCcpCnt:获得从Ccp第一次执行start开始到目前的计数总值,除非调用clearCcpCnt,否则内部计数不会清空。
clearCcpCnt:清空有关Ccp所有的计数寄存器,全部从0开始。
5、执行流程
6、应用示例
1 /** 2 ****************************************************************************** 3 * @brief 使用流程及示例程序(基于前后台非操作系统环境) 4 * @function 设定Ccp的最大计数值为10,并每500ms读取当前值并通过Uart输出到上位机 5 ****************************************************************************** 6 #include "Creelinks.h" 7 CeCcp myCcp; //Ccp属性对象 8 uint8 ccpCount; //当前Ccp的计数值 9 10 // @brief Ccp计数器达到设置值后的事件回调 11 // @param pAddPar:Ccp对像指针里的pAddPar参数 12 void ceCcpReachCntCallBack(void* pAddPar) 13 { 14 ceSystemOp.printf("Ccp is reach setting count!\n"); 15 } 16 17 int main(void) 18 { 19 ceSystemOp.initial(); //Creelinks环境初始化 20 ceSystemOp.initialDebug(RxUart); //通过Uart串口输出Debug信息到上位机 21 //TODO:请在此处插入模块初始化等操作 22 myCcp.ceResource = RxC; //指定计数器资源号 23 myCcp.ceCntVal = 10; //指定计数到何值后,进入中断回调 24 myCcp.callBackReachCntVal = ceCcpReachCntCallBack;//指定回调函数 25 myCcp.pAddPar = &myCcp; //指定属性中空指针为本身,中断回调中传入此指针 26 ceCcpOp.initial(&myCcp); //初始化计数器 27 ceCcpOp.start(&myCcp); //开始计数 28 while (1) 29 { 30 ceSystemOp.mainTask(); //Creelinks环境主循环任务,请保证此函数能够被周期调用 31 //TODO:请在此处插入用户操作 32 ccpCount = ceCcpOp.getNowCcpCnt(&myCcp); //获得当前计数值 33 ceSystemOp.printf("Ccp count is %d\n", ccpCount);//打印当前计数值 34 ceSystemOp.delayMs(500); //延时500ms 35 }; 36 } 37 ****************************************************************************** 38 */
0x02 CeCcp的注意事项
0x03 CeCcp在不同处理器的应用实例
1、STM32平台下的ELinkSTM核心板下使用CeCcp...。代码及动画效果如下:
待添加...