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总线上导致程序进入FaultISR的问题

Other Parts Discussed in Thread: TM4C123GH6PM

今天写了一个程序,是关于外接DAC输出电压,ADC采样,再LCD12864显示的一个程序。然后就一直进入FaultISR,查了半天,问题竟然出自SysCtlGPIOAHBEnable(GPIO_PORTC_BASE);这句。。

因为要让DAC采样频率快点,所以把DAC的引脚挂AHB总线上。。但是我单独的DAC采样程序,挂AHB总线没问题。。

不知道是什么原因,忘高手解答。

  • 1. GPIO挂在哪个总线上不影响ADC的采样速度,默认值是最高值,是1M。

    2.楼主试试在SysCtlGPIOAHBEnable(GPIO_PORTC_BASE);这句话后面加一个SysCtlDelay(5);然后试一下。

    不行把源码贴上来一起看看吧

  • 不是ADC的采样速率,,是外接DAC的速率,用的IO口模拟SPI的通信方式。

  • 一个外设使能后要经过几个时钟周期后才可以访问,否则会触发硬件错误。

    先加个延迟试试,不行把代码都贴上来看看。

    另,如果是SPI接口,使用SSI来做会更快。

  • 不会呀。。我用示波器测了 IO口的最快频率(时钟频率80M)是7.58MHZ(这个问题我也想问,为什么IO口速度只有这么慢,而且挂AHB总线和挂APB总线一样)

    而我测的SPI最高发送速率是6.42MHZ(发送4位),那就是25M的位速率喽。

    但是外接DAC(TLV5618)发送数据只能一位一位发,因为是同步的,发一位数据就得来一个时钟信号。。而SPI又是一次最少发四位,所以只能四位当一位用喽,所以SPI的速度没有IO口模拟快喽。

  • 这是我测试IO口速度的代码:

    /*******************************************
    开发坏境:CCSv5.4
    开发板:TIVA C Launchpad(TM4C123GH6PM)
    程序功能:测试GPIO速度
    程序说明:GPIO翻转频率3.79MHZ(一高一低),即GPIO频率为7.58MHZ,
    编程者:Linchpin
    ********************************************/
    #include <stdint.h>
    #include <stdbool.h>
    #include "inc/tm4c123gh6pm.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/gpio.h"

    int main(void)
    {

    SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_10MHZ|SYSCTL_OSC_MAIN);
    //SysCtlClockGet();
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);//使能GPIO外设
    SysCtlGPIOAHBEnable(GPIO_PORTC_BASE);//挂在AHB高性能总线上
    GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_4);
    while(1)
    {
    GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_4, GPIO_PIN_4);
    GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_4, ~GPIO_PIN_4);
    }

    }




  • 这是测试SPI速度的程序:

    /*******************************************
    开发坏境:CCSv5.4
    开发板:TIVA C Launchpad(TM4C123GH6PM)
    程序功能:SSI,发送数据(SPI协议)
    程序说明:SPI最高发送速率6.42MHZ
    编程者:Linchpin
    ********************************************/
    #include <stdint.h>
    #include <stdbool.h>
    #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"
    #include "driverlib/sysctl.h"

    int main(void)
    {
    SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_10MHZ);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI1);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    SysCtlGPIOAHBEnable(GPIO_PORTF_BASE);//挂在AHB高性能总线上

    GPIOPinConfigure(GPIO_PF2_SSI1CLK);
    GPIOPinConfigure(GPIO_PF3_SSI1FSS);
    GPIOPinConfigure(GPIO_PF1_SSI1TX);
    GPIOPinTypeSSI(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_2);
    //SSI1_BASE/时钟频率/时钟协议,moto代表SPI协议/工作模式:主机模式/位速率4M/数据帧位数16
    SSIConfigSetExpClk(SSI1_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_1, SSI_MODE_MASTER, 32000000, 4);
    SSIEnable(SSI1_BASE);
    while(1)
    {
    //while(SSIBusy(SSI1_BASE)) ;//不忙时跳出循环
    SSIDataPut(SSI1_BASE, 0xf);
    SSIDataPut(SSI1_BASE, 0x0);
    }
    }

  • TM4C123x的SSI最高速度为25MHz,你设置的32MHz?这样带入库函数得到速度不对的。

    另,2.1版本的SysCtlClockGet有点问题,取回来的不是真实主频。用ROM_SysCtlClockGet来获取真实主频。

  • 对啊。最高位速率是25MHZ,跟我测的一样。。但是它至少要4位一起发。但我现在只能一位一位发。。所以只能四位当一位用喽。所以速度就除以4,   6.25MHZ了。

    还有,为什么GPIO的速度只有7.58MMHZ

  • SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);

    SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_10MHZ|SYSCTL_OSC_MAIN);

    这两种配置,用ROM_SysCtlClockGet();读出来频率都是80MHZ,但是测试出来的GPIO口速度就是不一样。请问这有什么区别吗?

  • SYSCTL_XTAL_*MHZ这个参数一定要和实际使用的数值一样。

    使用其它数值可能会导致问题,详细的情况得分析一下库函数源码了。