KL27串口的其他波特率用不了
在使用KL27时,使用库初始化串口,只有设置波特率为115200接收和发送的数据才是对的,其他都是错的。LPUART_QuickInit(LPUART0_RX_A01_TX_A02, 9600);
uint32_t LPUART_QuickInit(uint32_t MAP, uint32_t baudrate)
{
uint8_t i;
LPUART_InitTypeDef LPUART_InitStruct1;
QuickInit_Type * pq = (QuickInit_Type*)&(MAP);
LPUART_InitStruct1.baudrate = baudrate;
LPUART_InitStruct1.instance = pq->ip_instance;
LPUART_InitStruct1.parityMode = kUART_ParityDisabled;
LPUART_InitStruct1.bitPerChar = kUART_8BitsPerChar;
LPUART_InitStruct1.srcClock = 48*1000*1000;
/* clock config use IRC48M */
switch(pq->ip_instance)
{
case HW_LPUART0:
SIM->SOPT2 &= ~SIM_SOPT2_LPUART0SRC_MASK;
SIM->SOPT2 |= SIM_SOPT2_LPUART0SRC(1);
break;
case HW_LPUART1:
SIM->SOPT2 &= ~SIM_SOPT2_LPUART1SRC_MASK;
SIM->SOPT2 |= SIM_SOPT2_LPUART1SRC(1);
break;
}
for(i = 0; i < pq->io_offset; i++)
{
PORT_PinMuxConfig(pq->io_instance, pq->io_base + i, (PORT_PinMux_Type) pq->mux);
}
LPUART_Init(&LPUART_InitStruct1);
return pq->ip_instance;
}
void LPUART_Init(LPUART_InitTypeDef* UART_InitStruct)
{
uint16_t sbr, sbrTemp, i;
uint32_t osr, tempDiff, calculatedBaud, baudDiff;
static bool is_fitst_init = true;
LPUART_Type *LPUARTx;
LPUARTx = LPUART_InstanceTable;
/* enable clock gate */
*((uint32_t*) SIM_LPUARTClockGateTable.addr) |= SIM_LPUARTClockGateTable.mask;
/* disable Tx Rx first */
LPUARTx->CTRL &= ~(LPUART_CTRL_RE_MASK | LPUART_CTRL_TE_MASK);
osr = 4;
sbr = (UART_InitStruct->srcClock/(UART_InitStruct->baudrate * osr));
t=sbr;
calculatedBaud = (UART_InitStruct->srcClock / (osr * sbr));
if (calculatedBaud > UART_InitStruct->baudrate)
{
baudDiff = calculatedBaud - UART_InitStruct->baudrate;
}
else
{
baudDiff = UART_InitStruct->baudrate - calculatedBaud;
}
for (i = 5; i <= 32; i++)
{
/* calculate the temporary sbr value */
sbrTemp = (UART_InitStruct->srcClock/(UART_InitStruct->baudrate * i));
/* calculate the baud rate based on the temporary osr and sbr values */
calculatedBaud = (UART_InitStruct->srcClock / (i * sbrTemp));
if (calculatedBaud > UART_InitStruct->baudrate)
{
tempDiff = calculatedBaud - UART_InitStruct->baudrate;
}
else
{
tempDiff = UART_InitStruct->baudrate - calculatedBaud;
}
if (tempDiff <= baudDiff)
{
baudDiff = tempDiff;
osr = i;/* update and store the best osr value calculated */
sbr = sbrTemp;/* update store the best sbr value calculated */
}
}
LPUARTx->BAUD &= ~LPUART_BAUD_SBR_MASK;
LPUARTx->BAUD &= ~LPUART_BAUD_OSR_MASK;
LPUARTx->BAUD |= LPUART_BAUD_SBR(sbr) | LPUART_BAUD_OSR(osr-1);
/* parity */
switch(UART_InitStruct->parityMode)
{
case kUART_ParityDisabled:
LPUARTx->CTRL &= ~LPUART_CTRL_PE_MASK;
break;
case kUART_ParityEven:
LPUARTx->CTRL |= LPUART_CTRL_PE_MASK;
LPUARTx->CTRL &= ~LPUART_CTRL_PT_MASK;
break;
case kUART_ParityOdd:
LPUARTx->CTRL |= LPUART_CTRL_PE_MASK;
LPUARTx->CTRL |= LPUART_CTRL_PT_MASK;
break;
default:
break;
}
/* enable Tx Rx */
LPUARTx->CTRL |= (LPUART_CTRL_RE_MASK | LPUART_CTRL_TE_MASK);
/* link debug instance */
/* if it's first initalized ,link getc and putc to it */
if(is_fitst_init)
{
UART_DebugInstance = UART_InitStruct->instance;
}
is_fitst_init = false;
}
跪求解答
如果身边有示波器方便测量的话,可以发送0xAA或0x55用示波器测一下波特率准不准。 FSL_TICS_Robin 发表于 2015-10-21 14:15
如果身边有示波器方便测量的话,可以发送0xAA或0x55用示波器测一下波特率准不准。 ...
就是现在没有示波器 谭春林 发表于 2015-10-21 15:06
就是现在没有示波器
那请问参考的是哪里的例程,是否有使用KSDK1.3.0里的例程呢? FSL_TICS_Robin 发表于 2015-10-21 16:03
那请问参考的是哪里的例程,是否有使用KSDK1.3.0里的例程呢?
不是,是上次微信活动那个板子的资料http://bbs.elecfans.com/jishu_515735_1_1.html 谭春林 发表于 2015-10-21 15:06
就是现在没有示波器
设置成其他波特率后,在debug时,比较一下LPUART0_BAUD中数值是否与自己手动计算的相符
页:
[1]