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:在 C 运行时初始化之前使用 GPIO 函数初始化外部 RAM 接口

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/587763/rtos-initializing-external-ram-interface-using-gpio-functions-before-to-c-runtime-initialization

主题中讨论的其他器件:TM4C1294NCPDT

工具/软件:TI-RTOS

在  TM4C1294NCPDT 微控制器+ TI-RTOS 环境 中,    为了在 C 运行时初始化之前启用外部存储器,我们 将使用   .cfg 中的“RESET 函数”:

 

VAR 启动= xdc.useModule('xdc.runtime.Startup');

VAR Reset = xdc.useModule("xdc.runtime.Reset");
reset.Fxns[Reset.Fxns.length++]="&SDRAM_init";

工作正常。      当 SDRAM_INIT  函数 调用  诸如 "SysCtlPeripheralEnable"、" GPIOPinConfigure" 等 GPIO 函   数时、会发生问题、它会生成一个异常来停止程序。

void SDRAM_init (void)
{

SysCtlPeripheralEnable (SYSCTL_Periph_EPI0);/**< ERTITA EPI00xf0001000 *


GPIOPinConfigure (GPIO_PH0_EPI0S0);/**< 29| PH0|EPI0S0*/
GPIOPinConfigure (GPIO_PH1_EPI0S1);/**< 30| PH1|EPI0S1*/
GPIOPinConfigure (GPIO_PH2_EPI0S2);/**< 31| PH2|EPI0S2*/
GPIOPinConfigure (GPIO_PH3_EPI0S3);/**< 32| PH3|EPI0S3*/
GPIOPinTypeEPI (GPIO_Porth_BASE、EPI_Porth_Pins);/**< iniciza porta H como EPI*

GPIOPinConfigure (GPIO_PC7_EPI0S4);/**< 22 | PC7 | EPI0S4 */
GPIOPinConfigure (GPIO_PC6_EPI0S5);/**< 23 | PC6 | EPI0S5 */
GPIOPinConfigure (GPIO_PC5_EPI0S6);/**< 24 | PC5 | EPI0S6 */
GPIOPinConfigure (GPIO_PC4_EPI0S7);/**< 25 | PC4 | EPI0S7 */
GPIOPinTypeEPI (GPIO_PORTC_BASE、EP_PORTC_Pins);/**<初值端口 A C como EPI*

GPIOPinConfigure (GPIO_PA6_EPI0S8);/**< 40 | PA6 | EPI0S8 */
GPIOPinConfigure (GPIO_PA7_EPI0S9);/**< 41 | PA7 | EPI0S9 */
GPIOPinTypeEPI (GPIO_Porta_base、EPI_Porta_Pins);/**<初值端口 A COMO EPI*

GPIOPinConfigure (GPIO_PG1_EPI0S10);/**< 50 | PG1 | EPI0S10 */
GPIOPinConfigure (GPIO_PG0_EPI0S11);/**< 49 | PG0 | EPI0S11 */
GPIOPinTypeEPI (GPIO_PORTG_base、EP_PORTG_Pins);/**<初版端口 G como EPI*

GPIOPinConfigure (GPIO_PM3_EPI0S12);/**< 75 | PM3 | EPI0S12 */
GPIOPinConfigure (GPIO_PM2_EPI0S13);/**< 76 | PM2 | EPI0S13 */
GPIOPinConfigure (GPIO_PM1_EPI0S14);/**< 77 | PM1 | EPI0S14 */
GPIOPinConfigure (GPIO_PM0_EPI0S15);/**< 78 | PM0 | EPI0S15 */
GPIOPINTypeEPI (GPIO_PORTM_BASE、EPI_PORTM_Pins);/**<初值端口 M como EPI*

GPIOPinConfigure (GPIO_PL0_EPI0S16);/**< 81 | PL0 | EPI0S16 */
GPIOPinConfigure (GPIO_PL1_EPI0S17);/**< 82 | PL1 | EPI0S17 */
GPIOPinConfigure (GPIO_PL2_EPI0S18);/**< 83 | PL2 | EPI0S18 */
GPIOPinConfigure (GPIO_PL3_EPI0S19);/**< 84 | PL3 | EPI0S19 */
GPIOPinTypeEPI (GPIO_PORTL_base、EPI_PORTL_PINS);/**<初值端口 A L COMO EPI*

GPIOPinConfigure (GPIO_PB3_EPI0S28);/**< 92 | PB3 | EPI0S28 */
GPIOPinTypeEPI (GPIO_PORTB_BASE、EP_PORTB_PINS);/**< iniciza porta B como EPI*

GPIOPinConfigure (GPIO_PN2_EPI0S29);/**< 109 | PN2 | EPI0S29 */
GPIOPinConfigure (GPIO_PN3_EPI0S30);/**< 110 | PN3 | EPI0S30 */
GPIOPinTypeEPI (GPIO_PORTN_BASE、EP_PORTN_PINS);/**<初值端口 N COMO EPI*

GPIOPinConfigure (GPIO_PK5_EPI0S31);/**< 62 | PK5 | EPI0S31 */
GPIOPinTypeEPI (GPIO_PORTK_base、EPI_PORTK_PINS);/**<初值端口 K como EPI*

EPIDividerSet (EPI0_BASE、1);/**<配置基本时钟去 EPI*

EPIModeSet (EPI0_BASE、EPI_MODE_SDRAM);/**<配置 EPI COMO SDRAM*

EPIConfigSDRAMSet (EPI0_BASE、(EPI_SDRAM_CORE_FREQ_50_100 |
EPI_SDRAM_FULL_POWER | EPI_SDRAM_SIZE 64MBIT)、468);/**<

256MB A 时钟*/ EPIMapAddressSet (EPI0_BASE、EPIADDR_SIZE | EPIREG_RAM_SDRAM_SDRAM| EPIRAM_REGAURAM*

+ 6)


*+ EPIRAM_REGOR_ADDR_6 + máximo μ configuração μ s + ENCO_ADDR_ORTS_RAM*+ S + ENCO_ADDR_RAM*+ S + S + ENTR_ADDR_RAM* 1 (1)+ S + S + ENCO_ADDR_RA

当      SDRAM_INIT  直接从 main 调用时、该初始化序列工作正常、 但我们需要在 C Runtime  初始化之前执行该操作 、以便将其用于静态变量。 适当的链接器设置

我问    在 C 运行时 初始化之前是否无法调用这些"GPIO"函数  ?


 在  C Runtime 初始化之前,是否有其它方法初始化引脚以启用外部存储器。

 

 

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否可以改用 Startup.firstFxns? 这些函数在引导过程的稍后部分被调用。

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

      RAM 设置的函数 错误,缺少 “SysCtlPeripheralEnable”调用

    现在 、它充当   "用户复位功能"

    因此 可以 在 main()之前使用 GPIO 功能。

    void SDRAM_init (void)

    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOG);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOH);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOJ);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOK);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOL);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOM);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPION);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOP);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOQ);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOR);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIO);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOT);

    SysCtlPeripheralEnable (SYSCTL_Periph_EPI0);/**<驱动 EPI0 0xf0001000 *

    //GPIOPinTypeEPI (GPIO_Porth_BASE、EPI_Porth_Pins);/**< iniciza porta H como EPI *

    GPIOPinConfigure (GPIO_PH0_EPI0S0);/**< 29| PH0|EPI0S0 */
    GPIOPinConfigure (GPIO_PH1_EPI0S1);/**< 30| PH1|EPI0S1 */
    GPIOPinConfigure (GPIO_PH2_EPI0S2);/**< 31| PH2|EPI0S2 */
    GPIOPinConfigure (GPIO_PH3_EPI0S3);/**< 32| PH3|EPI0S3 */

    GPIOPinTypeEPI (GPIO_Porth_BASE、EPI_Porth_Pins);/**< iniciza porta H como EPI *

    GPIOPinConfigure (GPIO_PC7_EPI0S4);/**< 22 | PC7 | EPI0S4 */
    GPIOPinConfigure (GPIO_PC6_EPI0S5);/**< 23 | PC6 | EPI0S5 */
    GPIOPinConfigure (GPIO_PC5_EPI0S6);/**< 24 | PC5 | EPI0S6 */
    GPIOPinConfigure (GPIO_PC4_EPI0S7);/**< 25 | PC4 | EPI0S7 */
    GPIOPinTypeEPI (GPIO_PORTC_BASE、EP_PORTC_Pins);/**<初值端口 A C como EPI *


    GPIOPinConfigure (GPIO_PA6_EPI0S8);/**< 40 | PA6 | EPI0S8 */
    GPIOPinConfigure (GPIO_PA7_EPI0S9);/**< 41 | PA7 | EPI0S9 */
    GPIOPinTypeEPI (GPIO_Porta_base、EPI_Porta_Pins);/**<初值端口 A COMO EPI *

    GPIOPinConfigure (GPIO_PG1_EPI0S10);/**< 50 | PG1 | EPI0S10 */
    GPIOPinConfigure (GPIO_PG0_EPI0S11);/**< 49 | PG0 | EPI0S11 */
    GPIOPinTypeEPI (GPIO_PORTG_base、EP_PORTG_Pins);/**<初版端口 G como EPI *

    GPIOPinConfigure (GPIO_PM3_EPI0S12);/**< 75 | PM3 | EPI0S12 */
    GPIOPinConfigure (GPIO_PM2_EPI0S13);/**< 76 | PM2 | EPI0S13 */
    GPIOPinConfigure (GPIO_PM1_EPI0S14);/**< 77 | PM1 | EPI0S14 */
    GPIOPinConfigure (GPIO_PM0_EPI0S15);/**< 78 | PM0 | EPI0S15 */
    GPIOPinTypeEPI (GPIO_PORTM_BASE、EPI_PORTM_Pins);/**<初值分析端口 M como EPI *

    GPIOPinConfigure (GPIO_PL0_EPI0S16);/**< 81 | PL0 | EPI0S16 */
    GPIOPinConfigure (GPIO_PL1_EPI0S17);/**< 82 | PL1 | EPI0S17 */
    GPIOPinConfigure (GPIO_PL2_EPI0S18);/**< 83 | PL2 | EPI0S18 */
    GPIOPinConfigure (GPIO_PL3_EPI0S19);/**< 84 | PL3 | EPI0S19 */
    GPIOPinTypeEPI (GPIO_PORTL_base、EPI_PORTL_PINS);/**<初值端口 A L COMO EPI *

    GPIOPinConfigure (GPIO_PB3_EPI0S28);/**< 92 | PB3 | EPI0S28 */
    GPIOPinTypeEPI (GPIO_PORTB_BASE、EP_PORTB_PINS);/**< iniciza porta B como EPI *

    GPIOPinConfigure (GPIO_PN2_EPI0S29);/**< 109 | PN2 | EPI0S29 */
    GPIOPinConfigure (GPIO_PN3_EPI0S30);/**< 110 | PN3 | EPI0S30 */
    GPIOPinTypeEPI (GPIO_PORTN_BASE、EP_PORTN_PINS);/**<初值端口 N COMO EPI *

    GPIOPinConfigure (GPIO_PK5_EPI0S31);/**< 62 | PK5 | EPI0S31 */
    GPIOPinTypeEPI (GPIO_PORTK_base、EPI_PORTK_PINS);/**<初值端口 K como EPI *

    EPIDividerSet (EPI0_BASE、1);/**<配置基本时钟去 EPI *

    EPIModeSet (EPI0_BASE、EPI_MODE_SDRAM);/**<配置 EPI COMO SDRAM *

    EPIConfigSDRAMSet (EPI0_BASE、(EPI_SDRAM_CORE_FREQ_50_100 |
    EP_SDRAM_FULL_POWER | EPI_SDRAM_SIZE 64MBIT)、468);/**<配置时钟*

    EPIAddressMapSet (EPI0_BASE、EPI_ADDR_RAM_SIZE_256MB | EPI_ADDR_RAM_BASE_6);/**<配置 tamanho máximo da SDRAM *

    while (HWREG (EPI0_BASE + EPI_O_STAT)& EPI_STAT_INITSEQ){_nop ();}/**< aguarda status de configuração dos registradores */