четверг, 6 февраля 2014 г.

Отладка на LaunchPad

В процессе изучения разработки на LauncPad мне очень понравилась возможность отладки кода на микроконтроллере. Пока что пробовал в Keil, но думаю, что в CCS по аналогии.


Ниже простой пример. Мигает зеленый светодиод, пока нажата кнопка SW1.

#include "../tm4c123gh6pm.h"

void PortF_Init(void);
void delay(unsigned long halfsecs);

int main(void) {
  unsigned long SW1; // input from PF4

  PortF_Init();

  while (1) {
    GPIO_PORTF_DATA_R &= ~0x08;
    do {
      SW1 = GPIO_PORTF_DATA_R & 0x10; // PF4 into SW1
    } while (SW1);

    do {
      // Invert green light
      GPIO_PORTF_DATA_R ^= 0x08;
            
      delay(1);
      SW1 = GPIO_PORTF_DATA_R & 0x10; // PF4 into SW1
    } while (!SW1);
  }
}

// Init port F (PF4 - !in, PF3 - out)
void PortF_Init(void) {
  volatile unsigned long delay;
  SYSCTL_RCGC2_R |= 0x00000020;     // 1) F clock
  delay = SYSCTL_RCGC2_R;           // delay
  GPIO_PORTF_CR_R |= 0x18;          // allow changes to PF4-3
  GPIO_PORTF_AMSEL_R &= ~0x18;      // 3) disable analog function
  GPIO_PORTF_PCTL_R &= 0x00000000;  // 4) GPIO clear bit PCTL
  GPIO_PORTF_DIR_R &= ~0x10;        // 5.1) PF4 input,
  GPIO_PORTF_DIR_R |= 0x08;         // 5.2) PF3 output
  GPIO_PORTF_AFSEL_R &= ~0x18;      // 6) no alternate function
  GPIO_PORTF_PUR_R |= 0x10;         // enable pullup resistors on PF4
  GPIO_PORTF_DEN_R |= 0x18;         // 7) enable digital pins PF4-PF3
}

void delay(unsigned long time) {
  unsigned long i;
  while (time > 0) {
    i = 1234567;
    while(i > 0){
      i = i - 1;
    }
    time = time - 1;
  }
}


Вот, например, что получается, если поставить привычный брэкпоинт.