查看: 4780|回复: 13

[求助] frdm kl02 串口能发送数据,但不能进入中断。

[复制链接]
  • TA的每日心情
    开心
    2016-10-25 10:29
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    15

    主题

    81

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    272
    最后登录
    2019-6-10
    发表于 2016-6-16 15:50:31 | 显示全部楼层 |阅读模式
    本帖最后由 足球爱好者 于 2016-6-16 15:51 编辑

    下面是串口初始化程序,中断函数,发送函数:走过路过的友友,帮忙看看是那里出问题了?

    void UATR0_Init(uint32_t UART_BaudRate)
    {
      uint32_t uartClkSrcFreq;
      uint8_t temp;
      uint16_t sbr;
      //打开时钟
      CLOCK_SetLpsci0Clock(1);//SIM->SOPT2 |=1<<26; //选择时钟源
      CLOCK_EnableClock(kCLOCK_Uart0);//SIM->SCGC4|=1<<10;  //打开串口时钟
      CLOCK_EnableClock(kCLOCK_PortB);//SIM->SCGC5|=1<<10;  //打开端口时钟
      //TX RX配置
      /* Affects PORTB_PCR1 register */
        PORT_SetPinMux(PORTB, 1u, kPORT_MuxAlt2); //PORTB->PCR[1]|=0x10<<8;
        /* Affects PORTB_PCR2 register */
        PORT_SetPinMux(PORTB, 2u, kPORT_MuxAlt2); //PORTB->PCR[2]|=0x10<<8;
      //先禁止收发
      UART0->C2 &= ~(UART0_C2_TE_MASK | UART0_C2_RE_MASK);

      //设置波特率
       //计算SBR值        
      uartClkSrcFreq=CLOCK_GetFllFreq();
      sbr = (uint16_t)((uartClkSrcFreq)/(UART_BaudRate * 16));

      //将计算好的SBR值得高位写进寄存器
      temp = UART0->BDH & ~UART0_BDH_SBR_MASK;  
       UART0->BDH = temp | (uint8_t)(sbr >> 8);

      //将SBR低八位值写进寄存器  
      UART0->BDL = (uint8_t)sbr;

      //5、使能TX RX
      UART0->C2 |= (UART0_C2_TE_MASK | UART0_C2_RE_MASK );

      NVIC_EnableIRQ(UART0_IRQn);     //使能中断
      NVIC_SetPriority(UART0_IRQn,1); //设置中断优先级

    }
    void UART0_IRQHandler(void)
    {
      static unsigned char i=0;
      while (UART0->S1 & UART0_S1_RDRF_MASK)    //接收寄存器已满标志  
      {                        
        UART_RX_Data=UART0->D;
        i++;
      }  
      if(i==Data_Size)
      {
        i=0;
        User_Uart_ReceiveOver_Flag=1;
      }
    }

    void UART_SendData(uint8_t data)
    {
      while(!( (UART0->S1) & UART0_S1_TDRE_MASK));//发送寄存器有数据
      UART0->D = data;               
    }



    我知道答案 目前已有13人回答

    uart.zip

    4.85 MB, 下载次数: 7, 下载积分: 威望 1

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-10-25 10:29
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    15

    主题

    81

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    272
    最后登录
    2019-6-10
     楼主| 发表于 2016-6-16 15:52:22 | 显示全部楼层
    自己先顶顶。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24863
    最后登录
    2025-7-18
    发表于 2016-6-16 15:54:17 | 显示全部楼层
    总中断没有使能:
      #define enable_irq NVIC_EnableIRQ
      #define disable_irq NVIC_DisableIRQ
            #define EnableInterrupts __enable_irq()
            #define DisableInterrupts __disable_irq()
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24863
    最后登录
    2025-7-18
    发表于 2016-6-16 15:54:37 | 显示全部楼层
    __STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
    {
      NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));
    }


    /**
      \brief   Disable External Interrupt
      \details Disables a device-specific interrupt in the NVIC interrupt controller.
      \param [in]      IRQn  External interrupt number. Value cannot be negative.
    */
    __STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn)
    {
      NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));
    }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-10-25 10:29
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    15

    主题

    81

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    272
    最后登录
    2019-6-10
     楼主| 发表于 2016-6-16 16:09:00 | 显示全部楼层
    小恩GG 发表于 2016-6-16 15:54
    __STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
    {
      NVIC->ISER[0U] = (uint32_t)(1UL ICER[0U] = ( ...

    #define enable_irq NVIC_EnableIRQ   
      #define disable_irq NVIC_DisableIRQ
    #define EnableInterrupts __enable_irq()
    #define DisableInterrupts __disable_irq()

    第一 二是打开 关闭相应的中断。
    第三个才是打开总中断吧,但我加进去还是不能中断。

    //打开总中断
      EnableInterrupts;
      
      NVIC_EnableIRQ(UART0_IRQn);     //使能中断
      NVIC_SetPriority(UART0_IRQn,1); //设置中断优先级
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2016-6-17 08:49:24 | 显示全部楼层
    不用看代码的,自己debug一下就知道问题了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24863
    最后登录
    2025-7-18
    发表于 2016-6-17 11:27:24 | 显示全部楼层
    足球爱好者 发表于 2016-6-16 16:09
    #define enable_irq NVIC_EnableIRQ   
      #define disable_irq NVIC_DisableIRQ
    #define EnableInterru ...

    UART0_C2[TIE], [RIE]位置位了吗?
    你代码中没有使能模块寄存器的中断位。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-7-31 10:09
  • 签到天数: 392 天

    连续签到: 1 天

    [LV.9]以坛为家II

    45

    主题

    1338

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3163
    最后登录
    2024-12-27
    发表于 2016-6-17 13:22:03 | 显示全部楼层
    void uart0_init(UART0_MemMapPtr uartch, int uart0clk, int baud)
    {
        register uint16 sbr;
        uint8 temp;
       
    //  SIM_SOPT2 |= SIM_SOPT2_UART0SRC(1); // select the FLLFLLCLK as UART0 clock source
            SIM_SOPT2 |= SIM_SOPT2_UART0SRC(3); // select the MCGIRCLK as UART0 clock source
        SIM_SCGC4 |= SIM_SCGC4_UART0_MASK;        //UART0模块的时钟允许
       
        /* Make sure that the transmitter and receiver are disabled while we change settings */
        UART0_C2_REG(uartch) &= ~(UART0_C2_TE_MASK | UART0_C2_RE_MASK );//配置参数之前必须禁止UART0模块的发送和接收
        UART0_C1_REG(uartch) = 0;                        //8位数据,无效验位
       
        /* Calculate baud settings */
        temp = UART0_C4;
        temp = (temp & UART0_C4_OSR_MASK) + 1;//过采样速率
        sbr = (uint16)((uart0clk)/(baud * (temp)));//计算出需配置的波特率参数
                
        /* Save off the current value of the uartx_BDH except for the SBR field */
        temp = UART0_BDH_REG(uartch) & ~(UART0_BDH_SBR(0x1F));   
        UART0_BDH_REG(uartch) = temp |  UART0_BDH_SBR(((sbr & 0x1F00) >> 8));
        UART0_BDL_REG(uartch) = (uint8)(sbr & UART0_BDL_SBR_MASK);//设置波特率

        UART0_C2_REG(uartch) |= (UART0_C2_TE_MASK | UART0_C2_RE_MASK ); //允许UART0的收和发
        UART0_C2 |= UART0_C2_RIE_MASK;                //允许RIE中断
        UART0_BDH |= UART0_BDH_RXEDGIE_MASK;//允许RX引脚边沿中断
        UART0_S2 |= UART0_S2_RXEDGIF_MASK;
    //    UART0_C2 |= UART0_C2_RIE_MASK+UART0_C2_RWU_MASK;                //允许RIE中断,允许唤醒   
        set_irq_priority((INT_UART0-16), 1);
        enable_irq(INT_UART0 - 16);                        //允许UART0中断
    }

    官方不是有例程吗?可以用啊
    今天天气不错!签到!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-7-31 10:09
  • 签到天数: 392 天

    连续签到: 1 天

    [LV.9]以坛为家II

    45

    主题

    1338

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3163
    最后登录
    2024-12-27
    发表于 2016-6-17 13:23:26 | 显示全部楼层
    拿去用吧,这个我测试过,没问题的
    今天天气不错!签到!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-4-27 08:44
  • 签到天数: 64 天

    连续签到: 1 天

    [LV.6]常住居民II

    26

    主题

    577

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1703
    最后登录
    1970-1-1
    发表于 2016-6-17 15:22:50 | 显示全部楼层
    从楼主代码上来看,uart寄存器只使能了TX,RX,却并没有使用RX的中断,正如8楼的那样,要加上: UART0_C2 |= UART0_C2_RIE_MASK;                //允许RIE中断
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-19 04:52 , Processed in 0.111560 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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