cortex m0 lpc1114 clkout配置程序
配置完時鐘,如何驗證時鐘的配置準確性呢?
LPC1114帶有CLKOUT引腳,此引腳專門用來輸出時鐘,用示波器觀察此引腳,即可看到時鐘的頻率。
1.硬件配置
CLKOUT引腳位于LPC111X和LPC11CXX單片機的P0.1腳,如下圖所示:
2.軟件設計
/*********************************************************/
/* 函數(shù)功能:使能CLKOUT腳輸出頻率 */
/* 入口參數(shù):CLKOUT_DIV,即CLKOUT分頻值,1~255 */
/* =0 關(guān)閉時鐘輸出 */
/* 說明: 此函數(shù)可用來測試時鐘 */
/*********************************************************/
void CLKOUT_EN(uint8_t CLKOUT_DIV)
{
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16); // 使能IOCON時鐘
LPC_IOCON->PIO0_1=0XD1; // 把P0.1腳設置為CLKOUT引腳
LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<16); // 禁能IOCON時鐘
LPC_SYSCON->CLKOUTDIV = CLKOUT_DIV; // 寫CLKOUT_DIV
LPC_SYSCON->CLKOUTCLKSEL= 0X00000003; // CLKOUT時鐘源選擇為主時鐘
LPC_SYSCON->CLKOUTUEN =0;
LPC_SYSCON->CLKOUTUEN =1;
while (!(LPC_SYSCON->CLKOUTUEN & 0x01)); // 確定時鐘源更新后向下執(zhí)行
}
3. CLKOUT_EN程序詳解
CLKOUT_EN()函數(shù)中,涉及到了6個寄存器:
SYSAHBCLKCTRL:系統(tǒng)AHB時鐘控制寄存器
PIO0_1:PIO0_1引腳控制寄存器
CLKOUTDIV:CLKOUT分頻寄存器
CLKOUTCLKSEL:CLKOUT時鐘源選擇寄存器
CLKOUTUEN:CLKOUT時鐘源更新寄存器
其中,PIO0_1屬于IOCON模塊,其他5個屬于SYSCON模塊。
SYSAHBCLKCTRL:系統(tǒng)AHB時鐘控制寄存器
位符號值描述復位值0SYSAHB到APB橋的時鐘, 只讀位10保留1允許1ROM
ROM時鐘允許位10不允許1允許2RAM
RAM時鐘允許位10不允許1允許3FLASHREG
FLASH寄存器接口時鐘允許位10不允許1允許4FLASHARRAY
FLASH陣列訪問時鐘允許位10不允許1允許5I2C
I2C時鐘允許位00不允許1允許6GPIO
GPIO時鐘允許位10不允許1允許7CT16B0
16位定時計數(shù)器0時鐘允許位00不允許1允許8CT16B1
16位定時計數(shù)器1時鐘允許位00不允許1允許9CT32B0
32位定時計數(shù)器0時鐘允許位0
32位定時計數(shù)器1時鐘允許位00不允許1允許11SSP0
SPI0時鐘允許位10不允許1允許12UART
UART時鐘允許位00不允許1允許13ADC
ADC時鐘允許位00不允許1允許14––保留015WDT
WDT時鐘允許位00不允許1允許16IOCON
IO配置模塊時鐘允許位00不允許1允許17CAN
CAN模塊時鐘允許位00不允許1允許18SSP1
SPI1時鐘允許位00不允許1允許31:19––保留0x00
第9行:對SYSAHBCLKCTRL的bit16寫1,即開啟IOCON的時鐘。因為下面我們要把P0.1腳設置為CLKOUT引腳,必須要開啟IOCON時鐘才可以切換引腳的功能。
第11行:對SYSAHBCLKCTRL的bit16寫0,即關(guān)閉IOCON的時鐘。這個時鐘可以在系統(tǒng)初始化的時候,打開而不用關(guān)閉,之所以要關(guān)閉,是為了節(jié)省功耗。等需要改變引腳功能的時候打開,引腳功能改變后,關(guān)閉IOCON時鐘。
PIO0_1寄存器:
位符號值描述復位值2:0FUNC功能選擇位0000x0選擇功能PIO0_1.0x1選擇功能CLKOUT.0x2選擇功能CT32B0_MAT2.4:3MODE
模式選擇位100x0無上拉下拉電阻0x1允許下拉電阻0x2允許上拉電阻
0x3中繼模式
5HYS
滯后00不允許1允許9:6––保留001110OD
偽開漏模式選擇00標準GPIO輸出1開漏輸出31:11––保留–
第10行,給PIO0_1寄存器中寫入0xD1,即把P0.1引腳設置為CLKOUT引腳。
CLKOUTDIV:CLKOUT分頻寄存器
位符號描述復位值7:0DIV分頻值0: 禁止CLKOUT.
1: 分頻值1.
to
255: 分頻值255.
0x0031:8–保留0x00該寄存器決定了CLKOUT時鐘源輸出的頻率為:CLKOUT時鐘源頻率/DIV。
第12行,給CLKOUTDIV寄存器寫入分頻值。
CLKOUTCLKSEL:CLKOUT時鐘源選擇寄存器
位符號值描述復位值1:0SELCLKOUT時鐘源選擇0x000x0IRC振蕩器0x1系統(tǒng)振蕩器0x2看門狗振蕩器0x3主時鐘31:2––保留0x00
第13行,給CLKOUTCLKSEL寄存器寫入了0x03,即選擇主時鐘作為CLKOUT的輸出時鐘。因為我們要觀察主時鐘是否配置正確。
CLKOUTUEN:CLKOUT時鐘源更新寄存器
位符號值描述復位值0ENACLKOUT時鐘源更新寄存器0x00沒有改變1更新時鐘源31:1––保留0x00
第14、15行,當CLKOUTCLKSEL中的值改變以后,需要對此更新寄存器先寫0再寫1達到時鐘更新的目的。
第16行,觀察該寄存器的狀態(tài),確定更新成功后跳出while循環(huán)向下執(zhí)行。
完成以上步驟,就可以實現(xiàn)CLKOUT輸出時鐘了。
例如:把內(nèi)部IRC時鐘倍頻4倍后變?yōu)?8MHz,利用CLKOUT函數(shù),設置DIV為48,即在CLKOUT引腳上輸出1MHz的時鐘;如果DIV為96,即在CLKOUT引腳上將輸出500KHz的時鐘。