查看: 8806|回复: 4

[S32] S32K144软件问题请教。

[复制链接]

该用户从未签到

8

主题

20

帖子

0

注册会员

Rank: 2

积分
109
最后登录
2020-10-19
发表于 2019-11-19 14:34:13 | 显示全部楼层 |阅读模式
各位大侠,有两个问题请教啊!
1.在用S32K这个片子,在用仿真器调试CAN的时候,总是不能正确的接收。跑着跑着好像就没反应了,暂停程序后,程序一般都停在下图这个位置。不知道是什么原因啊?
2.CAN接收程序,需要周期接收数据,也是在CAN接收中断里接收吗?还是说可以直接在周期中断里写CAN接收代码就可以了?比如下面这段代码放在100ms定时中断里有没有问题?
  CAN_ConfigRxBuff(&can_pal0_instance, CAN0_RX_Temp_MAILBOX, &buffCfg, CAN0_RX_Temp_ID);
           /* 定义接收缓冲区 */
           can_message_t recvMsg;
           /* 开始接收数据. */
           CAN_Receive(&can_pal0_instance, CAN0_RX_Temp_MAILBOX, &recvMsg);
           /* 等待,直到前一个FlexCAN接收完成 */
           //while(CAN_GetTransferStatus(&can_pal0_instance, CAN0_RX_BattInfo1_MAILBOX) == STATUS_BUSY);
           if(0x18C2EFF3==recvMsg.id)
           {
                   for(i=0;i<CAN0_RECV_MAX_NUM;i++)
                   {
                            RX_Temp_Buffer.all[i]=recvMsg.data[i];
                    }



最佳答案

CAN接收数据通常不建议在定时中断中接收,而且长达100ms,数据量大的话大概率丢失数据。直接在CAN接收中断中处理即可。
CAN.png
回复

使用道具 举报

  • TA的每日心情
    无聊
    昨天 11:00
  • 签到天数: 2406 天

    连续签到: 3 天

    [LV.Master]伴坛终老

    56

    主题

    5306

    帖子

    73

    金牌会员

    Rank: 6Rank: 6

    积分
    25993
    最后登录
    2025-8-26
    发表于 2019-11-19 17:38:06 | 显示全部楼层
    触发DefaultISR中断大概率是触发了硬件故障中断(不一定真的是硬件问题),可以使用如下方式查找
    重新定义DefaultISR,便于设置断点。定义HardFault_Handler,捕获硬件故障。在函数中增加如下代码,最后调用getStackFrame函数,出现异常后查看pc寄存器的值。通过map文件查找具体问题出现在代码的位置。基本都可以查找到问题所在。如果实在找不到问题,可以考虑使用SystemSoftwareReset对系统进行软复位。


    /**********************************************************************************************************
    *函 数 名: DefaultISR
    *功能说明: 系统默认中断服务函数,主要是用来处理可能产生的错误中断
    *形    参: 无
    *返 回 值: 无
    **********************************************************************************************************/
    void DefaultISR(void)

    {
       #define VECTORNUM                     (*(volatile uint8_t*)(0xE000ED04))
       printf("\n****default_isr entered on vector %d*****\r\n\n", VECTORNUM);
       return;
    }
    /**********************************************************************************************************
    *函 数 名: HardFault_Handler
    *功能说明: 系统硬件故障处理函数,当系统产生硬件故障时,会由次函数处理,目前的处理方式是系统软复位
    *形    参: 无
    *返 回 值: 无
    **********************************************************************************************************/
    void HardFault_Handler(void)
    {
            // LR provides information of the return stack PSP/MSP
            __asm("MOVS R0, #4");
            __asm("MOV R1, LR");
            __asm("TST R0, R1");
            __asm("BEQ _MSP");
            __asm("MRS R0, PSP");
            __asm("B getStackFrame");
            __asm("_MSP:");
            __asm("MRS R0, MSP");
            __asm("B getStackFrame");
           
       //SystemSoftwareReset();
       return;
    }

    /**********************************************************************************************************
    *函 数 名: getStackFrame
    *功能说明: 获取栈指针函数,当系统有异常中断产生时,通过此函数获取导致异常的指令所在地址,便于查找引起异常中断的代码。
    *形    参: 栈指针
    *返 回 值: 无
    **********************************************************************************************************/
    uint32_t r0;
    uint32_t r1;
    uint32_t r2;
    uint32_t r3;
    uint32_t r12;
    uint32_t lr;
    uint32_t pc;
    uint32_t psr;
    void getStackFrame(uint32_t *stackFrame)
    {
            r0  = stackFrame[0];
            r1  = stackFrame[1];
            r2  = stackFrame[2];
            r3  = stackFrame[3];
            r12 = stackFrame[4];
            lr  = stackFrame[5];
            pc  = stackFrame[6];//程序计数器(pc)保存导致异常的指令的地址。
            psr = stackFrame[7];
            __asm("BKPT");  //断点中断指令
    }


    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    昨天 11:00
  • 签到天数: 2406 天

    连续签到: 3 天

    [LV.Master]伴坛终老

    56

    主题

    5306

    帖子

    73

    金牌会员

    Rank: 6Rank: 6

    积分
    25993
    最后登录
    2025-8-26
    发表于 2019-11-19 17:42:18 | 显示全部楼层
    CAN接收数据通常不建议在定时中断中接收,而且长达100ms,数据量大的话大概率丢失数据。直接在CAN接收中断中处理即可。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8

    主题

    20

    帖子

    0

    注册会员

    Rank: 2

    积分
    109
    最后登录
    2020-10-19
     楼主| 发表于 2019-11-20 09:19:35 | 显示全部楼层
    Angel_YY 发表于 2019-11-19 17:42
    CAN接收数据通常不建议在定时中断中接收,而且长达100ms,数据量大的话大概率丢失数据。直接在CAN接收中断 ...

    非常感谢您的耐心解答,小弟不盛感激!!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    新手上路

    Rank: 1

    积分
    9
    最后登录
    2025-7-1
    发表于 2025-6-27 16:31:21 | 显示全部楼层
    Angel_YY 发表于 2019-11-19 17:38
    触发DefaultISR中断大概率是触发了硬件故障中断(不一定真的是硬件问题),可以使用如下方式查找
    重新定义D ...

    您好,请问 getStackFrame里面参数应该放什么呢?
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-27 05:30 , Processed in 0.097894 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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