This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS570LC4357:针对 GIO 模式的 CAN3的 HALCoGen 配置。

Guru**** 2532910 points
Other Parts Discussed in Thread: HALCOGEN

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/850805/tms570lc4357-halcogen-configuration-of-can3-for-gio-mode

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

您好!

 我目前在 GIO 模式下使用 CAN 2和3、并使用 HALCoGen 04.07.01配置引脚。

  • 我启用了 CAN 2和 CAN 3驱动器。
  • 已在每个选项卡中查找 CAN2和 CAN 3端口初始化之间的差异。
  • 在每个 Msg 选项卡中没有中断或活动消息框
  • 未选择中断 VIM 通道

在 HCG 生成的文件中,函数 canInit()中的 hl_can.c:

对于 CAN 2、只修改 CTL、TIOC 和 RIOC 寄存器、这正是我所期望的。 然而、CAN 3的初始化正在配置所有其它寄存器、包括 TIOC 和 RIOC。  配置最终以离开初始化模式的指令结束。  

/**-离开配置和初始化模式*/
canREG3->CTL &=~(uint32)(0x00000041U); 

很遗憾、该调用会重置 GIO 设置。

我的问题是: 
  1. 在 HCG 配置中是否可能缺少 CAN2和 CAN3之间不同的复选框、从而导致 HALCoGen 生成的初始化不同?
  2. 是否是唯一在用户代码5部分重新初始化 TIOC 和 RIOC 寄存器的选项?

感谢你能抽出时间。

void canInit (void)
{
/*用户代码开始(4)*/
/*用户代码结束*/

/**@b 初始化@b CAN2:*/


/**-设置控制寄存器
* -进入初始化模式
*
CANREG2->CTL = 0x00000001U;

/**- CAN2端口输出值*/
canREG2->TIOC =(UINT32)((UINT32)0U <<18U)
|(uint32)((uint32) 0U <<17U)
|(uint32)((uint32) 0U <<16U)
|(uint32)((uint32) 0U << 3U)
|(uint32)((uint32) 1U <<2U)
|(uint32)((uint32) 0U << 1U);

canREG2->RIOC =(UINT32)((UINT32)0U <<18U)
|(uint32)((uint32) 0U <<17U)
|(uint32)((uint32) 0U <<16U)
|(uint32)((uint32) 0U << 3U)
|(uint32)((uint32) 1U <<2U)
|(uint32)((uint32) 0U <<1U);


/**@b 初始化@b CAN3:*/

/**-设置控制寄存器
* -禁用总线活动时的自动唤醒
* -禁用本地断电模式
* -禁用 DMA 请求线路
* -启用全局中断线路0和1
* -禁用调试模式
* -从软件复位中释放
* -启用/禁用奇偶校验或 ECC
* -启用/禁用自动总线开启定时器
* -进入调试状态前设置消息完成
* -设置正常工作模式
* -请求对配置寄存器的写入访问
* -设置消息的自动重发
* -禁用错误中断
* -禁用状态中断
* -进入初始化模式
*
CANREG3->CTL =(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32)((UINT32) 0x00000005U << 10U)
| 0x00020043U;

/**-清除所有挂起的错误标志并重置当前状态*/
canREG3->ES |= 0xFFFFFFU;

/**-为消息分配中断级别*/
CANREG3->INTMUXx[0U]=(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x000000000000U;
CANREG3->INTMUXx[1U]=(UINT32) 0x0000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U;

/**-在定时器周期上设置自动总线*/
canREG3->ABOTR =(uint32) 0U;

/**-设置 IF1以进行数据传输
* -等待 IF1就绪可供使用
* -设置 IF1控制字节
*
/*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/
while ((canREG3->IF1STAT & 0x80U)=0x80U)
{
} /*等待*/
CANREG3->IF1CMD = 0x87U;

/**-设置 IF2以读取数据
* -等待 IF1就绪可供使用
* -设置 IF1控制字节
*
/*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/
while ((canREG3->IF2STAT & 0x80U)=0x80U)
{
} /*等待*/
CANREG3->IF2CMD = 0x17U;

/**-设置位时序
* —设置波特率预分频器扩展
* -设置 TSeg2
* -设置 TSeg1
* -设置样本跳转宽度
* —设置波特率预分频器
*
canREG3->BTR =(uint32)((uint32) 0U <<16U)|
(uint32)((uint32)(4U - 1U)<<12U)|
(uint32)((uint32)((6U + 4U)- 1U)<<8U)|
(uint32)((uint32)(4U - 1U)<<6U)|
(uint32)(uint32) 9U;


/**- CAN3端口输出值*/
canREG3->TIOC =(UINT32)((UINT32) 1U <<18U)
|(uint32)((uint32) 0U <<17U)
|(uint32)((uint32) 0U <<16U)
|(uint32)((uint32) 0U << 3U)
|(uint32)((uint32) 1U <<2U)
|(uint32)((uint32) 1U <<1U);

canREG3->RIOC =(UINT32)((UINT32)0U <<18U)
|(uint32)((uint32) 0U <<17U)
|(uint32)((uint32) 0U <<16U)
|(uint32)((uint32) 0U << 3U)
|(uint32)((uint32) 1U <<2U)
|(uint32)((uint32) 0U << 1U);

/**-离开配置和初始化模式*/
canREG3->CTL &=~(uint32)(0x00000041U);


/**@注意,必须先调用此函数,然后才能使用驱动程序。\n
* 此函数必须在特权模式下执行。\n
*/

*用户代码开始(5)*/
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    后续行动:

    我创建了一个新的 Halcogen 项目、并在 GIO 模式下设置时尝试启用和禁用 CAN1-4的驱动程序。  CAN3驱动器的配置总是多于 TIOC 和 RIOC 寄存器。

    void canInit (void)
    {
    /*用户代码开始(4)*/
    /*用户代码结束*/
    /**@b 初始化@b CAN1:*/
    
    /**-设置控制寄存器
    * -进入初始化模式
    *
    canREG1->CTL = 0x00000001U;
    
    /**- CAN1端口输出值*/
    canREG1->TIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U << 1U);
    
    canREG1->RIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U <<1U);
    
    
    /**@b 初始化@b CAN2:*/
    
    
    /**-设置控制寄存器
    * -进入初始化模式
    *
    CANREG2->CTL = 0x00000001U;
    
    /**- CAN2端口输出值*/
    canREG2->TIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U << 1U);
    
    canREG2->RIOC =(uint32)((uint32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U <<1U);
    
    
    /**@b 初始化@b CAN3:*/
    
    /**-设置控制寄存器
    * -禁用总线活动时的自动唤醒
    * -禁用本地断电模式
    * -禁用 DMA 请求线路
    * -启用全局中断线路0和1
    * -禁用调试模式
    * -从软件复位中释放
    * -启用/禁用奇偶校验或 ECC
    * -启用/禁用自动总线开启定时器
    * -进入调试状态前设置消息完成
    * -设置正常工作模式
    * -请求对配置寄存器的写入访问
    * -设置消息的自动重发
    * -禁用错误中断
    * -禁用状态中断
    * -进入初始化模式
    *
    CANREG3->CTL =(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32)((UINT32) 0x00000005U << 10U)
    | 0x00020043U;
    
    /**-清除所有挂起的错误标志并重置当前状态*/
    canREG3->ES |= 0xFFFFFFU;
    
    /**-为消息分配中断级别*/
    CANREG3->INTMUXx[0U]=(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x000000000000U;
    CANREG3->INTMUXx[1U]=(UINT32) 0x0000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U;
    
    /**-在定时器周期上设置自动总线*/
    canREG3->ABOTR =(uint32) 0U;
    
    /**-设置 IF1以进行数据传输
    * -等待 IF1就绪可供使用
    * -设置 IF1控制字节
    *
    /*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/
    while ((canREG3->IF1STAT & 0x80U)=0x80U)
    {
    } /*等待*/
    CANREG3->IF1CMD = 0x87U;
    
    /**-设置 IF2以读取数据
    * -等待 IF1就绪可供使用
    * -设置 IF1控制字节
    *
    /*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/
    while ((canREG3->IF2STAT & 0x80U)=0x80U)
    {
    } /*等待*/
    CANREG3->IF2CMD = 0x17U;
    
    /**-设置位时序
    * —设置波特率预分频器扩展
    * -设置 TSeg2
    * -设置 TSeg1
    * -设置样本跳转宽度
    * —设置波特率预分频器
    *
    canREG3->BTR =(uint32)((uint32) 0U <<16U)|
    (uint32)((uint32)(4U - 1U)<<12U)|
    (uint32)((uint32)((6U + 4U)- 1U)<<8U)|
    (uint32)((uint32)(4U - 1U)<<6U)|
    (uint32)(uint32) 9U;
    
    
    /**- CAN3端口输出值*/
    canREG3->TIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U << 1U);
    
    canREG3->RIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U << 1U);
    
    /**-离开配置和初始化模式*/
    canREG3->CTL &=~(uint32)(0x00000041U);
    
    /**@b 初始化@b CAN1:*/
    
    
    /**- CAN4端口输出值*/
    canREF4->TIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U << 1U);
    
    canREF4->RIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U << 1U);
    
    
    /**@注意,必须先调用此函数,然后才能使用驱动程序。\n
    * 此函数必须在特权模式下执行。\n
    */
    
    *用户代码开始(5)*/
    */*用户代码结束*/
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    很抱歉耽误你的时间。 HALCoGen 生成的 CAN 驱动程序确实存在问题。 CAN3配置不考虑通用 I/O 设置。 此外、CAN4配置代码丢失了初始写入 CANCTL 寄存器以启用 INIT 模式的操作。

    作为权变措施、如果要将 CANX 端子用作 GIO、请使用#if 0和#endif 覆盖 HALCoGen 生成的初始化例程。

    void canInit (void)
    {
    //用户代码开始(4)*/
    
    canREG1->CTL = 0x00000001U;
    
    /**- CAN1端口输出值*/
    canREG1->TIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U << 1U);
    
    canREG1->RIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U <<1U);
    
    canREG2->CTL = 0x00000001U;
    
    /**- CAN2端口输出值*/
    canREG2->TIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U << 1U);
    
    canREG2->RIOC =(uint32)((uint32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U <<1U);
    
    canREG3->CTL = 0x00000001U;
    
    /**- CAN3端口输出值*/
    canREG3->TIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U << 1U);
    
    canREG3->RIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U <<1U);
    
    canREF4->CTL = 0x00000001U;
    
    /**- CAN4端口输出值*/
    canREF4->TIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U << 1U);
    
    canREF4->RIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U <<1U);
    
    
    #if 0
    
    /*用户代码结束*/
    /**@b 初始化@b CAN1:*/
    
    /**-设置控制寄存器
    * -进入初始化模式
    *
    canREG1->CTL = 0x00000001U;
    
    /**- CAN1端口输出值*/
    canREG1->TIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U << 1U);
    
    canREG1->RIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U <<1U);
    
    
    /**@b 初始化@b CAN2:*/
    
    
    /**-设置控制寄存器
    * -进入初始化模式
    *
    CANREG2->CTL = 0x00000001U;
    
    /**- CAN2端口输出值*/
    canREG2->TIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U << 1U);
    
    canREG2->RIOC =(uint32)((uint32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U <<1U);
    
    
    /**@b 初始化@b CAN3:*/
    
    /**-设置控制寄存器
    * -禁用总线活动时的自动唤醒
    * -禁用本地断电模式
    * -禁用 DMA 请求线路
    * -启用全局中断线路0和1
    * -禁用调试模式
    * -从软件复位中释放
    * -启用/禁用奇偶校验或 ECC
    * -启用/禁用自动总线开启定时器
    * -进入调试状态前设置消息完成
    * -设置正常工作模式
    * -请求对配置寄存器的写入访问
    * -设置消息的自动重发
    * -禁用错误中断
    * -禁用状态中断
    * -进入初始化模式
    *
    CANREG3->CTL =(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32)((UINT32) 0x00000005U << 10U)
    | 0x00020043U;
    
    /**-清除所有挂起的错误标志并重置当前状态*/
    canREG3->ES |= 0xFFFFFFU;
    
    /**-为消息分配中断级别*/
    CANREG3->INTMUXx[0U]=(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x000000000000U;
    CANREG3->INTMUXx[1U]=(UINT32) 0x0000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U;
    
    /**-在定时器周期上设置自动总线*/
    canREG3->ABOTR =(uint32) 0U;
    
    /**-设置 IF1以进行数据传输
    * -等待 IF1就绪可供使用
    * -设置 IF1控制字节
    *
    /*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/
    while ((canREG3->IF1STAT & 0x80U)=0x80U)
    {
    } /*等待*/
    CANREG3->IF1CMD = 0x87U;
    
    /**-设置 IF2以读取数据
    * -等待 IF1就绪可供使用
    * -设置 IF1控制字节
    *
    /*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/
    while ((canREG3->IF2STAT & 0x80U)=0x80U)
    {
    } /*等待*/
    CANREG3->IF2CMD = 0x17U;
    
    /**-设置位时序
    * —设置波特率预分频器扩展
    * -设置 TSeg2
    * -设置 TSeg1
    * -设置样本跳转宽度
    * —设置波特率预分频器
    *
    canREG3->BTR =(uint32)((uint32) 0U <<16U)|
    (uint32)((uint32)(4U - 1U)<<12U)|
    (uint32)((uint32)((6U + 4U)- 1U)<<8U)|
    (uint32)((uint32)(4U - 1U)<<6U)|
    (uint32)(uint32) 9U;
    
    
    /**- CAN3端口输出值*/
    canREG3->TIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U << 1U);
    
    canREG3->RIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U << 1U);
    
    /**-离开配置和初始化模式*/
    canREG3->CTL &=~(uint32)(0x00000041U);
    
    /**@b 初始化@b CAN1:*/
    
    
    /**- CAN4端口输出值*/
    canREF4->TIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U << 1U);
    
    canREF4->RIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(uint32)((uint32) 0U << 3U)
    |(uint32)((uint32) 0U <<2U)
    |(uint32)((uint32) 0U << 1U);
    
    
    /**@注意,必须先调用此函数,然后才能使用驱动程序。\n
    * 此函数必须在特权模式下执行。\n
    */
    
    *用户代码开始(5)*/
    
    #endif
    
    //用户代码结束*/
    } 

    此致、Sunil

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、感谢您的回答。 我们将实施解决方案。