资料目录
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可以挂在APB与AHB总线,按理说如果GPIO挂AHB总线速度要快。但是测试的结果是,无论挂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最快速度是多少?---测试代码