piątek, 6 czerwca 2014

STM32F429i-Discovery USART_LED_TOG + C#

Witajcie!
W ostatnim odcinku o STM32F429i opowiedzieliśmy sobie jak odpalić uarta
na naszej płytce. Dzisiaj chciałbym troszkę zmodyfikować nasz kod a raczej
dodać do niego mruganie diodami, ale nie za pomocą micro-switcha a zrobić
sterowanie za pomocą naszego terminala, w którym dodamy sobie taką możliwość.
Będziemy wysyłać literkę przez port COM na naszą płytkę co spowoduje
zapale się diody.
Oczywiście nie użyjemy tam żadnych sztucznych opóźnień. Zrobimy to tak jak
należy:).
Kod to mrugania diody oczywiście znajduje się w jednym z poprzednich postów
wprowadzających do opisu naszej płytki STM32F429i i to ten kod użyjemy.

Ale najpierw uzbroimy nasz terminal w możliwość wysyłania własnych
znaków (stringów) przez port COM.

Jeszcze zanim dodamy przyciski do wysyłania naszych znaków, wstawimy
sobie buttonik do czyszczenia terminalu, tego w sumie mi brakowało
podczas pracy z tym terminalem.
A więc metoda drag&drop przeciągamy na naszą formatkę z ToolBoxa
buton i zmieniamy mu nazwę na "btnClear" oraz nazwę, która będzie wyświetlana
na nim na "Wyczyść".
Klikamy ppm na buttonie i przechodzimy do zdarzenia kliknięcia, w którym
napiszemy kod do wyczyszczenia tekstu z "richTextBox1".

private void btnClear_Click(object sender, EventArgs e)
{
    richTextBox1.Clear(); //czyszczenie richtexboxa
}

Teraz możemy sobie dodać dwa buttony do sterowania diodami na naszej
płytce.
Nazwiemy odpowiednio "btnRed i btnGreen", jak nazwa wskazuje jeden będzie
odpowiadał za mruganie diodą zieloną a drugi czerwoną.
Aby nasze butony ładnie wyglądały po odpaleniu naszego terminala
zmienimy im kolory.
W zdarzeniu Form1_Load dodajemy kod:
private void Form1_Load(object sender, EventArgs e)
{
    btnGreen.BackColor = Color.Green;
    btnRed.BackColor = Color.Red;
}

Podczas ładowania okna kolor tła naszych przycisków będzie miał odpowiednio
zielony i czerwony.
Wstępnie terminal powinien wyglądać tak:

OK. Jeśli mamy dodane nasze butony to oprogramujemy sobie ich zdarzenia kliknięcia.
 private void btnRed_Click(object sender, EventArgs e)
 {
        serialPort1.WriteLine("r\n\r");
 }

 private void btnGreen_Click(object sender, EventArgs e)
 {
        serialPort1.WriteLine("g\n\r");
 }

Generalnie jeśli chodzi o nasz terminal to będzie na dzień dzisiejszy tyle modyfikacji.
W przyszłości dodamy sobie możliwości wysyłania stringów zdefiniowanych przez nas,
co będzie bardziej uniwersalnym rozwiązaniem.

Ok teraz przejdziemy do kodu w C jaki zapodamy do naszego procka:
 

#include "main.h"
#include "stm32_ub_uart.h"

void Diody_Init(void);
void Delay(volatile uint32_t nCount);

int main(void)
{
  UART_RXSTATUS_t check;
  char rx_buf[RX_BUF_SIZE];

  SystemInit();

  // inicjalizacja UART (COM1 : TX=PA9, RX=PA10)
  UB_Uart_Init();
  Diody_Init();

  while(1)
  {
       check=UB_Uart_ReceiveString(COM1,rx_buf);

       if(check==RX_READY) {

      if(rx_buf[0] == 'g')
      {
        GPIOG->ODR ^= GPIO_Pin_13; // led_tog red
      }else if(rx_buf[0] == 'r')
      {
        GPIOG->ODR ^= GPIO_Pin_14; // led_tog green
      }

    }

  }
}
void Diody_Init(void) {
  GPIO_InitTypeDef GPIO_InitStructure;

  // włączenie zegara
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE); //ustawienie zegara

  // ustawienie pinów portu G
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOG, &GPIO_InitStructure);
}

void Delay(volatile uint32_t nCount) { // funkcja opóźniająca
  while(nCount--)
  {
  }
}


Myślę że kod jest czytelny i nie wymaga jakiegoś większego tłumaczenia.
W pętli głównej odbieramy literkę "r lub g" i po odebraniu po prostu zmieniamy
stan naszych diod na przeciwny.

Jeszcze krótki film pokazujący działanie naszego terminala i mruganie diodkami
na Discovery.

Link do pliku exe terminala.

Przyjemnej zabawy

Brak komentarzy:

Prześlij komentarz