这是ecos.db里面所包含的模板,为EA LPC2468 OEM board的模板。
在C:\cygwin\opt\ecos-3.0\packages\hal\arm\lpc24xx\ea2468\v3_0\src目录下的ea2468_misc.c文件中,函数void hal_pll_init(void)里面的几行,如下:
212 // Set CPU clock divider
213 //
214 HAL_WRITE_UINT32(SCB_BASE + CYGARC_HAL_LPC24XX_REG_CCLKCFG,
215 CYGNUM_HAL_ARM_LPC24XX_CPU_CLK_DIV - 1);
216
217 //
218 // Set USB clock divider
219 //
220 HAL_WRITE_UINT32(SCB_BASE + CYGARC_HAL_LPC24XX_REG_CCLKCFG,
221 CYGNUM_HAL_ARM_LPC24XX_USB_CLK_DIV - 1);
需要注意的是CYGARC_HAL_LPC24XX_REG_CCLKCFG,在设置USB时钟时,却是给CPU时钟赋值。因此,在eCos Configuration Tool里对CPU的频率作修改后,最后还是由USB的分频值来确定CPU的时钟。如果两个时钟都是设定为48MHz,那么在程序运行时不会出现问题。如果需要CPU的时钟为72MHz,而USB的时钟为48MHz,此时CPU的时钟仍为48MHz。将220行作如下修改,即可。
220 HAL_WRITE_UINT32(SCB_BASE + CYGARC_HAL_LPC24XX_REG_USBCLKCFG,
另外,还有一个设置串口波特率时需要注意的地方。
在void hal_plf_startup(void)函数中:
// Set clock speed of all peripherals to reset value (CPU speed / 4)
//
HAL_WRITE_UINT32(SCB_BASE + CYGARC_HAL_LPC24XX_REG_PCLKSEL0, 0x00000000);
HAL_WRITE_UINT32(SCB_BASE + CYGARC_HAL_LPC24XX_REG_PCLKSEL1, 0x00000000);
这里设置了外围设备的时钟为CPU时钟的1/4。
波特率的计算为:
UxDLM = (UARTx_PCLK / (baudrate*16)) >> 8;
UxDLL = (UARTx_PCLK / (baudrate*16)) & 0xFF;
假设CPU_CL=48MHz,需要设置baudrate为115200,这时可以计算出:
UxDLM = ((48000000/4) / (115200*16)) >> 8 = 0
UxDLL = ((48000000/4) / (115200*16)) & 0xFF = 6
其实,(48000000/4) / (115200*16) = 6.51。可以看出,误差很大。
再计算一下波特率为128000的情况:(48000000/4) / (128000*16) = 5.86。
由此可以知道,当评估板的波特率按照以上参数设置时,由于误差的存在,设置的波特率并不是如eCos配置工具所显示的。
使用较低的波特率将不会出现该问题。或者可以提高UART0的时钟,只需作如下修改:
HAL_WRITE_UINT32(SCB_BASE + CYGARC_HAL_LPC24XX_REG_PCLKSEL0, 0x00000040);
修改后的 UxDLL = (48000000 / (115200*16)) & 0xFF = 26,
而 (48000000 / (115200*16)) = 26.04,误差就小多了。
如果使用更高的时钟,例如72MHz,可算得(72000000 / (115200*16)) = 39.06,误差就更小了。
在72MHz时,芯片会有点发热,用手可以感觉出来,可见功耗应该蛮大的。
以上两个问题,我大概花了5个小时才搞定,有点郁闷,所以整理出来,希望对遇到该问题的同行有点用处,或许可以减少点郁闷的时间,呵呵。 |