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.

[参考译文] TM4C1294NCPDT:引脚的 Tivaware SPI/SSI 配置-在个人库中使用 GPIOPinConfigure

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/580747/tm4c1294ncpdt-tivaware-spi-ssi-configuration-of-pins---using-gpiopinconfigure-in-a-personal-library

器件型号:TM4C1294NCPDT

先生们:

SPI 引脚(在本示例中为 CLK 引脚)的典型引脚配置为:

GPIOPinTypeSSI (SSI_gyros_CLK_PORT、SSI_gyros_CLK_PIN);
GPIOPinConfigure (GPIO_PA2_SSI0CLK);

我想拥有一个固定的外部函数、让我从主应用中初始化给定的 SPI 外设。

简化 CLK 引脚、思路是:

SPISensorHWInit (Int32_t SSIBase、Int32_t sensorClockPort、int_32_t sensorClockPin)//加上另一个 MISO/MOSI/CS GPIO 的端口和引脚
{
//首先、执行 SSI 外设配置 
//然后是每个引脚,例如:
GPIOPinTypeSSI (sensorClockBase、sensorClockPin); GPIOPinConfigure (MORing);//这有点棘手… …}

我可以看到有关某个参数的两种可能的方法:

1) 1)要在"打包"函数内传递原始 GPIOPinConfigure GPIO_PA2_SSI0CLK 参数、请在已有的长列表中再添加一个参数

2) 2)为了在函数内重建上述参数、如果我们处理 SSI 外设并且知道 SSI 基址足以实现该目的、

我查看了 GPIOPinConfigure 代码、它不是那么容易读取。 最后、我们要写入一个寄存器:

HWREG (ui32Base + GPIO_PCTL)=((HWREG (ui32Base + GPIO_PCTL)和
~(0xF << ui32Shift))|
((ui32PinConfig & 0xF)<< ui32Shift); 

问题是:我们能否从已知数字 SSI base 和 pin 中确定 Base、Shift 和 Remaining PinConfig? 什么是"魔法"规则?

此致

布鲁诺

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

    您好、Bruno、

    IIRC、您可以通过另一种方法接近该值;可以从 GPIOPinConfigure 参数值中提取 GPIO 端口和引脚。 我找到了一些旧代码、发现了以下内容:

    //从 GPIO_pxy_zzzz pinConfig 值
    #define VTL_GPIOGetPinNumberByPinConfig (pinConfig)(((pinConfig)>> 10)& 0x7)获取引脚编号(从0到7) 
    uint32_t VTL_GPIOGetBaseByPinConfig (uint32_t pinConfig){
    //提取基本索引
    uint32_t gpioBaseIdx =(pinConfig >> 16)& 0xff;
    
    //在 APB 或 AHB 总线上?
    IF (HWREG (SYSCTL_GPIOHBCTL)&(1 << gpioBaseIdx))
    {
    返回 VTL_GPIObaseAddrs[(gpioBaseIdx << 1)+ 1];
    }
    其他
    {
    返回 VTL_GPIObaseAddrs[gpioBaseIdx <<1];
    }
    } 

    GPIO 基地址表如下所示:

    /**
    * GPIO 端口基址
    */
    const uint32_t vtL_GPIObaseAddrs[]=
    {
    GPIO_Porta_base、GPIO_Porta_AHB_BASE、
    GPIO_PORTB_BASE、GPIO_PORTB_BASE、GPIO_PORTB_AHB_BASE
    、GPIO_PORTC_BASE、 GPIO_PORTC_AHB_BASE、
    GPIO_PORTD_BASE、GPIO_PORTD_AHB_BASE、
    GPIO_Porte _BASE、GPIO_Porte AHB_BASE、
    GPIO_PORTF_BASE、GPIO_PORTF_AHB_BASE、
    GPIO_PORTG_BASE、GPIO_PORTG_AHB_BASE、
    GPIO_Porth_BASE、 GPIO_Porth_AHB_BASE、
    GPIO_PORTJ_BASE、GPIO_PORTJ_AHB_BASE、
    GPIO_PORTK_base、GPIO_PORTK_base、GPIO_PORTK_base、
    GPIO_PORTL_base、GPIO_PORTL_base、
    GPIO_PORTM_base、GPIO_PORTM_base、GPIO_PORTM_base
    、GPIO_PORTn_BASE、 GPIO_PORTN_BASE、
    GPIO_PORTP_BASE、GPIO_PORTP_BASE、
    GPIO_PORTQ_BASE、GPIO_PORTQ_BASE、
    #ifdef VTL_TM4C129
    GPIO_PORTR_BASE、GPIO_PORTR_BASE、
    GPIO_PORTS_BASE、GPIO_PORTS_BASE、
    GPIO_PORTT_BASE、GPIO_PORTT_BASE
    #endif
    }; 

    这些有道理吗?

    BR、

    Veikko

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Veikko、
    是的、这是一个很好的建议、谢谢。 代码肯定会更清晰!
    我打算只在测试后回复、但现在有这么多事情发生了、可能需要几天时间-我会试着回到这里、说它是怎么发生的!
    谢谢
    布鲁诺