搜索
bottom↓
回复: 5

KL27串口的其他波特率用不了

[复制链接]

出200入429汤圆

发表于 2015-10-21 13:49:09 | 显示全部楼层 |阅读模式
在使用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来反美的!

出0入0汤圆

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

出200入429汤圆

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

就是现在没有示波器

出0入0汤圆

发表于 2015-10-21 16:03:23 | 显示全部楼层
谭春林 发表于 2015-10-21 15:06
就是现在没有示波器

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

出200入429汤圆

 楼主| 发表于 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

出0入0汤圆

发表于 2015-10-26 10:15:05 | 显示全部楼层
谭春林 发表于 2015-10-21 15:06
就是现在没有示波器

设置成其他波特率后,在debug时,比较一下LPUART0_BAUD[SBR]中数值是否与自己手动计算的相符
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 11:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表