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.

[参考译文] Starterware/processor-SDK-AM335X:输入引脚中的中断出现 AM335x 问题

Guru**** 2581345 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/593450/starterware-processor-sdk-am335x-am335x-problem-with-interrupt-in-input-pin

器件型号:PROCESSOR-SDK-AM335X

工具/软件:Starterware

大家好、

当按下连接到 BeagleBone White 输入引脚的开关时、我尝试创建中断。
当该事件发生时、我创建了一个 ISR、我要关闭(已打开) LED 并打开另一个(当前关闭) LED ...
我不知道什么不能正常工作、所以我给了你我的代码(实际上是一段代码、它负责启用引脚、中断控制器和 ISR)、希望有人能够提供帮助。

IntMasterIRQEnable();
IntAINTCInit();
GPIO1ModuleClkConfig();
GpioModuleEnable (SOC_GPIO_1_regs);
GPIODirModeSet (SOC_GPIO_1_regs、 GPIO_Inter_INP、GPIO_DIR_INPUT_INPUT_INPUT_INPUT_INPUT_INT1A
、ISR_buttonLed);
IntPrioritySet (SYS_INT_GPIOINT1A、 0、AINTC_HOSTINT_ROUS_IRQ);
IntSystemEnable (SYS_INT_GPIOINT1A);
GPIOIntTypeSet (SOC_GPIO_1_regs、GPIO_Intter_INP、GPIO_INT_TYPE_LEVEL_HIGH);
HWREG (SOC_GPIO_1_regs + 0x34)= 0x10;GPIO_INCO-

+ 0x44

= 0x10;HWREG_1 = 0x44 =/TOP-(GPIO_LEVEL_1) ISR 函数
//
静态 void ISR_buttonLed (void)
{
//清除中断 //
HWREG (SOC_GPIO_1_regs + 0x2C)= 0x10;
HWREG (SOC_GPIO_1_regs + 0x30)= 0x10;
//关闭已在
GPIOPinWrite (SOC_GPIO_1_regs、GPIO_LED_ON、GPIO_PIN_LOW)上的 LED;
//打开其他 SOC_REGP+
0x38_GPIO_REGP+



0x10 (SOC_REGP_GPIO_1)
+ 0xGPIO_REGPT_GPIO_0_GPIO_0_GPIO1;//重置 GPIO_0_GPIO_GPIO1 + 0x4_GPIO_GPIO_GPIO1 + 0x4_GPIO_GPIO_GPIO_REG0 + 0x4_GPIO_GPIO_GPIO1 + 0x4_GPIO_GPIO_RES_GPIO_GPIO1;// 

我是否必须启用其他功能? 上述内容是否正确?
此外、我不确定我是否已了解如何选择正确 的中断请求行。。任何帮助都不仅仅是欢迎...

提前感谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果这很重要、我还应该说我使用的是 Starterware 2.00.01.01、Code Composer Studio 版本:6.1.0.00104、并且我使用编译器版本 GNU v4.4.8 (Linaro)构建项目
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很抱歉,太烦人了,但我真的需要弄清楚正在发生什么……

    首先、 我测试了输入引脚是否正常工作、并"了解"了开关是否按下时的逻辑电平差异。出于这一原因、我在 环路中使用了 GPIOPinRead 函数、引脚似乎正常工作。(尽管高电平由 int 值表示。 而不是我预期的1、但我想这不是错误)。

    因此,我认为问题可能是以下问题之一:

    • 中断控制器工作不正常(但为什么?我如何确定以及我应该尝试其他什么?)
    • GPIO 模块(可能还有任何其他外设)在中断方面需要一些额外的设置或初始化(因为我使用了 GPIOPinIntEnable、但它仍然不起作用。 也许还有更多事情要做?)
    • 问题是否可能是由链接器文件或 Code Composer Studio 中使用的启动文件造成的? 也许中断矢量没有被正确初始化、或者中断矢量表位于错误的位置?
      至于链接器文件与问题的关系、我将此假设基于另一个线程(上一篇文章) https://e2e.ti.com/support/embedded/starterware/f/790/t/491415、这 是一个不同的问题、但在我看来、这似乎是相关的(或我真的绝望)。

    与成功构建项目的最后一个 bullet...in 顺序相对应、除了必要的头文件和源文件以及 STARTUP_ARMCA8.S 和 AM335x.lds 文件(这些文件是自动创建的)、我是否需要包含其他内容?
    例如、位于 AM335X_StarterWare_02_00_01_01/system_config/armv7a/AM335x/gcc/          或位于中的文件 cp15.S、init.S 中的 exceptionhandler.S
    AM335x_StarterWare_02_00_01_01/system_config/armv7a/gcc/?
    (如果我插曲 init.S、编译无法成功、因为此错误弹出窗口:              "所选处理器不支持 ARM 模式`fmxr FPEXC、r0")
    根据上面给出的链接、AM335x.lds 是否应该替换为其他文件?

    我要提醒、我使用由 Code Composer Studio (6.1版)提供的 GNU v4.4.8 (Linaro)编译器

    再次提前感谢  

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

    嗯、有一些更新。。。

    插入 GPIOPinIntEnable 函 数似乎可以解决这个问题、因为按下开关实际上会触发一个中断并且 LED 分别关闭和打开。
    当然、ISR 的处理方式会使 LED 保持在这样的状态:第二次按下开关不会产生明显的结果(因为应该打开的 LED 已经打开、而另一个 LED 已经关闭)。
    因此,我更改了 ISR,让 LED 闪烁...出现新问题的地方

    开关每次单次按下都会触发中断、ISR 发生两次、这意味着 LED 闪烁4次、而不是2次。 我提供了一段代码、以防有人帮忙。

    IntRegister (SYS_INT_GPIOINT1A、ISR_buttonLed);
    IntPrioritySet (SYS_INT_GPIOINT1A、0、AINTC_HOSTINT_route_IRQ);
    IntSystemEnable (SYS_INT_GPIOINT1A);
    GPIOIntTypeSet (SOC_GPIO_1_regs、GPIO_Inter_INP、GPIO_INT_TYPE_LEVEL_HIGH);
    GPIOPinIntEnable (SOC_GPIO_1_regs、GPIO_INT_LINE_1、GPIO_Inter_INP);
    HWREG (SOC_REG1-
    + 0x34)
    
    ;GPIO_0x34 (SOC_REG1-+ 0x34);GPIO-+ 0x34 (SOC_REG1-+ 0x34)
    ISR
    //
    静态 void ISR_buttonLed (void)
    {
    GPIOPinIntClear (SOC_GPIO_1_regs、GPIO_INT_LINE_1、GPIO_Inter_INP);
    int 计数器= 0;
    for (counter=0;counter<2;counter++)
    {
    GPIOPinWrite (SOC_GPIO_2_regs、GPIO_LEDAKI_ON、GPIO_PIN_LOW);
    GPIOPinWrite (SOC_GPIO_1_regs、GPIO_LED_BACK_UP、GPIO_PIN_HIGH);
    延迟(0xAFFFF);
    GPIOPinWrite (SOC_GPIO_2_regs、GPIO_LEDAKI_ON、GPIO_PIN_HIGH);
    GPIOPinWrite (SOC_GPIO_1_regs、GPIO_LED_BACK_UP、GPIO_PIN_LOW);
    延迟(0xAFFFF);
    }