打印
[Kinetis]

我的KL25怎么进不了串口中断?

[复制链接]
1532|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zico1998|  楼主 | 2015-3-16 08:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我使用了UART1、PIT中断,PIT正常,可是UART1的,能发送数据,但不进中断,请教是怎么回事?我示波器测试,管脚有数据的波形。

/*****************************kinetis_sysinit.c*****************************/
void UART1_ISR(void)
{
    uint32 tmp;
    tmp=0;       //这里设断点,发现没有进入
    uart1_isr();       
}


......
void UART1_IRQHandler() __attribute__ ((weak, alias("UART1_ISR")));        //UART1




/*****************************main.c*****************************/
int main(void)
{
    sys_init();             //初始化系统时
    sys_pin_enable_port();  //使能端口时钟       
    ......
    uart_init(UART_1,BUSCLK,115200);
    irq_enable(13);  //允许UART1中断
    ......
    asm("CPSIE  i");  //开总中断

    ......
}

uchar uart1_data;
void uart1_isr(void)
{
    asm("CPSID  i"); //关总中断
    if(UART1_S1 & UART_S1_RDRF_MASK)
    {           
            uart1_data=UART1_D;
    }
    asm("CPSIE  i");  //开总中断
}

//这里是移植苏州大学书本里的代码
void  uart_init(uint8 uartNo,uint32 sel_clk,uint32 baud_rate)
{          
    ......
    else
    {
        switch (uartNo)
        {
            case UART_1:
                PORTE_PCR0 = PORT_PCR_MUX(0x3);    //使能UART1_TXD PE0
                PORTE_PCR1 = PORT_PCR_MUX(0x3);    //使能UART1_RXD PE1
                SIM_SCGC4 |= SIM_SCGC4_UART1_MASK; //启动串口1时钟
                break;
            case UART_2:
                PORTE_PCR22 = PORT_PCR_MUX(0x4); //使能UART2_TXD   PE2
                PORTE_PCR23 = PORT_PCR_MUX(0x4); //使能UART2_RXD   PE3
                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 = 24MHz 总线时钟
        //配置串口工作模式,8位无校验模式
        uartch2->C1 = 0;         
        sbr = (uint_16)((BUS_CLK_KHZ*1000)/(baud_rate * 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) = (uint_8)(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);                                  
    }
}

相关帖子

沙发
zico1998|  楼主 | 2015-3-16 11:35 | 只看该作者
已解决

使用特权

评论回复
板凳
ar_m_cu| | 2015-3-16 13:02 | 只看该作者
没开中断吧

使用特权

评论回复
地板
FSL_TICS_ZJJ| | 2015-3-16 14:44 | 只看该作者
本帖最后由 FSL_TICS_ZJJ 于 2015-3-16 14:46 编辑

楼主如果是自行解决了的,欢迎分享自己的解决方案。
你的UART发送接收中断允许使能了没有?

使用特权

评论回复
5
FSL_TICS_Robin| | 2015-3-19 09:51 | 只看该作者

苏大那个KL25的串口中断程序应该没什么问题,都是可以用的。
你也可以参考:手把手学会官方例程第二十篇:Kinetis KL25 UART例程1

非常感谢你关于Kinetis的技术问题。如果你没有其他问题,我们将此帖默认为已解决。

使用特权

评论回复
6
zico1998|  楼主 | 2015-3-30 08:50 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-3-16 14:44
楼主如果是自行解决了的,欢迎分享自己的解决方案。
你的UART发送接收中断允许使能了没有?
...

uartch1->C2 |= (UART_C2_RIE_MASK);

uartch2->C2 |= (UART_C2_RIE_MASK);

没有开启RIE:loveliness:

使用特权

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

本版积分规则

4

主题

36

帖子

0

粉丝