2016-11-03 8 views
1

내 ST32L c 애플리케이션에서 깜박이는 LED의 속도를 높이고 싶습니다. 아래 코드를 사용하면 버튼을 누르면 LED가 빠르게 깜박입니다. 놓으면 LED가 정상적으로 깜박입니다.2 초 후에 LED가 깜박입니다.

단추를 최소 2 초 동안 누른 다음 LED가 빨라지는 것을 어떻게 확인할 수 있습니까?

int i = 0; 
    while (1) { 
     bool wasSwitchClosedThisPeriod = false; 
     while (i++ < speed) { 
      // Poll the switch to see if it is closed. 
      // The Button is pressed here 
      if ((*(int*)(0x40020010) & 0x0001) != 0) { 
       wasSwitchClosedThisPeriod = true; 
      } 
     } 
     // Blinking led 
     *(int*) (0x40020414) ^= 0xC0; 

     i = 0; 

     if (wasSwitchClosedThisPeriod) { 

      speed = speed * 2; 

      if (speed > 400000) { 

       speed = 100000; 
      } 
     } 
    } 

답변

1

마이크로 컨트롤러의 온칩 하드웨어 타이머를 사용해야합니다. 가장 쉬운 방법은 매 x 시간 단위마다 카운터를 증가시키는 반복 타이머를 갖는 것입니다. 타이머 ISR이 단추 포트를 폴링하도록하십시오. 버튼이 비활성 상태이면 카운터를 재설정하고 그렇지 않으면 버튼을 증가시킵니다. 예 :

static volatile uint16_t button_count = 0; 

void timer_isr (void) // called once per 1ms or so 
{ 
    // clear interrupt source here 

    if((button_port & mask) == 0) 
    { 
    button_count = 0; 
    } 
    else 
    { 
    if(button_count < MAX) 
    { 
     button_count++; 
    } 
    } 
} 

... 

if(button_count > 2000) 
{ 
    change speed 
} 

이렇게하면 신호가 자유롭게 해제되는 신호가 수신됩니다. De-bouncing은 항상 가지고 있어야하며 현재 코드에는 부족한 것처럼 보입니다.

1

ISR이 없으면 최소 시간 (경과 시간 (몇 밀리 초 동안 대기/대기/지연)) 및 카운터를 보장하는 루프가 있어야합니다.