让微控制器在等待时始终注意按下按钮(延迟)

时间:2016-02-14 21:07:00

标签: c button wait microcontroller stm32

这里我使用stm32l发现微控制器。 首先,我为leds和用户按钮初始化gpio端口的端口。

我现在正在工作,我现在的小程序让LED闪烁。 每次按下按钮,等待时间会变长,导致LED闪烁时间变长。现在的问题是,只要等待时间超过4秒或更长时间,微控制器就会注意到按下按钮。 有没有办法让它始终注意到按下按钮

int main(void) {
        char *RCCp = (char*) 0x40023800;
        int *PAp = (int *) 0x40020000;
        int *PBp = (int *) 0x40020400;

        // RCC Config
        *((int*) (RCCp + 28)) |= 0x3f;
        *((int*) (RCCp + 32)) |= 1;

    // Pin config
        *PBp = 0x5000;
        *PAp = 0x0000;

        int speed = 100000;

            int i = 0;
            while (1) {
                while (i++ < speed); // Waiting time
                *(int*) (0x40020414) ^= 0xC0; 

                i = 0;

                if ((*(int*) (0x40020010) & 0x0001) != 0x0) {

                    speed = speed * 2;

                    if (speed > 400000) {

                        speed = 100000;
                    }

                }

            }


        return 0;
    }

1 个答案:

答案 0 :(得分:3)

向前一小步是在忙等待循环中轮询交换机状态。像这样:

        int i = 0;
        while (1) {
            bool wasSwitchClosedThisPeriod = false;
            while (i++ < speed) {
                // Poll the switch to see if it is closed.
                if ((*(int*)(0x40020010) & 0x0001) != 0) {
                    wasSwitchClosedThisPeriod = true;
                }
            }

            *(int*) (0x40020414) ^= 0xC0; 

            i = 0;

            if (wasSwitchClosedThisPeriod) {

                speed = speed * 2;

                if (speed > 400000) {

                    speed = 100000;
                }

            }

        }

但仍有很大的改进空间。例如,您可能想要去抖动开关。开关数据寄存器应该是易失性的,即*(int volatile *)(0x40020010UL)。使用中断可以使代码更加灵活,高效,甚至允许您在等待时将微控制器置于休眠状态(节省电量)。如果GPIO输入引脚可以配置为中断,那么您不需要轮询开关。如果有可用的硬件定时器,那么您可以将其配置为在需要更换LED时进行中断。