|
最近一直在做單片機通信方面的程序測試,成果之一就是以戰艦板串口2向野火開發板串口1發送字符或字符串,戰艦板作為主機設計了觸摸屏界面,可以根據界面隨心所欲地向從機發送字符或字符串還包括漢字;诖耍谠O計一個通過戰艦板RS485控制西門子S7-200PLC的程序;這也是現在工業自動化最常見的一種控制模式。言歸正傳:
CM3內核的時鐘樹很復雜,什么系統時鐘,總線時鐘,外部時鐘,內部時鐘的搞得有點亂。其實,把 CM3內核的時鐘概念和頻率概念搞清楚, CM3就不那么艱難了!不信看下面的描述,錯誤之處請指正!畢竟這只是我個人的理解。
先從原子的基于STM32的一個延時函數delay_init(u8 SYSCLK) 講起: void delay_init(u8 SYSCLK) //SYSCLK:系統時鐘,戰艦板是72
{
#ifdef OS_CRITICAL_METHOD //如果OS_CRITICAL_METHOD定義了,則使用了ucosII.
u32 reload;
#endif
SysTick->CTRL&=~(1<<2);//SYSTICK使用外部時鐘源
fac_us=SYSCLK/8;//不論是否使用ucos,fac_us都需要使用,1/9us就是來自這里
#ifdef OS_CRITICAL_METHOD//如果OS_CRITICAL_METHOD定義了,則使用了ucosII.
reload=SYSCLK/8;//每秒鐘的計數次數,單位為K
reload*=1000 000/OS_TICKS_PER_SEC;/*根據OS_TICKS_PER_SEC設定溢出時間;OS_TICKS_PER_SEC是OS每秒時鐘節拍數 */
//reload為24位寄存器,最大值:16777216,在72M下,約合1.86s左右
fac_ms=1000/OS_TICKS_PER_SEC;//代表ucos可以延時的最少單位
SysTick->CTRL|=1<<1; //開啟SYSTICK中斷
SysTick->LOAD=reload; //每1/OS_TICKS_PER_SEC秒中斷一次
SysTick->CTRL|=1<<0; //開啟SYSTICK
#else
fac_ms=(u16)fac_us*1000; //非ucos下,代表每個ms需要的systick時鐘數
#endif
}
函數比較簡單就不分析了; 為了理解上述函數還必須補補課:計算機只認識“0”和“1”信號,說白了就是“開”“關”兩種狀態。時鐘頻率就是每秒“開”“關”這兩種狀態的變化次數。CPU的內部其實就是由大量的寄存器和觸發器構成的,這些寄存器或觸發器都必須在一定的時鐘頻率控制下工作才能實現CPU的“有序可控”;這也是CPU“智能化”和“聽話”的理論基礎。硬件時鐘源頻率(或者說“開關”速度)越快,CPU的內部的寄存器或觸發器等硬件就響應越快。CM3內核中有APB1(最大36mhz)和APB2(最大72mhz)兩條片上外設總線,每條總線的時鐘頻率是不一樣的,且每條總線上的外設都有各自的時鐘源控制開關,也就是說不同的外設可以根據各自的時鐘需求以不同的“開關”速率工作。這樣設計主要是基于減少能耗的目的。硬件之間的接口電路的目的就是為了解決時鐘源不同步和信號機制不同的問題而設計的。CM3內核有5個時鐘源,而51單片機只有一個時鐘源11.0592MHZ;時鐘源越多說明內核的功能越多,可以適應更多的工作環境和要求。
時鐘周期T是時序中最小的時間單位,具體計算是1/時鐘源;假設晶振即時鐘源是11.0592,則與之對應的時鐘周期就是1/11.0592s。機器周期是CPU完成一個操作的最小時間,普通51單片機一個機器周期是12個時鐘周期。就CM3內核中的24位計數器來說,如果時鐘源頻率是9Mhz,如何理解時鐘源頻率是9Mhz呢?根據上述M3內核的時鐘周期(即CPU完成一個操作的最小時間,秒)=1/9MHz;即1/9us;換句話說m3內核的cpu開或關一次操作所需的時間是1/9微秒. 公式如下:
T(周期,單位秒)*F(頻率,單位hz)=1(脈沖個數)
在電子技術中,脈沖信號是一個按一定電壓幅度,一定時間間隔連續發出的脈沖信號。脈沖信號之間的時間間隔稱為周期;而將在單位時間(如1秒)內所產生的脈沖個數稱為頻率。頻率是描述周期性循環信號(包括脈沖信號)在單位時間內所出現的脈沖數量多少的計量名稱;頻率的標準計量單位是Hz(赫)。電腦中的系統時鐘就是一個典型的頻率相當精確和穩定的脈沖信號發生器。頻率在數學表達式中用“f”表示,其相應的單位有:Hz(赫茲)、kHz(千赫茲)、MHz(兆赫茲)、GHz(千兆赫茲)。其中1GHz=1000MHz,1MHz=1000kHz,1kHz=1000Hz。計算脈沖信號周期的時間單位及相應的換算關系是:s(秒)、ms(毫秒)、μs(微秒)、ns(納秒),其中:1s=1000ms,1 ms=1000μs,1μs=1000ns。
相信看完上述講解,會對CM3內核有個更清晰的認識,能解決很多初學者心頭的許多疑問。
|
|