打印
[STM32F0]

怎样处理才能使GPIO的操作速度最快

[复制链接]
1492|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
今晚打老虎|  楼主 | 2014-10-22 18:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教各位大虾,怎样才能提高GPIO的操作速度?
芯片选用的是:STM32F072C8

原来的程序如下:

#define                HC595_DATA_HI                GPIOB->BSRR |= (1<<HC595_DATA)
#define                HC595_DATA_LO                GPIOB->BRR  |= (1<<HC595_DATA)

#define                HC595_CLK_HI                       GPIOB->BSRR |= (1<<HC595_CLK)
#define                HC595_CLK_LO                GPIOB->BRR  |= (1<<HC595_CLK)

void Handle74HC595(uint8_t tTmp)
{
        uint8_t tCnt;
        for(tCnt = 0; tCnt<8; tCnt++)
        {
                if(tTmp&0x01)
                {
                        HC595_DATA_HI;
                        __nop();
                }
                else
                {
                        HC595_DATA_LO;
                        __nop();
                }
                __nop();
                HC595_CLK_LO;
                __nop();
                HC595_CLK_HI;
                tTmp >>= 1;
        }
}


以下是我新改的:
void Handle74HC595(register uint8_t tTmp)
{
        if(tTmp&0x01)
        {
                HC595_DATA_HI;        __nop();
        }
        else
        {
                HC595_DATA_LO;        __nop();
        }
        HC595_CLK_LO;                __nop();
        HC595_CLK_HI;                __nop();

        if(tTmp&0x02)
        {
                HC595_DATA_HI;        __nop();
        }
        else
        {
                HC595_DATA_LO;        __nop();
        }
        HC595_CLK_LO;                __nop();
        HC595_CLK_HI;                __nop();

        if(tTmp&0x04)
        {
                HC595_DATA_HI;        __nop();
        }
        else
        {
                HC595_DATA_LO;        __nop();
        }
        HC595_CLK_LO;                __nop();
        HC595_CLK_HI;                __nop();

        if(tTmp&0x08)
        {
                HC595_DATA_HI;        __nop();
        }
        else
        {
                HC595_DATA_LO;        __nop();
        }
        HC595_CLK_LO;                __nop();
        HC595_CLK_HI;                __nop();
       
        if(tTmp&0x10)
        {
                HC595_DATA_HI;        __nop();
        }
        else
        {
                HC595_DATA_LO;        __nop();
        }
        HC595_CLK_LO;                __nop();
        HC595_CLK_HI;                __nop();
       
        if(tTmp&0x20)
        {
                HC595_DATA_HI;        __nop();
        }
        else
        {
                HC595_DATA_LO;        __nop();
        }
        HC595_CLK_LO;                __nop();
        HC595_CLK_HI;                __nop();
       
        if(tTmp&0x40)
        {
                HC595_DATA_HI;        __nop();
        }
        else
        {
                HC595_DATA_LO;        __nop();
        }
        HC595_CLK_LO;                __nop();
        HC595_CLK_HI;                __nop();
       
        if(tTmp&0x80)
        {
                HC595_DATA_HI;        __nop();
        }
        else
        {
                HC595_DATA_LO;        __nop();
        }
        HC595_CLK_LO;                __nop();
        HC595_CLK_HI;                __nop();
}

谢谢!



沙发
mmuuss586| | 2014-10-22 19:08 | 只看该作者
define                HC595_DATA_HI                GPIOB->BSRR |= (1<<HC595_DATA)
#define                HC595_DATA_LO                GPIOB->BRR  |= (1<<HC595_DATA)

#define                HC595_CLK_HI                       GPIOB->BSRR |= (1<<HC595_CLK)
#define                HC595_CLK_LO                GPIOB->BRR  |= (1<<HC595_CLK)
这几句可以再优化下;
每次操作,都要移位,也要时间的;

使用特权

评论回复
板凳
sun1238898| | 2014-10-22 19:18 | 只看该作者
直接寄存器位操作,然后编译器优化打到最高,就可以了。

使用特权

评论回复
地板
myxiaonia| | 2014-10-23 10:17 | 只看该作者
mmuuss586 发表于 2014-10-22 19:08
define                HC595_DATA_HI                GPIOB->BSRR |= (1

这里不需要或操作直接赋值,brr和bsrr寄存器专为互斥io口操作而准备的,这里用或操作不是和操作odr寄存器一样了

使用特权

评论回复
5
myxiaonia| | 2014-10-23 10:19 | 只看该作者
其实这里最大的问题是  为何不用spi硬件操作而是用的模拟方法

使用特权

评论回复
6
gwnpeter| | 2014-10-23 21:31 | 只看该作者
myxiaonia 发表于 2014-10-23 10:19
其实这里最大的问题是  为何不用spi硬件操作而是用的模拟方法

哈哈,就是,怎么不用硬件spi?

使用特权

评论回复
7
拿起书本| | 2014-10-27 15:21 | 只看该作者
编译器的效率直接影响着系统的性能,直接进行寄存器位操作。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

94

帖子

1

粉丝