Clock Out 是一個可以提供MCU外的元件當作參考clock或是提供量測內部幾個clock的依據.
在LPC111x中 Pin同 ISP Pin,
所以可以設定後可以對其 PIO0_1 直接量測結果.
可參考上圖DIY線路中 PIO0_1/ISP
因為與PIO0_1共用所以要先初始化設定為 Clock out 功能
void clock_out_int(void)
{
/* Output the Clk onto the CLKOUT Pin PIO0_1 to monitor the freq on a scope */
LPC_IOCON->PIO0_1 = (1<<0);
}
uint8_t clock_out_change(uint8_t clock_sel , uint8_t divide)
{
uint8_t return_status=FALSE;
if((clock_sel>3)||(divide>255)) // OUT OF RANGE
{
return_status = FALSE;
}
else
{
/* Select the MAIN clock as the clock out selection since it's driving the core */
LPC_SYSCON->CLKOUTCLKSEL = clock_sel; // 3; // 0:IRC 1:System Osc 2: watchdog 3: Main colck
/* Set CLKOUTDIV to 6 */
LPC_SYSCON-> CLKOUTDIV CLKOUTDIVCLKOUTDIV = divide; // CLKOUT Divider = 1 ,0:disable 1~255 divide
/* Enable CLKOUT */
LPC_SYSCON->CLKOUTUEN = 0;
LPC_SYSCON->CLKOUTUEN = 1;
while (!(LPC_SYSCON->CLKOUTUEN & 0x01));
return_status = TRUE;
}
return return_status;
}
clock out 相關設定相對簡單許多,
選擇clock source ,CLOCKOUTSEL 可選擇IRC,System osc.,WDT osc.,以及main clock.
接著決定是否使用CLKOUTDIV 除頻,
再將CLKOUT update Enable即可.
WDT OSC
因為範例程式中, clock out 循序設定中有設定clock source select 為WDT OSC.
而範例中並未對此設定,所以這邊特別再提一下怎麼啟動WDT OSC.
簡化之只要兩行code
LPC_SYSCON->WDTOSCCTRL = (0x1<<5)|0x00;
LPC_SYSCON->PDRUNCFG &= ~(0x1<<6); /* Let WDT clock run */
WDTOSCSTRL Bit8:5 FREQSEL 選擇 WDTOSC輸出頻率 Fclkana
WDTOSCSTRL Bit4:0 DIVSEL 除頻值
輸出WDTOSC FREQ= Fclkana/(2x(1+DIVSEL))
例如參考FREQSEL 為 0x01 ,其Fclkana頻率為 0.5MHz
DIVSEL = 0
WDTOSC = 0.5MHz/(2x(1+0)) = 0.25MHz = 250 KHz
不過要注意 data sheet中寫到 Fclkana value within ±40% 所以誤差較大.
如範例中程式實際量測到 clock out 為 WDT OSC時, 286KHz.
計算結果誤差值 +14.4% 還落在 ±40%內屬於合理範圍.
system tick timer,wdt osc. , clock out ,參考範例請至此下載 Download
0 留言:
張貼留言