随着ARM的发展越来愈快,应用越来越广泛,现在ARM Cortem M系列已经基本走向取代8位、16位MCU的时代。正式因为这样,推出ARM Cortem M系列CPU的厂商如雨后春笋一般迅速增加。厂商在推出自己产品是无益会在自己的产品中增加各种差异化、特色化功能,然而,这就让开发的工程师,在开发产品时变得比较困难。特别是在产品需要优化和升级,更换硬件平台时。软件的更换也会变得相当复杂,所以,ARM也推出一些软件设计方面的标准-CMSIS,CMSIS统一了启动和内核相关的代码,给出了一个规范的标准,然而,这远远不够,一个系统会用到CPU的各种各样的外设,而这些外设,CMSIS还没给出明确的标准,虽然,在CMSIS 1的后期版本里面做过相关工作,最后也无疾而终! 幸好CooCox 推出了一个完善的标准——CoX标准。深入了解并研究代码后发现,CoX不仅很好的实现了厂商的特性,还提出了所有的共性。下面从我体验RTC来说说CoX给我们带来的方便! Clone完了之后发现有许多分支,选择了NUC1xx的分支,由于我要做个简单的万年历,于是开始研究RTC方面的代码,发现API很简单,发现就需要先做一个初始化配置并使能相关中断就可以用来读写时间了,芯唐的RTC实现了一个完整的万年历系统,可以直接从寄存器读出年月日时分秒,还有星期。甚至连是否是瑞年也会有标志位。用起来很方便!xRTC也是这么定义的,在xtTime的结构体中,包含了年月日时分秒和星期这些元素。但是,我以前用过ST芯片,发现STM32F1xx系列的RTC只有一个32位数据计数器,应该是不能和xtTime所定义的标准相兼容的,正当我有此疑惑的时候,我看到另外一个配置宏以及对应的两个API,static unsigned long
xRTCConvertTimeToCounter(xtTime *xtTime) 和static void xRTCConvertCounterToTime(xtTime *xtTime, unsigned long ultimeCounter)。这两个API的用途就是实现xtTime结构体和数据计数器之间的相互转换的。有了这两个API,所有的RTC都可以统一成一种通用的标准——即用统一的API,用固定格式的数据结构(参数统一)。于是,我轻松的写完了一个简单的例程,对比,CooCox在组件里面上传的例程,大同小异,不同的是,我全部用CoX接口实现。很简单的代码,如图所示: 在用CoX库写代码时,首先,第一件事情就是配置系统时钟: xSysCtlClockSet(48000000, xSYSCTL_OSC_MAIN | xSYSCTL_XTAL_12MHZ); 这个函数有两个参数,第一个就是最终需要得到的系统时钟,第二个参数是对应的配置,如果使用,内部时钟就选xSYSCTL_OSC_INT,使用外部晶振就选xSYSCTL_OSC_MAIN,并“与”上开发板实际的晶振值。 xSysCtlPeripheralReset(xSYSCTL_PERIPH_RTC); xSysCtlPeripheralEnable(xSYSCTL_PERIPH_RTC); xSPinTypeUART(UART0RX,PB0);
xSPinTypeUART(UART0TX,PB1);
RTC一般没有相关外部管脚,这一步没有,上面的是以串口为例说明的。 再次,调用外设的初始化函数、外设使能函数、中断使能和中断回调配置等: xRTCIntCallbackInit(xRTCCallback);
初始化回调函数 xRTCIntEnable(xRTC_INT_SECOND);
在外设层使能中断 xIntEnable(INT_RTC);
在内核层使能中断 对于RTC的话,还要配置一个初始时间,这个就可以通过xRTCTimeWrite(&tTime1, xRTC_TIME_CURRENT)函数实现。至此,只用在每次发生中断是,用xRTCTimeRead(&tTime1, xRTC_TIME_CURRENT)读出当前的时间就行了! 研究完了RTC代码发现,CoX代码真的将各个厂商的差异和共性变现的一览无余。于是,RTC在应用时变得很方便快捷。从一个系列的MCU换到另外一个系列,只需修改基本配置就行了!当然RTC只是一个很简单的外设,要统一很简单,下面我会进一步研究其他代码,一步步揭开CoX的神秘面纱! |