1
Systemy Wbudowane
Systemy Wbudowane
dla kierunku
dla kierunku
MECHATRONIKA
MECHATRONIKA
dr inż. Marek Galewski
Politechnika Gdańska
Wydział Mechaniczny
Katedra Mechaniki i Mechatroniki
Laboratorium
Laboratorium
Wprowadzenie do laboratorium
Wprowadzenie do laboratorium
2
Wprowadzenie
Wprowadzenie
• Zestaw uruchomieniowy ZL27ARM
• Inne niezbędne elementy sprzętowe
• Środowisko Keil uVison 4
– Pierwszy projekt
3
Zestaw ZL27ARM
Zestaw ZL27ARM
• ZL27ARM
2
3
4
6
7
8
9
10
11
12,13
14
15
16
17
18
19
5
1
1. Włącznik zasilania
2. Rezonatory kwarcowe (8 MHz
i 32,768 kHz)
3. 4-przyciskowa klawiatura
4. Przycisk Reset
5. 5-pozycyjny joystick (połączony
równolegle z klawiaturą)
6. 8 diod LED
7. 5 16-bitowych portów GPIO
8. Złącze wyświetlacza
alfanumerycznego LCD 2×16
znaków
9. Podświetlenie LCD o regulowanej
jasności (PWM)
10. Termometr cyfrowy TC77
(Microchip) z interfejsem SPI
11. Interfejs CAN
4
Zestaw ZL27ARM
Zestaw ZL27ARM
• ZL27ARM
2
3
4
6
7
8
9
10
11
12,13
14
15
16
17
18
19
5
1
12. Interfejs USB (device)
13. Złącze USB
14. Przetwornik piezoceramiczny –
buzzer („głośniczek”)
15. Potencjometr umożliwiający
podanie napięcia na wejście
przetwornika AC
16. Złącze JTAG
17. Złącze kart pamięci SD/MMC
18. Złącze DB9 i interfejs RS232
19. Zworki wyboru typu pamięci, z
której zostanie uruchomiony
mikrokontroler
5
ZL27ARM
ZL27ARM
• Schematy elektryczne
– Patrz dokumentacja zestawów ZL27ARM
• zl27arm.pdf
– Należy OBOWIĄZKOWO zapoznać się z nimi!
6
Programator ZL30PRG
Programator ZL30PRG
• ZL30PRG
– Programator USB JTAG
• Umożliwia wgranie programu do mikrokontrolera
• Umożliwia debuggowanie i śledzenie uruchomionego programu
7
Zestaw ZL27ARM
Zestaw ZL27ARM
• ZL27ARM + ZL30PRG + wyświetlacz LCD1602
8
Zestaw ZL27ARM
Zestaw ZL27ARM
• Podłączenie do PC
– 2 przewody USB
• Do programatora JTAG
– Tym przewodem programujemy i debuggujemy mikrokontroler
• Do płytki
– Przewód wyłącznie zasilający
– Płytka nie komunikuje się z systemem przez USB
» Chyba, że sami napiszemy odpowiedni program dla
mikrokontrolera i sterownik dla Windows
9
Procedura programowania
Procedura programowania
Edytor
Kompilator
Linker
Program w
pamięci procesora
Kod źródłowy
(pliki .c, .h, .s)
Pliki
obiektów
(pliki .o, .elf)
Obraz pamięci
mikrokontrolera
(pliki .axf, .hex)
Algorytm
Dołączane
kody binarne
np. biblioteki
Śledzenie wykonania programu i debuggowanie
Programista
Keil µVision
armcc
Real View Compiler
armlink
Real View Linker
Programator
ZL30PRG
(JTAG)
Błędy wykryte
przez kompilator
Błędy wykryte
przez linker
JTAG
10
Tworzenie i edycja projektu
Tworzenie i edycja projektu
• Przygotowanie folderu i plików
– W C:\Prace\ARM\ utwórz folder dla nowego projektu.
– Z C:\ARM\Projekt_wzorcowy skopiuj do niego pliki:
• stm32f10x_conf.h
• stm32f10x_it.c
• stm32f10x_it.h
• mod_startup_stm32f10x_md.s
– Wewnątrz utworzonego folderu projektu utwórz
foldery o nazwach \Lst i \Obj.
11
Tworzenie i edycja projektu
Tworzenie i edycja projektu
• Keil µVision 4
Edytor tekstowy
Kod programu i
plików pomocniczych
Komunikaty kompilatora i linkera
Pliki projektu
12
Tworzenie i edycja projektu
Tworzenie i edycja projektu
• Tworzenie nowego projektu
– Project > New uVision Project….
• Podaj nazwę projektu
• Wybierz procesor (STMicroelectronic > STM32F103VB)
– Na pytanie o kopiowanie plików odpowiedzieć: Nie
13
Tworzenie i edycja projektu
Tworzenie i edycja projektu
– W oknie plików projektu:
• Zmień nazwę pierwszej grupy na UserCode
• Dodaj nowe grupy:
– StdPeriphDrv
– CMSIS
– RVMDK
14
Tworzenie i edycja projektu
Tworzenie i edycja projektu
– Tworzenie nowego pliku
• File>New…
• W otwartym, nowym pliku wpisz:
#include "stm32f10x.h"
int main(void)
{
return 0;
}
• Zapisz plik w folderze Twojego projektu pod nazwą main.c.
• Kliknij prawym klawiszem myszy w oknie Project na grupie
UserCode i wybierz Add Files to Group ‘UserCode’…
– Wybierz plik main.c i kliknij Add, a następnie Close.
15
Tworzenie i edycja projektu
Tworzenie i edycja projektu
– Dodawanie pozostałych plików do projektu:
• Do grupy UserCode dodaj pliki:
– stm32f10x_conf.h
– stm32f10x_it.c
– stm32f10x_it.h
• Do grupy RVMDK dodaj plik:
– mod_startup_stm32f10x_md.s
• Do grupy CMSIS dodaj pliki:
– C:\ARM\STM32F10x_StdPeriph_Lib_V3.3.0\Libraries\CMSIS\CM3\
CoreSupport\ core_m3.c
– C:\ARM\STM32F10x_StdPeriph_Lib_V3.3.0\Libraries\CMSIS\CM3\
DeviceSupport\ ST\STM32F10x\system_stm32f10x.c
• Do grupy StdPeriphDrv dodaj pliki z folderu :
C:\ARM\STM32F10x_StdPeriph_Lib_V3.3.0\
Libraries\STM32F10x_StdPeriph_Driver\src\
– stm32f10x_rcc.c
– stm32f10x_flash.c
– misc.c
– stm32f10x_gpio.c
16
Tworzenie i edycja projektu
Tworzenie i edycja projektu
– Opcje projektu:
• Kliknąć prawym klawiszem myszy na najwyższym elemencie
struktury plików (Target 1) i wybrać Options for Target
• Zakładka Device
– Bez zmian (typ procesora)
• Zakładka Target
– Włączyć opcję Use MicroLIB
17
Tworzenie i edycja projektu
Tworzenie i edycja projektu
• Zakładka Output
– Wybrać przycisk Select Folder for Objects i wskazać folder
\Obj.
– Zaznaczyć pole Create HEX File oraz Browse Information
• Zakładka Listing
– Wybrać przycisk Select Folder for Listings i wskazać folder \Lst.
18
Tworzenie i edycja projektu
Tworzenie i edycja projektu
• Zakładka C/C++
– W polu Define wpisać:
USE_STDPERIPH_DRIVER, STM32F10X_MD
– W polu Optimization na razie zostawić 0.
– Poniżej listy wyboru poziomu optymalizacji wybrać opcję One ELF
Section per Function.
– W polu Include Paths dodać foldery:
» .
- Folder bieżący projektu
» C:\ARM\STM32F10x_StdPeriph_Lib_V3.3.0\Libraries\CMSIS\
CM3\CoreSupport;
» C:\ARM\STM32F10x_StdPeriph_Lib_V3.3.0\Libraries\CMSIS\
CM3\ DeviceSupport\ST\STM32F10x;
» C:\ARM\STM32F10x_StdPeriph_Lib_V3.3.0\Libraries\
STM32F10x_StdPeriph_Driver\inc
19
Tworzenie i edycja projektu
Tworzenie i edycja projektu
• Zakładka C/C++
20
Tworzenie i edycja projektu
Tworzenie i edycja projektu
• Zakładka Asm
– Opcje baz zmian
• Zakładka Linker
– Włączyć Use Memory Layout from Target Dialog
• Zakładka Debug
– Ustawić Use Simulator, zaznaczyć Limit Speed to Real-Time
– wybierać ST-Link Debugger, a w Settings protokół JTAG.
21
Tworzenie i edycja projektu
Tworzenie i edycja projektu
• Kod programu
#include "stm32f10x.h"
void RCC_Config(void);
void GPIO_Config(void);
void NVIC_Config(void);
int main(void)
{
//konfiguracja systemu
RCC_Config();
GPIO_Config();
NVIC_Config();
/*Tu umiescic ewentualne dalsze funkcje konfigurujace system*/
while (1) {
/*Tu umiescic glowny kod programu*/
};
return 0;
}
22
Tworzenie i edycja projektu
Tworzenie i edycja projektu
void RCC_Config(void)
//konfigurowanie sygnalow taktujacych
{
ErrorStatus HSEStartUpStatus;
//rezultat uruchomienia HSE
RCC_DeInit();
//Reset ustawien RCC
RCC_HSEConfig(RCC_HSE_ON);
//Wlaczenie HSE
HSEStartUpStatus = RCC_WaitForHSEStartUp();
//Czekaj na HSE
if(HSEStartUpStatus == SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
//zwloka pamieci Flash;
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//ustaw HCLK=SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1);
//ustaw PCLK2=HCLK
RCC_PCLK1Config(RCC_HCLK_Div2);
//ustaw PCLK1=HCLK/2
//ustaw PLLCLK = HSE*9 czyli 8MHz * 9 = 72 MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
//wlacz PLL
//odczekaj na poprawne uruchomienie PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//SYSCLK=PLL
while(RCC_GetSYSCLKSource() != 0x08);
//Czekaj na ust. SYSCLK
//wlacz taktowanie GPIO B
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
}
}
23
Tworzenie i edycja projektu
Tworzenie i edycja projektu
void GPIO_Config(void)
//konfigurowanie portow GPIO
{
GPIO_InitTypeDef GPIO_InitStructure;
//konfiguracja portu GPIO B
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 |
GPIO_Pin_10 | GPIO_Pin_11 |
GPIO_Pin_12 | GPIO_Pin_13 |
GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
24
Tworzenie i edycja projektu
Tworzenie i edycja projektu
void NVIC_Config(void)
//Konfigurowanie kontrolera przerwan NVIC
{
#ifdef VECT_TAB_RAM
//Jezeli tablica wektorow w RAM, ustaw jej adres na 0x20000000
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else
// VECT_TAB_FLASH
// W przeciwnym wypadku ustaw na 0x08000000
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
}
25
Tworzenie i edycja projektu
Tworzenie i edycja projektu
• Uwagi:
– W dalszych ćwiczeniach będzie można korzystać z tego
szkieletu kopiując do swojego folderu zawartość folderu
C:\ARM\Projekt_wzorcowy.
– W przypadku rozpoczynania nowego zadania od
projektu wzorcowego konieczna będzie aktualizacja
nazwy w polu Name of Executable w zakładce Output.
26
Tworzenie i edycja projektu
Tworzenie i edycja projektu
• Pomoc w pisaniu programu:
– Opis funkcji z bibliotek STM32F10x
• C:\ARM\stm32f10x_stdperiph_lib_um.chm
– Zakładka Functions
27
Tworzenie i edycja projektu
Tworzenie i edycja projektu
• Rozbudowa kod programu
- funkcja main()
int main(void) {
volatile unsigned long int i;
//konfiguracja systemu
RCC_Config();
NVIC_Config();
GPIO_Config();
/*Tu umiescic ewentualne dalsze funkcje konfigurujace system*/
GPIO_ResetBits(GPIOB, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |
GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 |
GPIO_Pin_14 | GPIO_Pin_15);
while (1) {
/*Tu umiescic glowny kod programu*/
GPIO_WriteBit(GPIOB, GPIO_Pin_8, Bit_SET);
for(i = 0; i < 0x450000ul; i++);
//okolo 0.5s przy 72MHz
GPIO_WriteBit(GPIOB, GPIO_Pin_8, Bit_RESET);
GPIO_WriteBit(GPIOB, GPIO_Pin_9, Bit_SET);
for(i = 0; i < 0x450000ul; i++);
GPIO_WriteBit(GPIOB, GPIO_Pin_9, Bit_RESET);
};
return 0;
}
28
Tworzenie i edycja projektu
Tworzenie i edycja projektu
• Kompilowanie i linkowanie projektu:
– Project > Rebuild All Target Files lub Project > Build
(klawisz F7)
– Jeśli kompilacja i linkowanie powiodą się, generowany
jest plik HEX, np.:
Program Size: Code=1132 RO-data=252 RW-data=0 ZI-data=1024
FromELF: creating hex file...
"Cw1.axf" - 0 Error(s), 0 Warning(s).
29
Symulowanie i śledzenie programu
Symulowanie i śledzenie programu
• Tryb debuggera
– ikona
30
Symulowanie i śledzenie programu
Symulowanie i śledzenie programu
– Zakładka Register
• Podgląd zawartość rejestrów procesora R0-R15 i xPSR
– Okno Disassembly
• Kod asemblera
– Okno Symbols
• Lista dostępnych w programie symboli.
• Grupa Peripheral Register
– Adresy rejestrów wszystkich urządzeń peryferyjnych procesora
• Grupa o nazwie takiej jak projekt
– Adresy funkcji i zmiennych użytych w programie
– Zakładka Locals
• Podgląd zmiennych lokalnych aktualnie wykonywanej funkcji
– Zakładka Watch
• Podgląd określonych zmienne
– Zakładka Memory
• Podgląd wskazanego obszaru pamięci
31
Symulowanie i śledzenie programu
Symulowanie i śledzenie programu
– System Viewer
• View > System Viewer > rodzaj grupy rejestrów
• Okienko, w którym można obejrzeć zawartość rejestrów z
wybranej grupy.
– Np. wszystkie rejestry związane z portem GPIOB.
– Symulator
• Peripherals
• Pozwala w bardziej przystępny sposób zobaczyć najważniejsze
rejestry dotyczące danego podukładu procesora oraz zmieniać
ich stan
32
Symulowanie i śledzenie programu
Symulowanie i śledzenie programu
• debuggowanie
– Ustawianie breakpoint
– Reset
– Uruchomienie
– Praca krokowa
0x40010C00
Peripherals > General Purpose I/O > GPIOB
33
Programowanie pamięci MCU
Programowanie pamięci MCU
•
ZL30PRG
– C:\ARM\ZL30PRoGrammer\zl30prg.exe
1. Identify device - sprawdza typ procesora znajdującego
się na płytce
2. Wybrać plik obrazu pamięci w formacie .hex
•
Znajduje się w podfolderze \Obj folderu projektu
3. Write Flash – zapisanie obrazu do pamięci MCU
34
Symulowanie i śledzenie programu
Symulowanie i śledzenie programu
• Śledzenie programu w procesorze
– W opcjach projektu w zakładce Debug zmienić pozycję
Use Simulator na Use ST-Link debugger
– Przejść do trybu debuggera
– Śledzenie działa tak samo jak w symulatorze
• Widoczne są rzeczywiste wartości ustawione w danej chwili
w procesorze (a nie symulowane)!