|
在使用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[UART_InitStruct->instance];
/* enable clock gate */
*((uint32_t*) SIM_LPUARTClockGateTable[UART_InitStruct->instance].addr) |= SIM_LPUARTClockGateTable[UART_InitStruct->instance].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;
}
跪求解答
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|