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.

[参考译文] TM4C123GH6PM:AHB 设置和 APB

Guru**** 2473260 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/683233/tm4c123gh6pm-ahb-set-up-and-apb

器件型号:TM4C123GH6PM

尊敬的论坛:

我使用 APB 和寄存器0x4002500、没有问题。 我设置了4002.5中的所有内容并添加了正确的偏移。

当我将0x4005D000寄存器用于端口 F 时遇到问题。 不管用。 我使用与 APB 和 nada 相同的偏移设置寄存器。 我甚至无法使 LED 闪烁。

#define GPIO_PORTF_DATA_R (*((volatile unsigned long *) 0x400253FC)

// VS

#define GPIO_PORTF_DATA_R (*(volatile unsigned long *) 0x4005D3FC) 

我也设置了其他寄存器、并遵循数据表。 我确实让 APB 运行、但 AHB 不运行。

有什么建议吗?

提前感谢。
/Ruslan

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

    若干建议。 首先、您是否在系统控制寄存器9中将 GIO 端口 F 配置为使用 AHB 总线? 第二、为什么使用0x3FC 作为数据寄存器的偏移量。 记录的偏移量为0x000。 第三、为什么要将数据寄存器定义为无符号长整型? 它不应被大于32位宽的任何内容写入。

    我强烈建议使用成熟的示例和库例程。 当您创建自己的寄存器定义时、您将有机会犯这些错误、并且您会使人们更难帮助您。 我用 EK-TM4C123G 板的简单示例"闪烁"并将其更改为使用 AHB 写入端口 F、方法是向 SysCtlGPIOAHBEnable()添加 TivaWare 调用并将三次 GPIO_PORTF_BASE 替换为 GPIO_PORTF_AHB_BASE。

    #include 
    #include 
    #include "inc/hw_memmap.h"
    #include "driverlib/debug.h"
    #include "driverlib/gpio.h"
    #include "driverlib/sysctl.h"
    
    //*********
    //
    //! \addtogroup example_list
    //! 

    Blinky (闪烁)

    //! //! 一个非常简单的示例、使用直接寄存器 //! 访问。 //// ***************** // // //如果驱动程序库遇到错误,则调用的错误例程。 //// ***************** #ifdef debug void __error__(char *pcFilename、uint32_t ui32Line) { while (1); } #endif //********* // //闪烁板载 LED。 //// ***************** int main (void) { volatile uint32_t ui32Loop; // //启用用于板载 LED 的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF); // //检查是否启用了外设访问。 // while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOF)) { } //将 GIO 端口 F 配置为使用 AHB 总线 SysCtlGPIOAHBEnable (SYSCTL_PERIPH_GPIOF); // //为 LED 启用 GPIO 引脚(PF3)。 将方向设置为输出、然后 //启用 GPIO 引脚以实现数字功能。 // GPIOPinTypeGPIOOutput (GPIO_PORTF_AHB_BASE、GPIO_PIN_3); // //永久循环。 // while (1) { // //打开 LED。 // GPIOPinWrite (GPIO_PORTF_AHB_BASE、GPIO_PIN_3、GPIO_PIN_3); // //延迟一位。 // for (ui32Loop = 0;ui32Loop < 200000;ui32Loop +) { } // //关闭 LED。 // GPIOPinWrite (GPIO_PORTF_AHB_BASE、GPIO_PIN_3、0x0); // //延迟一位。 // for (ui32Loop = 0;ui32Loop < 200000;ui32Loop +) { } }

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

    ***喜欢***非常详细-逻辑上的和合理的-简单的“优秀!

    然而(另一种) 不合理 地拒绝"现代、基于、高效、成熟的方法"(API)-以" 增进理解"的(始终如一)主张为理由。   

    正如海报所说的-"增加"证明、"Nada"

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

    感谢您的重播。

    a)控制寄存器设置几乎正确,解决了这个问题。 我设置了一个错误的 GPIO :-/将0x20反转为0x02。
    b) 0x3FC 表示我想使用寄存器中的所有位、访问读取和写入配置。
    c)我不使用 API,因为我目前所做的是创建 API 示例和头文件
    d)由于我在项目中没有任何包含项、因此使用了自愿长整型而不是 uint32_t。 寄存器为32位。 如果您在任何 IDE 中查看 API 的头文件或硬件解释、您将注意到最底部是一个32位长的文件。 此外、我所阅读的所有文献都以这种方式提供

    解决方案是