[讨论] GPIO挂载到AHB总线上的疑问

calom1992   2014-8-30 21:36 楼主
各位坛友大家好,我三天前拿到TM4C 123G H6PM这个板子,因为要做一个无线传图的东西,其中要驱动摄像头,需要较快的IO变换速度。现在遇到一些疑问,希望大神能够提供帮助。
主要问题,就是IO口的翻转速度太慢。我对培训视频的理解是,如果将IO口外设挂载到高速总线上,则IO的翻转和CPU内核是同步的,即使挂载到低速总线上,翻转速度至少也是主频的一半。
当我把时钟配置到80M,主函数大循环只做一件事,就是翻转IO口电平,代码如下:
SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);


SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_1 );

while(1)
{
    GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_1,2);
    GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_1,0);

}
在示波器上观察IO口输出的波形,发现频率仅仅只有2.3Mhz。即使考虑到库函数的一些效率损失,则最少也应该有20M以上的翻转速度啊。
有知道的大神吗?求给一个建议。

回复评论 (7)

首先,你得明白M4内核1条指令周期等于3条机器周期,所以一条指令周期是80M/3=26.6M,然后,你没挂在AHB总线上,所以26.6M/2=13.3M,然后,你一高一低两条指令,所以13.3/2=6.66M。剩下的问题应该在库函数上了,你调用一条库函数,库函数里不一定只有1条指令。我试了GPIO的翻转速度是3.8M。。
你可以用PWM模块驱动的呀。。我试了10M,20M都可以,就是高频时候波形有明显失真。
点赞  2014-8-30 22:08
引用: Linchpin 发表于 2014-8-30 22:08
首先,你得明白M4内核1条指令周期等于3条机器周期,所以一条指令周期是80M/3=26.6M,然后,你没挂在AHB总线 ...

谢谢指点! 那把它挂在到AHB总线上应该怎么修改?即使这样,翻转速度也只有7.2M左右是嘛?有什么办法能让IO口反转速度达到20M以上呢?
点赞  2014-8-30 22:15
引用: calom1992 发表于 2014-8-30 22:15
谢谢指点! 那把它挂在到AHB总线上应该怎么修改?即使这样,翻转速度也只有7.2M左右是嘛?有什么办法能让 ...

SysCtlGPIOAHBEnable(GPIO_PORTC_BASE);//挂在AHB高性能总线上

方法我上面已经说了吧。用PWM驱动,别用IO口
点赞  2014-8-30 22:37
引用: Linchpin 发表于 2014-8-30 22:37
SysCtlGPIOAHBEnable(GPIO_PORTC_BASE);//挂在AHB高性能总线上

方法我上面已经说了吧。用PWM驱动,别 ...

谢谢!用pwm驱动不是智能输出pwm波嘛?我要自己控制高低电平,不是pwm波哦。
点赞  2014-8-30 23:05
引用: Linchpin 发表于 2014-8-30 22:37
SysCtlGPIOAHBEnable(GPIO_PORTC_BASE);//挂在AHB高性能总线上

方法我上面已经说了吧。用PWM驱动,别 ...

刚好看到这个帖子,试了一下,IO口的反转速度没什么改善啊,还是2.2多M
下面是测试程序:
void main(void) {
        SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
        SysCtlGPIOAHBEnable(SYSCTL_PERIPH_GPIOB);

        GPIOPinTypeGPIOOutput(GPIO_PORTB_AHB_BASE, GPIO_PIN_1);
        while(1)
        {
                GPIOPinWrite(GPIO_PORTB_AHB_BASE,GPIO_PIN_1,2);
                GPIOPinWrite(GPIO_PORTB_AHB_BASE,GPIO_PIN_1,0);
        }
}
不知道哪里写错了,还请指点一下~

点赞  2014-9-3 15:35
引用: calom1992 发表于 2014-8-30 23:05
谢谢!用pwm驱动不是智能输出pwm波嘛?我要自己控制高低电平,不是pwm波哦。

液晶屏一般用驱动芯片刷吧…还是说想要不会闪屏?
点赞  2014-9-3 23:07
引用: Linchpin 发表于 2014-8-30 22:37
SysCtlGPIOAHBEnable(GPIO_PORTC_BASE);//挂在AHB高性能总线上

方法我上面已经说了吧。用PWM驱动,别 ...

使能函数这么用对吗?头文件中是这样定义SysCtlGPIOAHBEnable的 头文件.png
点赞  2016-7-15 16:34
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复