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.

[参考译文] RTOS/PROCESSOR-SDK-AM335X:GPIOModuleEnable()异常

Guru**** 2609895 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/582718/rtos-processor-sdk-am335x-gpiomoduleenable-exception

器件型号:PROCESSOR-SDK-AM335X
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

您好!

我在函数 GPIOModuleEnable()的第一个"LDR"上得到了一个可靠的异常抛出、该函数从 ti\drv\gpio\src\v1gpio_v1.c.调用    当我的主应用程序初始化代码调用 GPIO_init()并且只有一个线程正在运行时,就会发生这种情况。  有关屏幕截图、请参阅随附的 word doc。  一旦我在所示的"Disassembly"视图中点击"Assembly step over"按钮、就会发生异常。

我在 SBL 代码中设置了以下启用项、在运行应用程序之前、该启用项始终从内部 RAM 中运行:
1. 通过调用 PRCMModuleEnable()启用每个 GPIO 模块;
2.  将 GPIO 时钟控制寄存器(例如 CM_WKUP_GPIO0_CLKCTRL)的第18位置位即可启用"可选功能时钟";
3. 从时钟分频器选择32kHz 作为 GPIO0去抖时钟(在 CM_DPLL_CLKSEL_GPIO0_DBCLK 中)。

LDR 指令的地址 看起来是合法 的--它只是尝试读取 GPIO0的 GPIO_CTRL 寄存器。  各种 GPIO 配置结构似乎正常。

与此同时,GPIOx 寄存器在调试器寄存器视图中读回刚刚好--这只是增加了混乱。

有人能告诉我这里发生了什么?

e2e.ti.com/.../GPIOModuleEnable_5F00_exception_5F00_170320.docx

谢谢、
Gerry

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    哦、这里是我的环境:
    CCS 版本:6.1.2.00015
    BIOS_6_45_01_29
    PDK_AM335x_1_0_3
    GNU v4.0.3 (Linaro)
    Win 7 64位
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的主题已移至器件论坛。

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

    好的--这实际上是一个 MMU 问题。

     以下主题中有一些相关的讨论:




    我唯一能够找到的.cfg 文件条目的文档是 C:\ti\BIOS_6_45_01_29\packages/ti\SysBIOS\family\arm\A8\MMU.XDC 中的一些示例。

    下面的代码似乎正在完成工作:

    VAR MMU = xdc.useModule('ti.sysbios.family.arm.a8.Mmu');

    /*启用 MMU (L1/L2数据缓存所需)*/
    MM4.enableMMU = true;

    /*强制唤醒和外设部分不可缓存*/
    VAR 外设 Attrs ={
       键入:MMU.FirstLevelDesc_section,/*段描述符*/
       TEX:0、
       可缓冲:false,
       可高速缓冲 :false,
       可共享 :false,
       NoExecute :true,
    };

    /*定义 外设所在的1MB 块的基址。 。 *
    /*唤醒:时钟模块、GPIO0、UART0、I2C0 */
    VAR WAKEUP_BaseAddr = 0x44E00000
    /* GPIO1、UART1、UART2、I2C1、McSPI0、 McASP0 CFG、McASP1 CFG *
    var periph0BaseAddr = 0x48000000
    /* GPIO2、GPIO3、UART3、UART4、UART5、 I2C2、McSPI1 */
    var periph1BaseAddr = 0x48100000
    /* PWM 和 LCD 控制器*/
    var periph3BaseAddr = 0x48300000

    /*配置相应的 MMU 页描述符*/
    Mmu.setFirstLevelDescMeta(wakeup_BaseAddr、WAKEUP_BaseAddr、peripheralAttrs);
    Mmu.setFirstLevelDescMeta(periph0BaseAddr、periph0BaseAddr、peripheralAttrs);
    Mmu.setFirstLevelDescMeta(periph1BaseAddr、periph1BaseAddr、peripheralAttrs);
    Mmu.setFirstLevelDescMeta(periph3BaseAddr、periph3BaseAddr、peripheralAttrs);

    /*如果需要,中断控制器等 。 。
    var periph2BaseAddr = 0x48200000
    Mmu.setFirstLevelDescMeta(periph2BaseAddr、periph2BaseAddr、peripheralAttrs);
    *

    谢谢、
    Gerry