Aris Edge S3A3 – moduł z mikrokontrolerem Renesas Synergy S3
Renesas oferuje bardzo silne wsparcie programowe dla programistów. Do tej pory można było używać świetnego, bezpłatnego firmowego pakietu IDE znanego jako e2studio, zintegrowanego z firmowym pakietem SSP. Od pewnego czasu dostępny jest bezpłatny pakiet IAR Embedded Workbench, przeznaczony dla projektów z wykorzystaniem mikrokontrolerów Renesas Synergy. Pakiet IAR współpracuje z samodzielnym konfiguratorem SSC oferowanym przez Renesas. To wsparcie powoduje, że IAR Workbench ma takie same możliwości używania SSC i ich konfigurowania jak e2studio.
Firma Reloc, producent modułu, oferuje wsparcie projektów w postaci plików z rozszerzeniem .PACK używanych w bezpłatnym środowisku programowym e2studio. Pliki .PACK są przygotowywane dla konkretnej wersji bibliotek SSP i żeby ich używać musi być wybrana w konfiguracji odpowiednia wersja SSP. Dla naszego modułu w momencie pisania artykułu były dostępne pliki Reloc.Aris_Edge3.1.3.3.PACK przeznaczony dla wersji SSP V1.3.3 i Reloc.Aris_Edge3.1.4.0.PACK przeznaczony dla wersji SSP V1.4.0. Wsparcie dla modułu Aris Edge pokażemy na podstawie przykładowego projektu środowiska e2studio v 6.2.0 i biblioteki SSP V1.4.0.
W pierwszym kroku trzeba skopiować plik Reloc.Aris_Edge3.1.4.0.PACK do katalogu Renesas\Synergy\e2studioV6.2.0\internal\projectgen\arm\packs. Po uruchomieniu e2studio tworzymy nowy projekt z menu narzędziowego File->New->Synergy C/C++ Project (rysunki 5, 6 i 7).
Rys.6. Wybór rodzaju projektu (Synergy C executable)
Rys.7. Nazwa projektu, ścieżki dostępu do projektu i plików licencji
Na rysunku 8 zostało pokazane kolejne okno konfiguracji projektu, w którym wybiera się wersję zainstalowanej biblioteki SSP – w naszym przypadku V1.4.0 i wsparcie dla płyty Aris Edge 3. Możliwość wyboru aris_edge3 z rozwijanego okna board pojawi się po skopiowaniu pliku Reloc.Aris_Edge3.1.4.0.PACK do opisanej powyżej lokalizacji.
Rys.8. Wybór wersji biblioteki SSP i płyty Aris Edge 3
Ostatnim krokiem generowania projektu jest wybór rodzaju szkieletu. Do celów testowych możemy wybrać opcję Blinky. Wygenerowany projekt będzie cyklicznie zapalał i gasił diody LED2 i LED3 umieszczone na płytce. Na listingu pokazana jest procedura hal_entry.c wygenerowana przez kreator projektu i sterująca cyklicznym zapalaniem i gaszeniem diod LED2 i LED3.
/*********************************************************************************************************************** * File Name : hal_entry.c * Description : This is a very simple example application that blinks all LEDs on a board. ***********************************************************************************************************************/ #include "hal_data.h" /*******************************************************************************************************************//** * @brief Blinky example application * * Blinks all leds at a rate of 1 second using the software delay function provided by the BSP. * Only references two other modules including the BSP, IOPORT. * **********************************************************************************************************************/ void hal_entry(void) { /* Define the units to be used with the software delay function */ const bsp_delay_units_t bsp_delay_units = BSP_DELAY_UNITS_MILLISECONDS; /* Set the blink frequency (must be <= bsp_delay_units */ const uint32_t freq_in_hz = 2; /* Calculate the delay in terms of bsp_delay_units */ const uint32_t delay = bsp_delay_units/freq_in_hz; /* LED type structure */ bsp_leds_t leds; /* LED state variable */ ioport_level_t level = IOPORT_LEVEL_HIGH; /* Get LED information for this board */ R_BSP_LedsGet(&leds); /* If this board has no LEDs then trap here */ if (0 == leds.led_count) { while(1); // There are no LEDs on this board } while(1) { /* Determine the next state of the LEDs */ if(IOPORT_LEVEL_LOW == level) { level = IOPORT_LEVEL_HIGH; } else { level = IOPORT_LEVEL_LOW; } /* Update all board LEDs */ for(uint32_t i = 0; i < leds.led_count; i++) { g_ioport.p_api->pinWrite(leds.p_leds[i], level); } /* Delay */ R_BSP_SoftwareDelay(delay, bsp_delay_units); } }
Listing 1. Procedura sterująca zapaleniem i gaszeniem diod LED modułu
Rys.9. Wybór szkieletu projektu
Po kliknięciu na przycisk Finish, kreator projektu wygeneruje wszystkie niezbędne pliki źródłowe i pliki pomocnicze, w tym plik konfiguratora otwierany w oknie perspektywy Synergy Configuration.
Wybór aris_edge3 w oknie Board powoduje, że konfigurator projektu umieści kilka plików dodatkowych w folderze aris_edge3 – zostało to pokazane na rysunku 10. Poza definiowaniem diod LED2 i LED3 (listing 2) nie znajdziemy tam zbyt wielkiego wsparcia dla układów peryferyjnych. Dlatego należy je traktować jako szkielet wypełniany przez użytkownika zależnie od potrzeb.
/*********************************************************************************************************************** * Private global variables and functions **********************************************************************************************************************/ /** Array of LED IOPORT pins. */ static const ioport_port_pin_t g_bsp_prv_leds[] = { IOPORT_PORT_03_PIN_03, ///< LED2 IOPORT_PORT_01_PIN_13, ///< LED3 }; /*********************************************************************************************************************** * Exported global variables (to be accessed by other files) **********************************************************************************************************************/ /** Structure with LED information for this board. Recommended to get this information through R_BSP_LedsGet() function * instead of using this structure directly to remove dependency on structure name. */ const bsp_leds_t g_bsp_leds = { .led_count = (uint16_t)(((uint16_t)sizeof(g_bsp_prv_leds) / (uint16_t)sizeof(g_bsp_prv_leds[0U]))), .p_leds = &g_bsp_prv_leds[0] };
Listing 2. Wsparcie użycia diod LED z pliku bsp_leds.c
Rys.10. Pliki związane z wyborem płyty aris_edge3
Trochę inaczej wygląda wsparcie pliku .PACK konfiguracji wyprowadzeń mikrokontrolera zapisanej w pliku configuration.xml i dostępnej w zakładce Pins perspektywy Configurations. Zdefiniowano tu wstępnie przypisania wyprowadzeń peryferiów do wyprowadzeń mikrokontrolera. Na przykład w standardzie Arduino interfejs I2C jest wyprowadzony na piny 9, 10 złącza J6. Do tego złącza są podłączone sygnały z portów P205 i P206 skonfigurowane jako linie SDA i SCL portu szeregowego I2C. Zostało to pokazane na rysunku 11.
Rys.11. Predefiniowana definicja wyprowadzeń modułu komunikacyjnego I2C
Jeżeli użytkownik chce korzystać z interfejsów komunikacyjnych, dla których przygotowano konfiguracje Pins, musi zdefiniować drivery do układów peryferyjnych. Na rysunku 12 pokazano przykład dodawania drivera dla interfejsu I2C.
Rys.12. Dodawanie obsługi interfejsu I2C Master w zakładce Thread