查看: 8483|回复: 21

[求助] 使用KDS的PE配置CAN报文时如何关闭发送中断?

[复制链接]
  • TA的每日心情
    开心
    2020-8-14 22:47
  • 签到天数: 608 天

    连续签到: 1 天

    [LV.9]以坛为家II

    26

    主题

    1169

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3009
    最后登录
    2020-9-13
    发表于 2017-4-15 23:21:14 | 显示全部楼层 |阅读模式
    本帖最后由 小刀十六式 于 2017-4-15 23:49 编辑

    1)在使用KEA128的KDS配置CAN1时,如何配置CAN的发送中断失能呢?我不想在发送中断里发送报文!

    2)补充下。除了自己写delay外,FTM配置外。还有没有利用SysTick进行延时设置的?
    我知道答案 目前已有21人回答
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25450
    最后登录
    2025-9-4
    发表于 2017-4-17 09:30:17 | 显示全部楼层
    楼主你好,回答你的两个问题:
    1)在使用KEA128的KDS配置CAN1时,如何配置CAN的发送中断失能呢?我不想在发送中断里发送报文!
    答:请查看这个帖子里面我回答并添加的附件
    http://community.nxp.com/thread/379133
    这个就是用PE的模块,然后使能中断的例程。
    如果你不想用中断的话,你可以选中左边框中CAN_LDD,右击鼠标,然后help on component,选中典型应用。
    Sending data frame without interrupt service (polling)
    The following example demonstrates sending a data frame with standard ID and extended ID.

    OnFreeTxBuffer event is called when a frame is successfully transmitted and returns buffer index (in this case 0), which was send.

    Required component setup :


    Content of ProcessorExpert.c:
    volatile bool DataFrameTxFlg;LDD_TDeviceData *MyCANPtr;LDD_TError Error;LDD_CAN_TFrame Frame;uint8_t OutData[4] = {0x00U, 0x01U, 0x02U, 0x03U};                /* Initialization of output data buffer */void main(void){  . . .  MyCANPtr = CAN2_Init(NULL);                                     /* Initialization of CAN2 component */      Frame.MessageID = 0x123U;                                       /* Set Tx ID value - standard */    Frame.FrameType = LDD_CAN_DATA_FRAME;                           /* Specyfying type of Tx frame - Data frame */  Frame.Length = sizeof(OutData);                                 /* Set number of bytes in data frame - 4B */  Frame.Data = OutData;                                           /* Set pointer to OutData buffer */  DataFrameTxFlg = FALSE;                                         /* Initialization of DataFrameTxFlg */  Error = CAN2_SendFrame(MyCANPtr, 0U, &Frame);                   /* Sends the data frame over buffer 0 */   while (!DataFrameTxFlg) {                                       /* Wait until data frame is transmitted */    CAN2_Main(MyCANPtr);    }  . . .  Frame.MessageID = (0x123456U | LDD_CAN_MESSAGE_ID_EXT);         /* Set Tx ID value - extended */    Frame.FrameType = LDD_CAN_DATA_FRAME;                           /* Specyfying type of Tx frame - Data frame */  Frame.Length = sizeof(OutData);                                 /* Set number of bytes in data frame - 4B */  Frame.Data = OutData;                                           /* Set pointer to OutData buffer */  DataFrameTxFlg = FALSE;                                         /* Clear DataFrameTxFlg */  Error = CAN2_SendFrame(MyCANPtr, 0U, &Frame);                   /* Sends the data frame over buffer 0 */   while (!DataFrameTxFlg) {                                       /* Wait until data frame is transmitted */    CAN2_Main(MyCANPtr);    }  . . .        for(;;) {}}
    Content of Event.c:
    extern volatile bool DataFrameTxFlg;void CAN2_OnFreeTxBuffer(LDD_TUserData *UserDataPtr, LDD_CAN_TMBIndex BufferIdx){  DataFrameTxFlg = TRUE; /* Set DataFrameTxFlg flag */}
    Receiving data frame without interrupt service (polling)
    The following example demonstrates receiving a frame with standard ID (Initialization over component) and extended ID, what is sets in run time.

    OnFullRxBuffer event is called when a frame is successfully received and returns buffer index (in this case 0), where are data stored.

    Required component setup :


    Content of ProcessorExpert.c:
    volatile bool DataFrameRxFlg = FALSE;LDD_TDeviceData *MyCANPtr;LDD_TError Error;LDD_CAN_TFrame Frame;uint8_t InpData[8];             void main(void){  . . .  MyCANPtr = CAN2_Init(NULL);                                     /* Initialization of CAN2 component */    while (!DataFrameRxFlg) {                                       /* Wait until data frame is received */    CAN2_Main(MyCANPtr);    }  Frame.Data = InpData;                                           /* Set pointer to InpData buffer */  Error = CAN2_ReadFrame(MyCANPtr, 0U, &Frame);                   /* Reads a data frame from buffer 0 and fills Frame structure */       /*       Frame.MessageID => Contains ID value. if((Frame.MessageID & LDD_CAN_MESSAGE_ID_EXT)!=0) then extended ID, else standard ID      Frame.FrameType => Type of Rx frame, e.g. LDD_CAN_DATA_FRAME     Frame.Length => Number of Rx bytes in Rx frame    InpData[]    => Contains Rx data bytes  */  . . .  DataFrameRxFlg = FALSE;                                         /* Clear DataFrameRxFlg */    Error = CAN2_SetRxBufferID(MyCANPtr, 0U, (0x123456U|LDD_CAN_MESSAGE_ID_EXT)); /* Set the new value of the Rx ID for buffer 0 - extended type */  while (!DataFrameRxFlg) {                                       /* Wait until data frame is received */    CAN2_Main(MyCANPtr);    }  Frame.Data = InpData;                                           /* Set pointer to InpData buffer */  Error = CAN2_ReadFrame(MyCANPtr, 0U, &Frame);                   /* Reads a data frame from buffer 0 and fills Frame structure */       /*     Frame.MessageID => Contains ID value. if((Frame.MessageID & LDD_CAN_MESSAGE_ID_EXT)!=0) then extended ID, else standard ID      Frame.FrameType => Type of Rx frame, e.g. LDD_CAN_DATA_FRAME     Frame.Length => Number of Rx bytes in Rx frame    InpData[]    => Contains Rx data bytes  */  . . .        for(;;) {}}
    Content of Event.c:
    extern volatile bool DataFrameRxFlg;void CAN2_OnFullRxBuffer(LDD_TUserData *UserDataPtr, LDD_CAN_TMBIndex BufferIdx){  DataFrameRxFlg = TRUE; /* Set DataFrameRxFlg flag */}
    2)补充下。除了自己写delay外,FTM配置外。还有没有利用SysTick进行延时设置的?
    答,延时可以用所有的定时器实现。如果你要用Systick,当然可以,下面是systick的驱动:
    #include "common.h"
    #include "systick.h"
    uint32_t cnt_start_value;
    uint32_t cnt_end_value;
    uint32_t overhead;
    #if 0
      __IO uint32_t CTRL;                    /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */
      __IO uint32_t LOAD;                    /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register       */
      __IO uint32_t VAL;                     /*!< Offset: 0x008 (R/W)  SysTick Current Value Register      */
      __I  uint32_t CALIB;                   /*!< Offset: 0x00C (R/ )  SysTick Calibration Register        */
    #endif
    void systick_init(void)
    {
    SysTick->VAL = 0x0; /* clear current timer value */
        SysTick->LOAD = 0x00FFFFFF;
        SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;   
    }
    void systick_disable(void)
    {
        SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
    }
    void cal_systick_read_overhead(void)
    {
       uint32_t cnt_start_value;
        uint32_t cnt_end_value;

    cnt_start_value = SysTick->VAL;
      
        cnt_end_value = SysTick->VAL;

    overhead = cnt_start_value - cnt_end_value;

    #ifdef DEBUG_PRINT
    printf("systick start value: 0x%x\n\r", (unsigned int)cnt_start_value);
    printf("systick end value: 0x%x\n\r", (unsigned int) cnt_end_value);
    printf("systick current value read overhead: 0x%x\n\r", (unsigned int)overhead);
    #endif
    }


    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-8-14 22:47
  • 签到天数: 608 天

    连续签到: 1 天

    [LV.9]以坛为家II

    26

    主题

    1169

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3009
    最后登录
    2020-9-13
     楼主| 发表于 2017-4-17 14:42:55 | 显示全部楼层
    小恩GG 发表于 2017-4-17 09:30
    楼主你好,回答你的两个问题:
    1)在使用KEA128的KDS配置CAN1时,如何配置CAN的发送中断失能呢?我不想在发 ...

    请问有LIN或者UART的PE历程吗?
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-8-14 22:47
  • 签到天数: 608 天

    连续签到: 1 天

    [LV.9]以坛为家II

    26

    主题

    1169

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3009
    最后登录
    2020-9-13
     楼主| 发表于 2017-4-17 15:07:24 | 显示全部楼层
    小恩GG 发表于 2017-4-17 09:30
    楼主你好,回答你的两个问题:
    1)在使用KEA128的KDS配置CAN1时,如何配置CAN的发送中断失能呢?我不想在发 ...

    1)问下:KDS创建的PE工程不包含 QQ图片20170417150234.png 所以好像也不能调入WFI  WFE吧???
    2)在PE里引用的SKEAZ1284.h头文件丽没有找到相应函数。
    QQ图片20170417150319.png 而且中断向量也发生了改变

    创建的工程如下:

    KEA128.rar

    1.26 MB, 下载次数: 4, 下载积分: 威望 1

    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25450
    最后登录
    2025-9-4
    发表于 2017-4-18 10:20:18 | 显示全部楼层
    小刀十六式 发表于 2017-4-17 14:42
    请问有LIN或者UART的PE历程吗?

    楼主你好!
    UART 的PE你直接用console模块好了,非常简单。
    关于LIN,你可以参考我们的LIN2.X stack:
    http://www.nxp.com/assets/downlo ... L_LIN_2.X_STACK.zip
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-8-14 22:47
  • 签到天数: 608 天

    连续签到: 1 天

    [LV.9]以坛为家II

    26

    主题

    1169

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3009
    最后登录
    2020-9-13
     楼主| 发表于 2017-4-19 08:27:23 | 显示全部楼层
    小恩GG 发表于 2017-4-18 10:20
    楼主你好!
    UART 的PE你直接用console模块好了,非常简单。
    关于LIN,你可以参考我们的LIN2.X stack:

    为什么我在使用SYSTick计时1us时间的时候会不准确?
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25450
    最后登录
    2025-9-4
    发表于 2017-4-19 11:00:45 | 显示全部楼层
    小刀十六式 发表于 2017-4-19 08:27
    为什么我在使用SYSTick计时1us时间的时候会不准确?

    你systick怎么配置的?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-8-14 22:47
  • 签到天数: 608 天

    连续签到: 1 天

    [LV.9]以坛为家II

    26

    主题

    1169

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3009
    最后登录
    2020-9-13
     楼主| 发表于 2017-4-19 12:47:40 | 显示全部楼层
    小恩GG 发表于 2017-4-19 11:00
    你systick怎么配置的?

    第一种用PE:
    1.png

    第二种写寄存器:
    2.png

    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25450
    最后登录
    2025-9-4
    发表于 2017-4-19 13:53:08 | 显示全部楼层

    楼主你好!
    使用Init_SysTick, core时钟为48Mhz, 装载值为47,这样可以得到1us。
    61.jpg
    代码在附件中:
    KEA128_Systick.rar (1.1 MB, 下载次数: 4)
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-8-14 22:47
  • 签到天数: 608 天

    连续签到: 1 天

    [LV.9]以坛为家II

    26

    主题

    1169

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3009
    最后登录
    2020-9-13
     楼主| 发表于 2017-4-19 15:15:22 | 显示全部楼层
    小恩GG 发表于 2017-4-19 13:53
    楼主你好!
    使用Init_SysTick, core时钟为48Mhz, 装载值为47,这样可以得到1us。

    我用的就是40M的时钟,1ms输出没有问题。换成1us输出就是不准!
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-9-6 17:57 , Processed in 0.120283 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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