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.

[参考译文] RM48L940:定制 RM48板

Guru**** 2482105 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/696015/rm48l940-custom-rm48-board

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

我在使用 RM48构建的定制板上工作、在 IAR 中将其启动时遇到问题(现有 CCS 工程正常、但需要转到 IAR 进行生产)。

在我的测试项目中、我尝试使连接到 CAN1RX (引脚 B10)的 LED 闪烁。 我不需要 CAN 总线、因此我想将其用作 GIO (配置为输出)。 我可以编译和下载我的项目,但当我运行它时,它会进入 canInit()中此行的杂草中:

/**-设置控制寄存器

*-进入初始化模式
*
canREG1->CTL = 0x00000001U;

我认为上述目的是将引脚设置为 GIO 而不是 CAN 总线(如果我错了、请纠正我的错误)。

在 CCS 工程中、同一条线执行正常。 我缺少什么以及我如何找出执行卡在这一点时的情况(没有错误、只是无限期地等待)。

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

    使用此语句不足以将 CAN TX/RX 引脚配置为 GPIO? (canREG1->CTL = 0x00000001U;)。

    这是将 CAN TX/RX 配置为 GIO 并进行切换的正确序列:

    canREG1->CTL |= 0x00000001;
    如果(ti = 0){
    TI=1;
    }否则{
    TI=0;

    canREG1->TIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(UINT32)((UINT32) 0U <<3U)/*GIO 模式*/
    |(uint32)((uint32) 1U << 2U)/*输出*/
    |(uint32)((uint32) ti << 1U);/*高*/
    canREG1->RIOC =(UINT32)((UINT32) 1U <<18U)
    |(uint32)((uint32) 0U <<17U)
    |(uint32)((uint32) 0U <<16U)
    |(UINT32)((UINT32) 0U <<3U)/*GIO 模式*/
    |(uint32)((uint32) 1U << 2U)/*输出*/
    |(uint32)((uint32) ti << 1U);/*高*/
    canREG1->CTL &= 0xFFFFFFFE;

    只有当 CAN 控制寄存器的 Init 位被置位时、IO 控制寄存器的值才是可写的。 CAN RX IO 和 CAN TX IO 控制寄存器的 OD、Func 和 Dir 位在 CAN 控制寄存器的 Init 位被复位时被强制为特定的值、请参阅位说明。

    电路板上是否有 CAN 收发器? 如果 LED 连接到 CAN_H、则 LED 将始终亮起、因为 CAN_H 的电压范围为2.5V 至3.5V。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复。 LED 连接到 CAN1TX 和 CAN1RX。 下面是我使用的完整 canInit()函数。 在我之前的帖子中,我 只显示 了执行进入到杂草中的行(canREG1->CTL=(UINT32)0x00000001U")。 也就是说、当我单步 执行并尝试执行此行时 、我在该行之后的唯一选项 是中止调试、因为它似乎永远位于那里。  当我中止 调试时、我 最终会进入这个汇编语言(某些中断处理程序?)。

    ******* 调试中断后(请参阅突出显示的行)*********

           0x3586:0x4904        LDR.N    R1、[PC、#0x10]        ;countEMACCore0RxIsr

          0x3588:0x6008        STR      R0、[R1]

          0x358a:0x4770        BX       LR

       countEMACCore0TxIsr++;

    EMACCore0TxIsr:

          0x358c:0x4803        LDR.N    R0、[PC、#0xc]         ;countEMACCore0TxIsr

          0x358e:0x6800        LDR      R0、[R0]

          0x3590:0x1c40        加     R0、R0、#1

          0x3592:0x4902        LDR.N    R1、[PC、#0x8]         ;countEMACCore0TxIsr

          0x3594:0x6008        STR      R0、[R1]

          0x3596:0x4770        BX       LR

          0x3598:0x08000028    DC32     计数器 EMACCore0RxIsr

          0x359c:0x0800002c    DC32     计数器 EMACCore0TxIsr

    gSizeGPIOAlArray:

          0x35a0:0x0000005c    DC32     0x5c (92)

    ABORT_Handler:

    FIQ 处理程序:

    IRQ_Handler:

    预取处理程序:

    Swi_Handler…… 未显示+2符号:

          0x35a4:0xeafffffe    B        Abort_Handler          ;0x35a4

    _IAR_return_f发 件_swi:

          0x35a8:0xe1b0f00e    MOV     PC、LR

    _IAR_SB:

          0x35ac:0xFFFFFFFF    MRC2     P15、#7、PC、C15、C15、 7号

          0x35b0:0xFFFFFFFF    MRC2     P15、#7、PC、C15、C15、 7号

          0x35b4:0xFFFFFFFF    MRC2     P15、#7、PC、C15、C15、 7号

          0x35b8:0xFFFFFFFF    MRC2     P15、#7、PC、C15、C15、 7号

          0x35bc:0xFFFFFFFF    MRC2     P15、#7、PC、C15、C15、 7号

          0x35c0:0xFFFFFFFF    MRC2     P15、#7、PC、C15、C15、 7号

          0x35c4:0xFFFFFFFF    MRC2     P15、#7、PC、C15、C15、 7号

          0x35c8:0xFFFFFFFF    MRC2     P15、#7、PC、C15、C15、 7号

          0x35cc:0xFFFFFFFF    MRC2     P15、#7、PC、C15、C15、 7号

    ******* 完整的 canInit()函数'*****

    空 canInit (空)

    /*用户代码开始(4)*/
    /*用户代码结束*/
       /**@b 初始化@b CAN1:*/
     
       /**-设置控制寄存器
       *    -进入初始化模式
       *
       canREG1->CTL =(uint32) 0x00000001U;
        
        /**- CAN1端口输出值*/
       canREG1->TIOC = (UINT32)((UINT32) 1U <<18U)
                      |(uint32)((uint32) 1U <<17U)
                      |(uint32)((uint32) 0U <<16U)                
                      |(uint32)((uint32) 0U << 3U)  
                      |(uint32)((uint32) 1U <<2U)    
                      |(uint32)((uint32) 0U << 1U);
                      
       canREG1->RIOC = (UINT32)((UINT32) 1U <<18U)    
                      |(uint32)((uint32) 1U <<17U)  
                      |(uint32)((uint32) 0U <<16U)   
                      |(uint32)((uint32) 0U << 3U)  
                      |(uint32)((uint32) 1U <<2U)
                      |(uint32)((uint32) 0U <<1U);        


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

    /*用户代码开始(5)*/
    /*用户代码结束*/

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

    您好!

    如果 CCE 位(CANREG->CTL 寄存器中的位6)被清零、那么寄存的配置将不能被访问。 我不建议修改 HALCoGen 生成的 canInit()。 将 CAN_TX/RX 设置为 GIO 并在 main ()中进行切换。

    请注意:

    只有当 CAN 控制寄存器的 Init 位置位时、IO 控制寄存器的值才可写入。当 CAN 控制寄存器的 Init 位复位时、CAN TX IO 控制寄存器的 OD、Func、Dir 和 OUT 位被强制为特定值。

    while (1)

    canREG1->CTL |= 0x00000001;

    如果(ti = 0){

    TI=1;

    }否则{

    TI=0;

    canREG1->TIOC =(UINT32)((UINT32) 1U <<18U)

    |(uint32)((uint32) 0U <<17U)

    |(uint32)((uint32) 0U <<16U)

    |(UINT32)((UINT32) 0U <<3U)/*GIO 模式*/

    |(uint32)((uint32) 1U << 2U)/*输出*/

    |(uint32)((uint32) ti << 1U);/*高*/

    canREG1->RIOC =(UINT32)((UINT32) 1U <<18U)

    |(uint32)((uint32) 0U <<17U)

    |(uint32)((uint32) 0U <<16U)

    |(UINT32)((UINT32) 0U <<3U)/*GIO 模式*/

    |(uint32)((uint32) 1U << 2U)/*输出*/

    |(uint32)((uint32) ti << 1U);/*高*/

    canREG1->CTL &= 0xFFFFFFFE;