这里我使用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;
}
答案 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时进行中断。