查看: 3742|回复: 11

[已解决] 请教KL25--UART0不工作的原因。。。[已解决]

[复制链接]
  • TA的每日心情

    2018-3-21 13:20
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    16

    主题

    124

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    249
    最后登录
    2023-10-24
    发表于 2015-9-14 12:40:31 | 显示全部楼层 |阅读模式
    本帖最后由 zico1998 于 2015-9-14 19:15 编辑

    我找到原因了:UART0要用FLL、PWM要用PLL。他俩打架了。。。UART0改用别的MCGIRCLK
    下面是原来求助贴
    ----

    我的UART1、2工作正常,但0不工作。我换了块板子,也一样。
    仿真调试,即不进接收中断,判断发送时S1标志位寄存器为0,发送也不成。
    请问,可能是什么原因呢?



    //我晶振是4M的,参考苏大的8M晶振下时钟初始化里程序,只对MCG_C1、MCG_C6分频相应的修改下分频参数。
    //内核时钟设置
    void clk_init(void)
    {
        uint32 i = 0;
    uint8 t_reg = 0;
        MCG_C2 = (MCG_C2_RANGE0(1) | MCG_C2_EREFS0_MASK);
        MCG_C1 = (MCG_C1_CLKS(2) |  MCG_C1_FRDIV(2));   //这里苏大红皮书里8M外晶振、MCG_C1_FRDIV=3,分频
        for (i=0;i<20000;i++)
        {
            if (MCG_S & MCG_S_OSCINIT0_MASK)
            {         
             break;
            }         
        }
        for (i=0;i<2000;i++)
        {
            if (!(MCG_S & MCG_S_IREFST_MASK))
            {         
             break;
            }         
        }
        for (i=0;i<2000;i++)
        {
            if (0x02 == ((MCG_S & MCG_S_CLKST_MASK) >> MCG_S_CLKST_SHIFT))
            {
             break;
            }
        }
        MCG_C6 |= MCG_C6_CME0_MASK; //使能时钟监视器
        MCG_C5 |= MCG_C5_PRDIV0(1);  
        //MCG_C5 |= MCG_C5_PRDIV0(0); //PLL分频
        t_reg = MCG_C6; //存储当前C6的值(因为CME0位之前被置位了)
        t_reg &= ~MCG_C6_VDIV0_MASK; //将VDIV清0
        t_reg |= MCG_C6_PLLS_MASK | MCG_C6_VDIV0(0x18);
        MCG_C6 = t_reg;
        for (i=0;i<2000;i++)
        {
            if (MCG_S & MCG_S_PLLST_MASK)
            {         
             break;
            }         
        }
        for (i=0;i<4000;i++)
        {
            if (MCG_S & MCG_S_LOCK0_MASK)
            {         
             break;
            }         
        }
        SIM_CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(1) | SIM_CLKDIV1_OUTDIV4(1) );
        MCG_C1 &= ~MCG_C1_CLKS_MASK;
        for (i=0;i<2000;i++)
        {
            if (0x03==((MCG_S & MCG_S_CLKST_MASK) >> MCG_S_CLKST_SHIFT))
            {      
             break;
            }         
        }
    }



    //UART0初始化
        uint16 u_sbr;
        uint32 clk_Khz;
        SIM_SOPT2 |= SIM_SOPT2_UART0SRC(0x01);  //UART0选择MCGFLLCLK_khz=48MHz时钟源
        SIM_SOPT2 |= SIM_SOPT2_PLLFLLSEL_MASK;
        SIM_SCGC5 |= SIM_SCGC5_PORTD_MASK;  //引脚复用为串口功能并启用串口模块时钟  系统集成模块,PTD时钟打开
        PORTD_PCR7 |= PORT_PCR_MUX(0x3);    //使能UART0_TXD (PTD7)
        PORTD_PCR6 |= PORT_PCR_MUX(0x3);    //使能UART0_RXD (PTD6)   
        SIM_SCGC4 |= SIM_SCGC4_UART0_MASK;  //启动串口0时钟   SIM_SCGC4:0 0 UART2 UART1 UART0 0 I2C1 I2C0 1 0   
        UART0_C2 &= ~(UART_C2_TE_MASK | UART_C2_RE_MASK);  //暂时关闭串口0发送与接收功能  
       
        clk_Khz = MCGPLL_CLK_KHZ; //48000
        u_sbr = 313;   //(uint16)((clk_Khz*125)/(baud_rate * 2));  //配置串口波特率,
        temp = UART_BDH_REG(uartch1) & (~UART_BDH_SBR(0x1F));
        UART_BDH_REG(uartch1) = temp |  UART_BDH_SBR(((u_sbr & 0x1F00) >> 8));
        UART_BDL_REG(uartch1) = (uint8)(u_sbr & UART_BDL_SBR_MASK);
        UART0_C4 = 0x0F;            //初始化控制寄存器,8位无校验模式,清标志位
        UART0_C1 = 0x00;
        UART0_C3 = 0x00;
        UART0_MA1 = 0x00;
        UART0_MA2 = 0x00;
        UART0_S1 |= 0x1F;           //低5位全1,
        UART0_S2 |= 0xC0;   
        UART0_C2 |= (UART_C2_TE_MASK | UART_C2_RE_MASK); //启动发送与接收
        UART0_C2 |= (UART_C2_RIE_MASK);          //READ 中断使能,暂时没加TIE的,以后加   



    //串口发
        if((UART0_S1 & UART_S1_TDRE_MASK) || (UART0_S1 & UART_S1_TC_MASK)) //判断发送缓冲区是否为空
        {
            UART0_D = 0x55;   
        }  


    我知道答案 目前已有11人回答
    我今天最想说
    回复

    使用道具 举报

  • TA的每日心情
    难过
    2016-12-1 10:25
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    12

    主题

    164

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    336
    最后登录
    2020-1-23
    发表于 2015-9-14 13:48:44 | 显示全部楼层
    小白帮顶,我也不懂。飞丝卡尔没有库吗?都要自己操作寄存器的说?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2018-3-21 13:20
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    16

    主题

    124

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    249
    最后登录
    2023-10-24
     楼主| 发表于 2015-9-14 14:25:17 | 显示全部楼层
    我用PE试了一下,PE可以让UART0正常运行
    我今天最想说
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    124

    主题

    3600

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5781
    最后登录
    1970-1-1
    发表于 2015-9-14 14:28:24 | 显示全部楼层
    adersonl 发表于 2015-9-14 13:48
    小白帮顶,我也不懂。飞丝卡尔没有库吗?都要自己操作寄存器的说?

    有啊,建议使用KSDK1.2,调用那个参数直接修改参数就可以啊,里面就有KL25
    https://www.freescale.co
    m/zh-H ... is-mcus:KINETIS-SDK
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    124

    主题

    3600

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5781
    最后登录
    1970-1-1
    发表于 2015-9-14 14:38:05 | 显示全部楼层
    建议直接采用FRDM-KL25的例程,不需要额外的编程,只需要freedom.h文件中,修改以下两个宏定义
    既可以选择对应的UART和波特率
    https://www.freescale.co
    m/zh-H ... ab=Design_Tools_Tab

    #define TERM_PORT_NUM       0
    #define TERMINAL_BAUD       115200
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2018-3-21 13:20
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    16

    主题

    124

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    249
    最后登录
    2023-10-24
     楼主| 发表于 2015-9-14 15:02:35 | 显示全部楼层
    谢谢呀。。。。
    我今天最想说
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2022-3-3 09:56
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    106

    主题

    836

    帖子

    4

    金牌会员

    Rank: 6Rank: 6

    积分
    1527
    最后登录
    2023-6-12
    发表于 2015-9-14 15:25:42 | 显示全部楼层
    PE可以的话,那就是你的初始化不问题吧。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2018-3-21 13:20
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    16

    主题

    124

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    249
    最后登录
    2023-10-24
     楼主| 发表于 2015-9-14 15:31:19 | 显示全部楼层
    jinyi7016 发表于 2015-9-14 15:25
    PE可以的话,那就是你的初始化不问题吧。


    是呀,这样也排除了电路上的可能。我把自己程序里换成了PE的时钟初始化。然后UART1、2可行,就是UART0还不行,我就查找UART0初始化(主贴里贴出的那段)问题。。。。
    我今天最想说
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2015-9-14 15:45:53 | 显示全部楼层
    UART0_S1 |= 0x1F;  不用初始化状态寄存器,自动处理的。
    S2同样不处理
    UART0_MA1 = 0x00;
    UART0_MA2 = 0x00; 不用设置

    建议参考PE可以使用串口0的代码做对比,精简串口配置。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2018-3-21 13:20
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    16

    主题

    124

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    249
    最后登录
    2023-10-24
     楼主| 发表于 2015-9-14 19:12:50 | 显示全部楼层
    谢谢楼上的!!!!
    我找到原因了:
    UART0使用MCGFLLCLK,而我又开个了PWM的,要用PLL。。。。。俩打架了
    可找了两天!
    我今天最想说
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-28 17:35 , Processed in 0.100786 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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