隨著ARM的發展越來愈快,應用越來越廣泛,現在ARM Cortem M系列已經基本走向取代8位、16位MCU的時代。正式因為這樣,推出ARM Cortem M系列CPU的廠商如雨后春筍一般迅速增加。廠商在推出自己產品是無益會在自己的產品中增加各種差異化、特色化功能,然而,這就讓開發的工程師,在開發產品時變得比較困難。特別是在產品需要優化和升級,更換硬件平臺時。軟件的更換也會變得相當復雜,所以,ARM也推出一些軟件設計方面的標準-CMSIS,CMSIS統、一了啟動和內核相關的代碼,給出了一個規范的標準,然而,這遠遠不夠,一個系統會用到CPU的各種各樣的外設,而這些外設,CMSIS還沒給出明確的標準,雖然,在CMSIS 1的后期版本里面做過相關工作,最后也無疾而終! 幸好CooCox 推出了一個完善的標準——CoX標準。深入了解并研究代碼后發現,CoX不僅很好的實現了廠商的特性,還提出了所有的共性。下面從我體驗RTC來說說CoX給我們帶來的方便! 首先,我從github上面clone了整個的CoX倉庫,關于git的用法等,這個里面有幫助鏈接,這里就不詳細去介紹了。 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一般沒有相關外部管腳,這一步沒有,上面的是以串口為例說明的。 再次,調用外設的初始化函數、外設使能函數、中斷使能和中斷回調配置等: xRTCTimeInit(); 初始化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的神秘面紗! |