TI-MCU专区

TI M3 GPIO最快速度是多少?

发布日期:2011/11/12

                                     格芯单片机原创文章,转载请注明出处!

______________________________________________________________________

经常有人问我 TI M3 GPIO的最快速度是多少?

以前也虽用GPIO模拟BUS来驱动LCD等,但还真没有测试过GPIO的最快速度,只是感觉很快,具体多快,就说不上来了。

所以,今天特意测试不同情况下GPIO的速度。

测试条件

1. TI 9B96开发板1

2. 逻辑分析仪1

    如程序清单 11所示,在初始化GPIO后,在主循环里不停翻转IO状态,然后用逻辑分析捕捉,测量IO的翻转时间。

    

程序清单 11 实例程序

/***************************************************************************************

    宏定义

***************************************************************************************/

// #define     LED_BASE        GPIO_PORTB_AHB_BASE

#define     LED_BASE        GPIO_PORTB_BASE

#define     LED             GPIO_PIN_0                  // 定义LED

/***************************************************************************************

函数名称: int main (void)

函数功能:

输入参数:

输出参数:

***************************************************************************************/

int main(void)

{

    SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |

                        SYSCTL_XTAL_16MHZ);

    // Enable processor interrupts.

    IntMasterEnable();

    //

    // Enable the peripherals used by this example.

    //

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);

// 如果是AHB总线,需要先使能AHB

    #if (LED_BASE == GPIO_PORTB_AHB_BASE)

    SysCtlGPIOAHBEnable(SYSCTL_PERIPH_GPIOB);

    #endif

    

    // LED为输出    

    GPIOPinTypeGPIOOutput(LED_BASE, LED);

    while(1)

    {

        HWREG(LED_BASE + (GPIO_O_DATA + (LED << 2))) = 0xff;      (L1)

        HWREG(LED_BASE + (GPIO_O_DATA + (LED << 2))) = 0x00;     (L2)

        HWREG(LED_BASE + (GPIO_O_DATA + (LED << 2))) = 0xff;

        HWREG(LED_BASE + (GPIO_O_DATA + (LED << 2))) = 0x00;

        HWREG(LED_BASE + (GPIO_O_DATA + (LED << 2))) = 0xff;

        HWREG(LED_BASE + (GPIO_O_DATA + (LED << 2))) = 0x00;

        HWREG(LED_BASE + (GPIO_O_DATA + (LED << 2))) = 0xff;

        HWREG(LED_BASE + (GPIO_O_DATA + (LED << 2))) = 0x00;

        HWREG(LED_BASE + (GPIO_O_DATA + (LED << 2))) = 0xff;

        HWREG(LED_BASE + (GPIO_O_DATA + (LED << 2))) = 0x00;

        HWREG(LED_BASE + (GPIO_O_DATA + (LED << 2))) = 0xff;

        HWREG(LED_BASE + (GPIO_O_DATA + (LED << 2))) = 0x00;

        HWREG(LED_BASE + (GPIO_O_DATA + (LED << 2))) = 0xff;

        HWREG(LED_BASE + (GPIO_O_DATA + (LED << 2))) = 0x00;

        HWREG(LED_BASE + (GPIO_O_DATA + (LED << 2))) = 0xff;

        HWREG(LED_BASE + (GPIO_O_DATA + (LED << 2))) = 0x00;

        HWREG(LED_BASE + (GPIO_O_DATA + (LED << 2))) = 0xff;

        HWREG(LED_BASE + (GPIO_O_DATA + (LED << 2))) = 0x00;

        HWREG(LED_BASE + (GPIO_O_DATA + (LED << 2))) = 0xff;

        HWREG(LED_BASE + (GPIO_O_DATA + (LED << 2))) = 0x00;

    }

}

为了提过GPIO的速度,在对GPIO操作时,本人没有使用现成的驱动库函数,而是使用直接对寄存器操作的方式,如程序清单 11 (L1) (L2)所示。

本人使用的是MDK的开发环境,在进入调试调试模式后,可以在汇编窗口,看到C语言所对应的汇编语句,如图 11所示。

图 11 MDK开发环境

 

程序清单 12所示,每次对GPIO操作,翻译成汇编是2条指令。

假设GPIO的速度足够快的情况下,如果是80M的主频,2条指令的执行时间应该是25ns,那么,GPIO 由低变高,再由高变低,一个周期的时间应该是50ns

程序清单 12 汇编代码

    65:         HWREG(LED_BASE + (GPIO_O_DATA + (LED << 2))) = 0xff; 

0x00000204 F04F00FF  MOV      r0,#0xFF

0x00000208 6048      STR      r0,[r1,#0x04]

    66:         HWREG(LED_BASE + (GPIO_O_DATA + (LED << 2))) = 0x00; 

    67:  

0x0000020A F04F0000  MOV      r0,#0x00

0x0000020E 6048      STR      r0,[r1,#0x04]

 

我们知道,LM3S9B90 GPIO可以挂在APBAHB总线,按理说如果GPIOAHB总线速度要快。但是测试的结果是,无论挂APB总线或是挂AHB总线,GPIO 由低变高,再由高变低,一个周期的时间是一样的。

 

表 11 为GPIO由高变低,再由低变高一个周期所用时间的测试报告

表 11 GPIO测试

条件

指令条数

单条指令时间

GPIO翻转时间

80M  AHB

4

12.5 ns 

50 ns

80M  APB

4

12.5 ns

50 ns

50M  AHB

4

20 ns

80 ns

50M  APB

4

20 ns

80 ns

所以,我们可以得出结论,TI M3 GPIO 操作所用时间为2个指令周期。

 

相关资料

——————————————————————————————————————

   TI M3 GPIO最快速度是多少?---测试代码