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.

[参考译文] CCS/TM4C1294NCPDT:具有全局变量与局部变量的 GPIOPinWrite()

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/570621/ccs-tm4c1294ncpdt-gpiopinwrite-with-global-vs-local-variables

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

您好!

我有一个键盘来测试 SPI 设备(LSM9DS0)、在该设备上我处于"握手"阶段。 下面的代码按预期工作、但当我移动的声明时  

uint8_t cs_pins; 

进入 main()函数,它进入其中一个中的 FaultISR

while (SSIBusy (SSI2_base)); 

线。

为什么会发生这种情况? 代码如下所示... 谢谢。

#include 
#include 
#include "inc/hw_memmap.h"
#include "inc/hw_ssi.h"
#include "inc/hw_types.h"
#include "driverlib/ssi.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
;
#drixt_uncht_unt











= 32_unt pintru_syrt_uni_unt;#t_unt intru_u_unt intru_uncht_unt tru_intx32_u_u_u_u_u_u_intl?#include "u_uni_unt trl u_intxt_int_int_int_int_u_u_u_u_u_u_u_u_intl u_u_u_intl u_intxt_u_u_u_u_u_u_intl u_u_intl?#include "u_intxt_intxt_intl #include "u_intxu_intxu_u_u_int





SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
SysCtlPeripheralEnable (SYSCTL_Periph_SSI2);


GPIOPinConfigure (GPIO_PD3_SSI2CLK);
GPIOPinConfigure (GPIO_PD0_SSI2XDAT1);
GPIOPinConfigure (GPIO_PD1_SSI2XDAT0);
GPIOPinTypeSSI (GPIO_PORTD_base、
GPIO_PIN_0|GPIO_PIN_1_GPIO_PIN_3);

GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_2 | GPIO_PIN_3);



SSIConfigSetExpClk (SSI2_base、ui32SysClkFreq/100、SSI_FRF_MOTO_MODE_0、
SSI_MODE_MASTER、10000、8);

SSIEnable (SSI2_base);
// SSIAdvModeSet (SSI2_base、SSI_ADV_MODE_LEGACLEASE);

while (1)
{


GPIOPinWrite (GPIO_PORTB_BASE、cs_PINS、GPIO_PIN_2 + GPIO_PIN_3);

GPIOPinWrite (GPIO_PORTB_BASE、cs_PINS、 GPIO_PIN_3);

SSIDataPut (SSI2_base、0b10001111);
while (SSIBusy (SSI2_base));
SSIDataGet (SSI2_base、 虚拟);//清除 FIFO
while (SSIBusy (SSI2_base)的虚拟项;
SSIDataPut (SSI2_base、0b0);//清除 FIFO
while (SSIBusy (SSI2_base));
SSIDataGet (SSI2_base、&accel_data);
while (SSIBUS_BASE)

;while (SSI2_GPIO_BASE); cs_pins、GPIO_PIN_2);

SSIDataPut (SSI2_base、0b10001111);
while (SSIBusy (SSI2_base));
SSIDataGet (SSI2_base、dummy);//清除 FIFO
while (SSIBusy (SSI2_base));
SSIDataPut (SSI2_base、0b0);//

清除 FIFO while (SSIBusy (SSI2_base));SSIDataGet (SSI2_base
)(SSI2_base);while

(SSI2_date_base)、pini2_date_base (SSI2_dumb (SSI2_dumb); CS_Pins、GPIO_PIN_2 + GPIO_PIN_3);

SysCtlDelay (SysCtlClockGet ()/3);

}
返回0;
}

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

    当总线故障发生时、NVIC_BUARK_STAT 和 NVIC_FAULT_ADDR 寄存器的内容是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Amit、

    这些寄存器如下(当调试器处于 FaultISR 中时):

    NVIC_FAULT_STAT: 0x00000000

    NVIC_FAULT_ADDR:0xE000EDF8

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

    如果故障状态寄存器没有显示任何置位的位、则表示没有产生总线故障。 您可以快照您的 CCS 项目和/或附加相同的项目吗?

    另一件事是使用 API 来配置 SSI 控制器不正确

    SSIConfigSetExpClk (SSI2_base、ui32SysClkFreq/100、SSI_FRF_MOTO_MODE_0、
    SSI_MODE_MASTER、10000、8);

    必须是

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

    Amit、您好!

    我误读了 API 手册、认为 uiSSIClk 是 SPI 时钟的频率、将 ui32SysClkFreq 除以100将得到1.2MHz SPI 时钟频率。

    无论如何、我将虚拟变量的初始化从变量的指针更改为变量、代码运行正常。

    这是固定代码:

    #include 
    #include 
    #include "inc/hw_memmap.h"
    #include "inc/hw_ssi.h"
    #include "inc/hw_types.h"
    #include "driverlib/ssi.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/Syssctl.h"
    
    
    
    
    
    
    
    #include "driverlib/uartu.uarth
    
    
    ;#include "driverlib/uintuarth #intu.uarth (#idio.h)
    uint32_t accel_data = 0、gyro_data = 0;
    uint32_t dummy = 0;
    
    CS_Pins = GPIO_PIN_2 | GPIO_PIN_3;
    
    ui32SysClkFreq = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、
    120000000);
    
    
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
    SysCtlPeripheralEnable (SYSCTL_Periph_SSI2);
    
    
    GPIOPinConfigure (GPIO_PD3_SSI2CLK);
    GPIOPinConfigure (GPIO_PD0_SSI2XDAT1);
    GPIOPinConfigure (GPIO_PD1_SSI2XDAT0);
    GPIOPinTypeSSI (GPIO_PORTD_BASE、
    GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3);
    
    GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_2 | GPIO_PIN_3);
    
    
    
    SSIConfigSetExpClk (SSI2_base、ui32SysClkFreq、SSI_FRF_MOTO_MOTO_MODE_0、
    SSI_MODE_MASTER、10000、8);
    
    SSIEnable (SSI2_base);
    // SSIAdvModeSet (SSI2_base、SSI_ADV_MODE_LEGACHIED);
    
    while (1)
    {
    
    
    GPIOPinWrite (GPIO_PORTB_BASE、cs_PINS、GPIO_PIN_2 + GPIO_PIN_3);
    
    GPIOPinWrite (GPIO_PORTB_BASE、cs_PINS、GPIO_PIN_3);
    
    SSIDataPut (SSI2_base、0b10001111);
    while (SSIBusy (SSI2_base));
    SSIDataGet (SSI2_base、&dummy);//清除 FIFO 的虚拟项目
    while (SSIBusy (SSI2_base));
    SSIDataPut (SSI2_base、0b0);//清除 FIFO 的虚拟内容
    while (SSIBusy (SSI2_base));
    SSIDataGet (SSI2_base、accel_data);
    while (SSIBusy (SSI2_base));
    
    GPIOPinWrite (GPIO_PORTB_BASE、cs_PINS、GPIO_PIN_2);
    
    SSIDataPut (SSI2_base、0b10001111);
    while (SSIBusy (SSI2_base));
    SSIDataGet (SSI2_base、&dummy);//清除 FIFO 的虚拟项目
    while (SSIBusy (SSI2_base));
    SSIDataPut (SSI2_base、0b0);//清除 FIFO 的虚拟内容
    while (SSIBusy (SSI2_base));
    SSIDataGet (SSI2_base、&gyro_data);
    while (SSIBusy (SSI2_base));
    
    GPIOPinWrite (GPIO_PORTB_BASE、cs_PINS、GPIO_PIN_2 + GPIO_PIN_3);
    
    SysCtlDelay (SysCtlClockGet ()/3);
    
    }
    返回0;
    } 

    而这个是有故障的:

    #include 
    #include 
    #include "inc/hw_memmap.h"
    #include "inc/hw_ssi.h"
    #include "inc/hw_types.h"
    #include "driverlib/ssi.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/Syssctl.h"
    
    
    
    
    
    
    
    #include "driverlib/uartu.uarth
    
    
    ;#include "driverlib/uintuarth #intu.uarth (#idio.h)
    uint32_t accel_data = 0、gyro_data = 0;
    uint32_t *虚拟;
    
    CS_Pins = GPIO_PIN_2 | GPIO_PIN_3;
    
    ui32SysClkFreq = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、
    120000000);
    
    
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
    SysCtlPeripheralEnable (SYSCTL_Periph_SSI2);
    
    
    GPIOPinConfigure (GPIO_PD3_SSI2CLK);
    GPIOPinConfigure (GPIO_PD0_SSI2XDAT1);
    GPIOPinConfigure (GPIO_PD1_SSI2XDAT0);
    GPIOPinTypeSSI (GPIO_PORTD_BASE、
    GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3);
    
    GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_2 | GPIO_PIN_3);
    
    
    
    SSIConfigSetExpClk (SSI2_base、ui32SysClkFreq、SSI_FRF_MOTO_MOTO_MODE_0、
    SSI_MODE_MASTER、10000、8);
    
    SSIEnable (SSI2_base);
    // SSIAdvModeSet (SSI2_base、SSI_ADV_MODE_LEGACHIED);
    
    while (1)
    {
    
    
    GPIOPinWrite (GPIO_PORTB_BASE、cs_PINS、GPIO_PIN_2 + GPIO_PIN_3);
    
    GPIOPinWrite (GPIO_PORTB_BASE、cs_PINS、GPIO_PIN_3);
    
    SSIDataPut (SSI2_base、0b10001111);
    while (SSIBusy (SSI2_base));
    SSIDataGet (SSI2_base、dummy);//清除 FIFO 的虚拟内容
    while (SSIBusy (SSI2_base));
    SSIDataPut (SSI2_base、0b0);//清除 FIFO 的虚拟内容
    while (SSIBusy (SSI2_base));
    SSIDataGet (SSI2_base、accel_data);
    while (SSIBusy (SSI2_base));
    
    GPIOPinWrite (GPIO_PORTB_BASE、cs_PINS、GPIO_PIN_2);
    
    SSIDataPut (SSI2_base、0b10001111);
    while (SSIBusy (SSI2_base));
    SSIDataGet (SSI2_base、dummy);//清除 FIFO 的虚拟内容
    while (SSIBusy (SSI2_base));
    SSIDataPut (SSI2_base、0b0);//清除 FIFO 的虚拟内容
    while (SSIBusy (SSI2_base));
    SSIDataGet (SSI2_base、&gyro_data);
    while (SSIBusy (SSI2_base));
    
    GPIOPinWrite (GPIO_PORTB_BASE、cs_PINS、GPIO_PIN_2 + GPIO_PIN_3);
    
    SysCtlDelay (SysCtlClockGet ()/3);
    
    }
    返回0;
    } 

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

    很高兴代码现在可以为您工作。