打印

请问我的KL25的UART1、UART2哪里有问题?

[复制链接]
1749|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
em78447|  楼主 | 2015-2-6 10:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 em78447 于 2015-2-9 08:19 编辑

    我使用PTD6、7为UART0,PTE0、PTE1为UART1,PTE22、23为UART2。然后我分别给三个串口发出0x55,期望获得高低相间的电平。
    结果示波器测试,UART0可以,而1、2一直是3.3V高电平。请问是怎么回事?

    我的步骤是:打开总线时钟、打开UART1和PTE0、1的SIM使能、暂关闭UART1收发,设置波特率、设置串口为8位无校验模式,清除标志,启动收发。请问还需要做什么?




    我是用的苏州大学红皮书《嵌入式技术基础与实践(第3版)》第6章里的那个初始化函数。只是在1、2里添加了一句
SIM_SOPT2 |= SIM_SOPT2_CLKOUTSEL(0x02);   //选择总线时钟
    并修改了管脚为PTE0、1、22、23使能

    我仿真观察寄存器,U0的C1、C2、C3、C4、C5为0、0x0c、0、0x0f、0
    U1的依次为0、0x0c、0、0、0。U2的一样。
   也就是U1、2的,与U0的只是过采样率不同。其他配置一样。U0选择MCGPLL,U1、2选择BUSCLK。   


相关帖子

沙发
em78447|  楼主 | 2015-2-6 10:42 | 只看该作者
本帖最后由 em78447 于 2015-2-6 13:41 编辑

int main(void)
{
...略
    sys_init();   //获得总线时钟(参考第13章)
...略
//7、UART2(PTE22、PTE23)DGUS屏
    uart_init(UART_0,MCGPLL,9600);  //(参考第6章)
    uart_init(UART_1,BUSCLK,9600);   
    uart_init(UART_2,BUSCLK,9600);

//开中断   
    irq_enable(12);  //UART0
    irq_enable(13);  //UART1
    irq_enable(14);  //UART2     
    irq_on();        //开总中断
    while(1)
    {
...略
        UART0_D=0x55;
        UART1_D=0x55;         
        UART2_D=0xaa;
    }            
    return 0;   

}


void  uart_init(uint8 uartNo,uint32 sel_clk,uint32 baud_rate)
{
...略
    if(uartNo==0)
    {
...略
    }
    else     
    {
            SIM_SOPT2 |= SIM_SOPT2_CLKOUTSEL(0x02);   //选择总线时钟(这是我添加的一句)
        switch (uartNo)
        {
            case UART_1:
                 SIM_SCGC5 |= SIM_SCGC5_PORTE_MASK; //系统集成模块,PTE时钟打开
                 PORTE_PCR0 |= PORT_PCR_MUX(0x3);   //使能UART1_TXD
                 PORTE_PCR1 |= PORT_PCR_MUX(0x3);   //使能UART1_RXD
                 SIM_SCGC4 |= SIM_SCGC4_UART1_MASK; //启动串口1时钟
                 break;
            case UART_2:
                     SIM_SCGC5 |= SIM_SCGC5_PORTE_MASK;  //系统集成模块,PTE时钟打开
                 PORTE_PCR22 |= PORT_PCR_MUX(0x4);   //使能UART2_TXD
                 PORTE_PCR23 |= PORT_PCR_MUX(0x4);   //使能UART2_RXD
                 SIM_SCGC4 |= SIM_SCGC4_UART2_MASK;  //启动串口2时钟
                 break;
            default:
                 break;  //传参错误,返回
        }

         //暂时关闭串口1、2发送与接收功能  
        uartch2->C2 &= ~(UART_C2_TE_MASK | UART_C2_RE_MASK);

        //配置波特率,KL25串口1、2时钟频率只能使用 Bus clock = 24M 总线时钟
        //配置串口工作模式,8位无校验模式
        uartch2->C1 = 0;         
//        sbr = (uint16)((BUS_CLK_KHZ*1000)/(baud_rate * 16));
        sbr = (uint16)((24000*1000)/(9600 * 16));        
        temp = (UART_BDH_REG(uartch2) &(~UART_BDH_SBR(0x1F)));
        UART_BDH_REG(uartch2) = (temp |  UART_BDH_SBR(((sbr & 0x1F00) >> 8)));
        UART_BDL_REG(uartch2) = (uint8)(sbr & UART_BDL_SBR_MASK);
                  
        //初始化控制寄存器、清标志位
        uartch2->C1 = 0x00;
        uartch2->C3 = 0x00;
        uartch2->S1 = 0x1F;
        uartch2->S2 = 0x00;                     
        //启动发送接收
        uartch2->C2 |= (UART_C2_TE_MASK | UART_C2_RE_MASK);        
    }
}

使用特权

评论回复
板凳
em78447|  楼主 | 2015-2-9 08:23 | 只看该作者
还是来请教学习的。

使用特权

评论回复
地板
黑侠豆丁丁| | 2015-3-6 14:54 | 只看该作者
为什么你发送串口数据不加入等待发送为空的语句。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

1

粉丝