隨著ARM的發(fā)展越來愈快,應(yīng)用越來越廣泛,現(xiàn)在ARM Cortem M系列已經(jīng)基本走向取代8位、16位MCU的時代。正式因為這樣,推出ARM Cortem M系列CPU的廠商如雨后春筍一般迅速增加。廠商在推出自己產(chǎn)品是無益會在自己的產(chǎn)品中增加各種差異化、特色化功能,然而,這就讓開發(fā)的工程師,在開發(fā)產(chǎn)品時變得比較困難。特別是在產(chǎn)品需要優(yōu)化和升級,更換硬件平臺時。軟件的更換也會變得相當(dāng)復(fù)雜,所以,ARM也推出一些軟件設(shè)計方面的標(biāo)準(zhǔn)-CMSIS,CMSIS統(tǒng)、一了啟動和內(nèi)核相關(guān)的代碼,給出了一個規(guī)范的標(biāo)準(zhǔn),然而,這遠(yuǎn)遠(yuǎn)不夠,一個系統(tǒng)會用到CPU的各種各樣的外設(shè),而這些外設(shè),CMSIS還沒給出明確的標(biāo)準(zhǔn),雖然,在CMSIS 1的后期版本里面做過相關(guān)工作,最后也無疾而終! 幸好CooCox 推出了一個完善的標(biāo)準(zhǔn)——CoX標(biāo)準(zhǔn)。深入了解并研究代碼后發(fā)現(xiàn),CoX不僅很好的實現(xiàn)了廠商的特性,還提出了所有的共性。下面從我體驗RTC來說說CoX給我們帶來的方便! 首先,我從github上面clone了整個的CoX倉庫,關(guān)于git的用法等,這個里面有幫助鏈接,這里就不詳細(xì)去介紹了。 Clone完了之后發(fā)現(xiàn)有許多分支,選擇了NUC1xx的分支,由于我要做個簡單的萬年歷,于是開始研究RTC方面的代碼,發(fā)現(xiàn)API很簡單,發(fā)現(xiàn)就需要先做一個初始化配置并使能相關(guān)中斷就可以用來讀寫時間了,芯唐的RTC實現(xiàn)了一個完整的萬年歷系統(tǒng),可以直接從寄存器讀出年月日時分秒,還有星期。甚至連是否是瑞年也會有標(biāo)志位。用起來很方便!xRTC也是這么定義的,在xtTime的結(jié)構(gòu)體中,包含了年月日時分秒和星期這些元素。但是,我以前用過ST芯片,發(fā)現(xiàn)STM32F1xx系列的RTC只有一個32位數(shù)據(jù)計數(shù)器,應(yīng)該是不能和xtTime所定義的標(biāo)準(zhǔn)相兼容的,正當(dāng)我有此疑惑的時候,我看到另外一個配置宏以及對應(yīng)的兩個API,static unsigned long xRTCConvertTimeToCounter(xtTime *xtTime) 和static void xRTCConvertCounterToTime(xtTime *xtTime, unsigned long ultimeCounter)。這兩個API的用途就是實現(xiàn)xtTime結(jié)構(gòu)體和數(shù)據(jù)計數(shù)器之間的相互轉(zhuǎn)換的。有了這兩個API,所有的RTC都可以統(tǒng)、一成一種通用的標(biāo)準(zhǔn)——即用統(tǒng)、一的API,用固定格式的數(shù)據(jù)結(jié)構(gòu)(參數(shù)統(tǒng)、一)。于是,我輕松的寫完了一個簡單的例程,對比,CooCox在組件里面上傳的例程,大同小異,不同的是,我全部用CoX接口實現(xiàn)。很簡單的代碼。 在用CoX庫寫代碼時,首先,第一件事情就是配置系統(tǒng)時鐘: xSysCtlClockSet(48000000, xSYSCTL_OSC_MAIN | xSYSCTL_XTAL_12MHZ); 這個函數(shù)有兩個參數(shù),第一個就是最終需要得到的系統(tǒng)時鐘,第二個參數(shù)是對應(yīng)的配置,如果使用,內(nèi)部時鐘就選xSYSCTL_OSC_INT,使用外部晶振就選xSYSCTL_OSC_MAIN,并“與”上開發(fā)板實際的晶振值。 其次,就是使能和復(fù)位外設(shè): xSysCtlPeripheralReset(xSYSCTL_PERIPH_RTC); xSysCtlPeripheralEnable(xSYSCTL_PERIPH_RTC); 如果有管腳的話,就配置相關(guān)管腳: xSPinTypeUART(UART0RX,PB0); xSPinTypeUART(UART0TX,PB1); RTC一般沒有相關(guān)外部管腳,這一步?jīng)]有,上面的是以串口為例說明的。 再次,調(diào)用外設(shè)的初始化函數(shù)、外設(shè)使能函數(shù)、中斷使能和中斷回調(diào)配置等: xRTCTimeInit(); 初始化RTC外設(shè) xRTCIntCallbackInit(xRTCCallback); 初始化回調(diào)函數(shù) xRTCIntEnable(xRTC_INT_SECOND); 在外設(shè)層使能中斷 xIntEnable(INT_RTC); 在內(nèi)核層使能中斷 對于RTC的話,還要配置一個初始時間,這個就可以通過xRTCTimeWrite(&tTime1, xRTC_TIME_CURRENT)函數(shù)實現(xiàn)。至此,只用在每次發(fā)生中斷是,用xRTCTimeRead(&tTime1, xRTC_TIME_CURRENT)讀出當(dāng)前的時間就行了! 研究完了RTC代碼發(fā)現(xiàn),CoX代碼真的將各個廠商的差異和共性變現(xiàn)的一覽無余。于是,RTC在應(yīng)用時變得很方便快捷。從一個系列的MCU換到另外一個系列,只需修改基本配置就行了!當(dāng)然RTC只是一個很簡單的外設(shè),要統(tǒng)、一很簡單,下面我會進(jìn)一步研究其他代碼,一步步揭開CoX的神秘面紗! |