请选择 进入手机版 | 继续访问电脑版
查看: 7429|回复: 6

[S32] S32K144 UART模块调试,接收中断一直循环执行,无法跳出

[复制链接]
  • TA的每日心情
    慵懒
    2023-4-20 13:11
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    2

    主题

    14

    帖子

    0

    注册会员

    Rank: 2

    积分
    139
    最后登录
    2023-4-20
    发表于 2018-12-18 17:27:35 | 显示全部楼层 |阅读模式
          最近在调试S32K144的UART模块功能,使用的硬件是NXP官方的EVB,软件是S32DS 2018,在SDK的Demo样例中稍作更改,想要实现在接收的回掉函数中接收数据,可是测试后发现,一旦通过电脑的串口助手向单片机发送信息后,就会执行回掉函数中的函数,且一直循环执行。小弟新接触S32K系列的芯片,有很多地方不懂,希望各位大哥大姐们在闲暇之余帮助一下小弟,万分感谢。下面是我写的代码。PS 基础配置为 UART0,RX管脚为PTA2,TX管脚为PTA3


    uint8_t data[6]={0xAA,0xBB,0xCC,0,0,0};
      uint8_t dat[8]={0x01,0x02,0x03,0x04,0,0,0,0};
      uint8_t Buffer;
      uint8_t buffer[255]         =        {0,};
      uint8_t  i = 0;
      uint32_t bytesRemaining;
      void RXCallBack(void*driverState,uart_event_t event,void*userData)
      {
              LPUART1->CTRL&=~LPUART_CTRL_RIE_MASK;
              LPUART_DRV_ReceiveData(INST_LPUART1, &Buffer, 1UL);
              if(event==UART_EVENT_RX_FULL)
              {
              if(Buffer==0xAA)
                           {
                                   PINS_DRV_TogglePins(PTD,(1<<15));
                                   while(LPUART_DRV_GetTransmitStatus(INST_LPUART1, &bytesRemaining) != STATUS_SUCCESS);
                                   LPUART_DRV_SendData(INST_LPUART1, dat, 8);
                                   i=0;
                           }

              }
      }
    int main(void)
    {


      #ifdef PEX_RTOS_INIT
        PEX_RTOS_INIT();                   /* Initialization of the selected RTOS. Macro is defined by the RTOS component. */
      #endif
      /*** End of Processor Expert internal initialization.                    ***/

      /* Write your code here */
      /* For example: for(;;) { } */
        CLOCK_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT,
                        g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT);
         CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_AGREEMENT);
         PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr);
         LPUART_DRV_Init(INST_LPUART1, &lpuart1_State, &lpuart1_InitConfig0);
         while(LPUART_DRV_GetTransmitStatus(INST_LPUART1, &bytesRemaining) != STATUS_SUCCESS);
         LPUART_DRV_SendData(INST_LPUART1, data, 6);
         INT_SYS_EnableIRQ(LPUART0_RxTx_IRQn);
         LPUART_DRV_ReceiveData(INST_LPUART1, &Buffer, 1UL);
         LPUART_DRV_InstallRxCallback(INST_LPUART1,RXCallBack,NULL);
         while (1)
            {

            }

    我知道答案 目前已有6人回答
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-6-4 10:16
  • 签到天数: 47 天

    [LV.5]常住居民I

    3

    主题

    114

    帖子

    15

    中级会员

    Rank: 3Rank: 3

    积分
    280
    最后登录
    2019-6-4
    发表于 2018-12-18 19:26:55 | 显示全部楼层
    我也是刚开始搞,记得当时搞lin时看过一段串口的函数。建议去掉回调中的串口发送函数,因为楼主打开的是发送和接收中断。

    评分

    参与人数 1 +1 收起 理由
    NXP管管 + 1

    查看全部评分

    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2023-4-20 13:11
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    2

    主题

    14

    帖子

    0

    注册会员

    Rank: 2

    积分
    139
    最后登录
    2023-4-20
     楼主| 发表于 2018-12-19 09:09:33 | 显示全部楼层
    weekbbg 发表于 2018-12-18 19:26
    我也是刚开始搞,记得当时搞lin时看过一段串口的函数。建议去掉回调中的串口发送函数,因为楼主打开的是发 ...

    没有效果,我之前去掉发送函数也会一直循环下去,而且我将循环函数中多余的语句去掉,只保留接受函数和变换PTD15这个指示灯状态的函数,如下
    void RXCallBack(void*driverState,uart_event_t event,void*userData)
      {
              LPUART1->CTRL&=~LPUART_CTRL_RIE_MASK;
              LPUART_DRV_ReceiveData(INST_LPUART1, &Buffer, 1UL);
          //num=1;
              //if(event==UART_EVENT_RX_FULL)
              //{
                      PINS_DRV_TogglePins(PTD,(1<<15));
    发现只要通过电脑发送串口指令,灯就会一直点亮,而不是每次发送一段指令,灯切换一次状态,同时我又写入了一个变量num作为标识符,希望在进入中断后改变标识符的值,从而进入主函数中控制的函数,如下
    void RXCallBack(void*driverState,uart_event_t event,void*userData)
      {
              LPUART1->CTRL&=~LPUART_CTRL_RIE_MASK;
              LPUART_DRV_ReceiveData(INST_LPUART1, &Buffer, 1UL);
          num=1;

    while (1)
            {
                  if(num==1)
                  {
                          PINS_DRV_TogglePins(PTD,(1<<16));
                          num=0;
                  }
            }
    我发现无法执行主函数中的函数,而在之前的LED切换函数已经证明可以进入中断函数,所以我判断是否是进入中断函数后无法跳出。可能循环执行的说法并不严谨,只是知道现在这种情况,不知道怎么办了。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-6-4 10:16
  • 签到天数: 47 天

    [LV.5]常住居民I

    3

    主题

    114

    帖子

    15

    中级会员

    Rank: 3Rank: 3

    积分
    280
    最后登录
    2019-6-4
    发表于 2018-12-19 12:11:36 | 显示全部楼层
    a7uwrrlq 发表于 2018-12-19 09:09
    没有效果,我之前去掉发送函数也会一直循环下去,而且我将循环函数中多余的语句去掉,只保留接受函数和变 ...

    while(1)后肯定出不了中断了。CallBack中只做接收处理,上位机串口一次只发送一个字节,然后debug看看,通过寄存器查看状态标志,看看中断标志有没有清除。如果状态寄存器都对,看看还进中断不?如果不进,上位机再发送一个字节试试。

    评分

    参与人数 1 +1 收起 理由
    NXP管管 + 1

    查看全部评分

    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2023-4-20 13:11
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    2

    主题

    14

    帖子

    0

    注册会员

    Rank: 2

    积分
    139
    最后登录
    2023-4-20
     楼主| 发表于 2018-12-19 17:42:02 | 显示全部楼层
    weekbbg 发表于 2018-12-19 12:11
    while(1)后肯定出不了中断了。CallBack中只做接收处理,上位机串口一次只发送一个字节,然后debug看看 ...

    可能我说的不太清楚,while(1)循环是我主函数中的,我想表达的意思是当执行中断函数后就无法在回到主函数中执行while(1)中的函数。经过您的提醒后,我试着进行断点调试检测寄存器状态,发现当我使用标识符清除语句 LPUART0->CTRL&=~LPUART_CTRL_RIE_MASK后,如下标注情况
              void RXCallBack(void*driverState,uart_event_t event,void*userData)
      {
              LPUART0->CTRL&=~LPUART_CTRL_RIE_MASK;//RIE位置0
              LPUART_DRV_ReceiveData(INST_LPUART1, &Buffer, 1UL);//查看后RIE位为0
              PINS_DRV_TogglePins(PTD,(1<<15));//查看后RIE位为1
    程序一直在中断函数中的这三个语句进行循环,所以我怀疑是否是接受数据缓冲区内有数据残留致使程序认为一直接收了数据,产生了中断,不太明白。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-6-4 10:16
  • 签到天数: 47 天

    [LV.5]常住居民I

    3

    主题

    114

    帖子

    15

    中级会员

    Rank: 3Rank: 3

    积分
    280
    最后登录
    2019-6-4
    发表于 2018-12-19 18:26:34 | 显示全部楼层
    a7uwrrlq 发表于 2018-12-19 17:42
    可能我说的不太清楚,while(1)循环是我主函数中的,我想表达的意思是当执行中断函数后就无法在回到主函 ...

    只发送一次,然后一直在中断中的话,那么应该是中断标志没有清除
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2023-4-20 13:11
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    2

    主题

    14

    帖子

    0

    注册会员

    Rank: 2

    积分
    139
    最后登录
    2023-4-20
     楼主| 发表于 2018-12-20 14:51:16 | 显示全部楼层
    weekbbg 发表于 2018-12-19 18:26
    只发送一次,然后一直在中断中的话,那么应该是中断标志没有清除

    虽然不知道什么原理,但现在可以正常使用中断函数了,在中断函数中没有特意的清除标志位,而是换了一种读取串口值的函数。直接判断接受数据满标志位的状态,数据全部读取后,将接受到的数据从数据寄存器中读出来,中断函数的代码如下
      void RXCallBack(void*driverState,uart_event_t event,void*userData)
    {
              
                {
                           if((LPUART0->STAT&LPUART_STAT_IDLE_MASK)==LPUART_STAT_IDLE_MASK)
                            {
                                    LPUART0->STAT|=LPUART_STAT_IDLE_MASK;
                            }
                            if((LPUART0->STAT&LPUART_STAT_RDRF_MASK)==LPUART_STAT_RDRF_MASK)
                                                            {
                                                                         Buffer=LPUART0->DATA;
                                                            
                                                            }
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-3-29 15:46 , Processed in 0.132814 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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