回复
发帖数: 19
注册日期: ‎10-14-2014
已接受解答

EFM32 LEUART 最高波特率

我使用EFM32PG的开发板,想调试LEUART最高的波特率大于115200,达到230400,LEUART直接使用LFBCLK,LFBCLK选择使用HFCLKLE作为时钟源。HFCLKLE采用HFBUSCLK(系统时钟40Mhz)的二分频获得20MHz时钟。在实际中调试时钟只有10MHz,系统无法分得230400的波特率。不知道是什么原因。

CMU_OscillatorEnable(cmuOsc_HFXO, true, false);
while(oscFlag)
{
	intFlags = CMU_IntGet();
	if (intFlags & CMU_IF_HFXORDY)
	{
		CMU_ClockSelectSet(cmuClock_HF, cmuSelect_HFXO);
		CMU_OscillatorEnable(cmuOsc_HFRCO, false, false);
		oscFlag = 0;
	}
}
CMU->HFPRESC = CMU_HFPRESC_HFCLKLEPRESC_DIV2 + CMU_HFPRESC_PRESC_NODIVISION;
/* Initialize LEUART/USART and map LF to CRLF */
/* Enable CORE LE clock in order to access LE modules */
CMU_ClockEnable(cmuClock_CORELE, true);
CMU->CTRL |= CMU_CTRL_WSHFLE;
 /* Select HFXO/2 for LEUARTs (and wait for it to stabilize) */
 CMU_ClockSelectSet(cmuClock_LFB, cmuSelect_HFCLKLE);

CMU_ClockEnable(cmuClock_LEUART0, true);

/* Do not prescale clock */
 CMU_ClockDivSet(cmuClock_LEUART0, cmuClkDiv_1);
refFreq = CMU_ClockFreqGet(cmuClock_LEUART0);

 

发帖数: 2,308
注册日期: ‎10-14-2014

回复: EFM32 LEUART 最高波特率

@bjutzyh

你得到的LEUART时钟是多少?按照reference manual,这个分频器是一个14bit (9 integral an 5 fractional). 有可能并不能完全是230400这个波特率。但误差应该不大。

你可以把系统时钟拉出来到GPIO,看看有没有误差。另外看看你的LEUARTn——CLKDIV寄存器设的什么值,是不是和你计算的一样。

 

My views are my own and do not necessarily represent the views of Silicon Labs

 

WeiguoLu
发帖数: 19
注册日期: ‎10-14-2014

回复: EFM32 LEUART 最高波特率

经过测试LEUART波特率设定到256000没问题,使用的是外部的usb转串口,使用starter kit上的usb转串口不行。

但是我使用函数CMU_ClockFreqGet(cmuClock_LEUART0)得到的LEUART的时钟是10Mhz,按照我的设置和时钟树应该是20Mhz。这个是什么原因?

使用EFM32PG1B200F256GM48 SLSTK3401A

	CMU_HFXOInit_TypeDef hfxoInit = CMU_HFXOINIT_DEFAULT;

	CMU_HFXOInit(&hfxoInit);

	/* Enable HFXO oscillator, and wait for it to be stable */
	CMU_OscillatorEnable(cmuOsc_HFXO, true, true);

	/* Setting system HFXO frequency */
	SystemHFXOClockSet(40000000);

	/* Using HFXO as high frequency clock, HFCLK */
	CMU_ClockSelectSet(cmuClock_HF, cmuSelect_HFXO);

	/* HFRCO not needed when using HFXO */
	CMU_OscillatorEnable(cmuOsc_HFRCO, false, false);
	// [High Frequency Clock Setup]$

	/* Enable peripheral clocks */
	CMU_ClockEnable(cmuClock_HFPER, true);

	// $[LE clocks enable]
	/* Enable clock to LE modules */
	CMU_ClockEnable(cmuClock_CORELE, true);
	// [LE clocks enable]$

	// $[LFACLK Setup]
	/* LFACLK is disabled */
	// [LFACLK Setup]$
	// $[LFBCLK Setup]
	/* Select HFCLKLE as clock source for LFBCLK */
	CMU_ClockSelectSet(cmuClock_LFB, cmuSelect_HFCLKLE);
	// [LFBCLK Setup]$

	// $[LFECLK Setup]
	/* LFECLK is disabled */
	// [LFECLK Setup]$
	// $[Peripheral Clock enables]
	/* Enable clock for LEUART0 */
	CMU_ClockEnable(cmuClock_LEUART0, true);

	/* Enable clock for GPIO by default */
	CMU_ClockEnable(cmuClock_GPIO, true);
发帖数: 19
注册日期: ‎10-14-2014

回复: EFM32 LEUART 最高波特率


delu 已写:

@bjutzyh

你得到的LEUART时钟是多少?按照reference manual,这个分频器是一个14bit (9 integral an 5 fractional). 有可能并不能完全是230400这个波特率。但误差应该不大。

你可以把系统时钟拉出来到GPIO,看看有没有误差。另外看看你的LEUARTn——CLKDIV寄存器设的什么值,是不是和你计算的一样。

 

My views are my own and do not necessarily represent the views of Silicon Labs

 


GPIO输出时钟测试了是40Mhz,LEUARTn——CLKDIV的值也没问题,但是这个分频值是10Mhz计算的,但是根据计算应该是20Mhz的时钟源。

发帖数: 2,308
注册日期: ‎10-14-2014

回复: EFM32 LEUART 最高波特率

[ 已编辑 ]

@bjutzyh

我最近没尝试过STK上的USB转串口,如果仅仅是那个CDC的串口不行,应该是JLINK 的问题。据我所知,JLINK上的串口只是支持115200速率。设置其他速率是不起作用的。可能这个bug还在。

你是指哪个时钟是10MHz,而不是期望的20MHz,你监测的哪个时钟?你监测的时钟频率是正确的吗?

WeiguoLu
发帖数: 19
注册日期: ‎10-14-2014

回复: EFM32 LEUART 最高波特率


delu 已写:

@bjutzyh

我最近没尝试过STK上的USB转串口,如果仅仅是那个CDC的串口不行,应该是JLINK 的问题。据我所知,JLINK上的串口只是支持115200速率。设置其他速率是不起作用的。可能这个bug还在。

你是指哪个时钟是10MHz,而不是期望的20MHz,你监测的哪个时钟?你监测的时钟频率是正确的吗?


如您所说,STK上的USB转串口是CDC的串口。

LEUART的时钟是LFBCLK,LFBCLK时钟选择HFCLKLE,HFCLKLE时钟可以选择HFBUSCLK/2或/4分频。

HFBUSCLK是40MHz,LEUART和LFBCLK为10MHz,难道不能选择HFBUSCLK/2分频,只能/4分频。

发帖数: 2,308
注册日期: ‎10-14-2014

回复: EFM32 LEUART 最高波特率

@bjutzyh

不好意思,我可能没说清楚,你用示波器看的是哪个时钟CLKOUTSEL0/CLKOUTSEL1, 频率是多少。看你的代码这个路径的pre-scaler都设置正确了吗?比如CMU_LFBPRESC0, CMU_HFPRESC, HFPERPRESC

,这几个寄存器的值有尝试都出来都是正确的值吗?你是基于哪个公式得出你的LEUART0使用的频率是10MHz结论的?

 

WeiguoLu
Highlighted
发帖数: 19
注册日期: ‎10-14-2014

回复: EFM32 LEUART 最高波特率


delu 已写:

@bjutzyh

不好意思,我可能没说清楚,你用示波器看的是哪个时钟CLKOUTSEL0/CLKOUTSEL1, 频率是多少。看你的代码这个路径的pre-scaler都设置正确了吗?比如CMU_LFBPRESC0, CMU_HFPRESC, HFPERPRESC

,这几个寄存器的值有尝试都出来都是正确的值吗?你是基于哪个公式得出你的LEUART0使用的频率是10MHz结论的?

 


我用CLKOUTSEL0看的HFXO (qualified)是40Mhz。

LEUART0使用的频率是使用函数CMU_ClockFreqGet(cmuClock_LEUART0)得到10Mhz。

今天调试程序,LEUART0可以得到20Mhz的时钟了。应该还是之前的函数有操作不对的地方。