谭春林 发表于 2015-10-21 13:49:09

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;
}

跪求解答

FSL_TICS_Robin 发表于 2015-10-21 14:15:39

如果身边有示波器方便测量的话,可以发送0xAA或0x55用示波器测一下波特率准不准。

谭春林 发表于 2015-10-21 15:06:38

FSL_TICS_Robin 发表于 2015-10-21 14:15
如果身边有示波器方便测量的话,可以发送0xAA或0x55用示波器测一下波特率准不准。 ...

就是现在没有示波器

FSL_TICS_Robin 发表于 2015-10-21 16:03:23

谭春林 发表于 2015-10-21 15:06
就是现在没有示波器

那请问参考的是哪里的例程,是否有使用KSDK1.3.0里的例程呢?

谭春林 发表于 2015-10-21 21:21:23

FSL_TICS_Robin 发表于 2015-10-21 16:03
那请问参考的是哪里的例程,是否有使用KSDK1.3.0里的例程呢?

不是,是上次微信活动那个板子的资料http://bbs.elecfans.com/jishu_515735_1_1.html

FSL_TICS_ZP 发表于 2015-10-26 10:15:05

谭春林 发表于 2015-10-21 15:06
就是现在没有示波器

设置成其他波特率后,在debug时,比较一下LPUART0_BAUD中数值是否与自己手动计算的相符
页: [1]
查看完整版本: KL27串口的其他波特率用不了