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