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

[复制链接]
 楼主| 今晚打老虎 发表于 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寄存器一样了
myxiaonia 发表于 2014-10-23 10:19 | 显示全部楼层
其实这里最大的问题是  为何不用spi硬件操作而是用的模拟方法
gwnpeter 发表于 2014-10-23 21:31 | 显示全部楼层
myxiaonia 发表于 2014-10-23 10:19
其实这里最大的问题是  为何不用spi硬件操作而是用的模拟方法

哈哈,就是,怎么不用硬件spi?
拿起书本 发表于 2014-10-27 15:21 | 显示全部楼层
编译器的效率直接影响着系统的性能,直接进行寄存器位操作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

96

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部