vaja 1fides.fe.uni-lj.si/~jernejo/modulb_due/vaje/vaja1_v1.pdfzagonske skripte, definicije...
TRANSCRIPT
2
Naloga
Napišite program, ki bo diode LED (RX,TX,L) na razvojni plošči krmilil z naslednjim vzorcem
čakajčakaj
3
Mikrokrmilnik Atmel AT91SAM3X8E
ARM Cortex M3 mikroprocessor
3.3 V
84 MHz max. clock
SysTick timer, MPU,NVIC,...
512 kB Flash
96 kB SRAM
16 x ADC
2 x DAC
9 x timer
8 x PWM
Ethernet, CAN, TWI, USB,...
5
Atmel ASF
Atmel software framework (ASF)
Zbirka (knjižnica) funkcij in definicij za lažje delo z mikrokrmilniki Atmel
Zagonske skripte, definicije registrov, bitnih mask,...
Gonilniki perifernih enot (timer, A/D pretvornik, UART, ...)
Vsebuje tudi ARM knjižnico CMSIS (Cortex Microcontroller Software Interface Standard) za delo s Cortex mikroprocesorji
Zelo velika knjižnica (skoraj 2 GB kode)
Veliko podvojenih definicij za konsistentno poimenovanje in neodvisnost modulov
Ločene funkcije za različne mikrokrmilnike (AVR, SAM, MEGA,…)
Primeri aplikacij
6
ASF – struktura
sam
Koda specifična za Atmel ARM mikrokrmilnike
common
Splošni vmesniki, ki so skupni vsem arhitekturam
thirdparty
ARM knjižnica CMSIS (cortex microcontroller software interface standard)
7
ASF – osnovne definicije
asf/sam/utils/cmsis/sam3x/include/sam3x8e.h
Definicije izjem (exceptions), prekinitvenih rutin, ID oznake perifernih enot
Definicije kazalcev na strukture za dostop do registrov perifernih enot
npr. #define PIOA ((Pio *)0x400E0E00U)
asf/sam/utils/cmsis/sam3x/include/components/componet_xxx.h
Definicije struktur za dostop do registrov perifernih enot
npr. v component_pio.h
typedef struct {
WoReg PIO_PER;...
} Pio;
Elementi strukture so 32 bitne volatile spremenljivke – njihovi naslovi se ujemajo z naslovi registrov, ki dejansko nadzirajo delovanje komponente
npr. PIOA→PIO_OER se nahaja na naslovu registra “output enable register” vzporednih vrat A
8
Pravila
Naši programi bodo v mapi “app”
Edina mapa, kjer bomo pisali/spreminjali kodo
V podmapo app/src bomo dodajali izvorne (source) datoteke (.c)
V podmapo app/include bomo dodajali header datoteke (.h)
V mapi asf ne bomo popravljali nobenih datotek
Dodajali bomo različne module (mape) iz ASF arhiva
Ko bomo dodali nov modul, je potrebno spremembo vnesti tudi v konfiguracijo prevajalnika (config.mk)
Vse uporabljene .c datoteke je potrebno dodati v sklop “CSRCS”
Poti do modulov je potrebno vnesti v sklop “INC_PATH”
9
Različni pristopi k programiranju
Na nivoju registrov
S pomočjo kazalcev na strukture za dostop do registrov (sam3x8e.h)
npr. PIOA→PER
Neposredno preko definicij kazalcev na naslove registrov
npr. v asf/sam/utils/cmsis/sam3x/include/instances/instance_pioa.h
#define REG_PIOA_PER (*(WoReg*)0x400E0E00U)
Na nivoju gonilnikov
npr. asf/sam/drivers/pio/
Na nivoju splošnih višje nivojskih vmesnikov
npr. asf/common/services/ioport/
10
Vaja 1
Diode LED na razvojni plošči Arduino DUE:
RX: PIO vrata C, pin PC30, aktivna 0
TX: PIO vrata A, pin PA21, aktivna 0
L: PIO vrata B, pin PB27, aktivna 1
Za uvod bomo uporabili pristop na nivoju registrov
Do registrov bomo dostopali s pomočjo kazalcev na strukture
Npr. PIOx→PIO_PER = 0x0000 0001, kjer bo x=A,B,C ali D
PMC (power management controller)
Za vsak modul lahko vklopimo/izklopimo uro (clock) => varčevanje z energijo
Vhodno/izhodni pini potrebujejo uro za branje vhodnih pinov, filtriranje vhodnih signalov,…
Za konfiguracijo in uporabo samo izhodnih pinov ure ne potrebujemo
11
PIO (parallel input output) registri
PIOx→PIO_PER pio enable reg.
Vpis 1 na bit i vklopi i-ti pin na vratih x (A,B,C,D)
PIOx→PIO_OER pio output enable reg.
Vpis 1 na bit i nastavi i-ti pin kot izhodni
PIOx→PIO_OWER pio output write enable reg.
Vpis 1 na bit i omogoči spreminjanje i-tega izhodnega pina
PIOx→PIO_SODR pio set output data reg.
Vpis 1 na bit i nastavi visoko stanje na i-tem pinu
PIOx→PIO_CODR pio clear output data reg.
Vpis 1 na bit i nastavi nizko stanje na i-tem pinu
12
Vaja 1 – program
Konfiguracija pinovNastavitev začetnih stanj pinov
stanje
on/off/on off/on/off
cakaj
0 1
Napišite funkcijo void cakaj(uint32_t n)
Funkcija naj izvaja prazno zanko n-krat
Spremeni stanje
13
Višji nivo - delay
Modul common/services/delay
Funkcijo void cakaj(…) nadomestite z ASF modulom delay
Iz ASF arhiva skopirajte modul “common/services/delay” v projektno mapo “asf/common/services/” (odstranite lahko nepotrebne podmape)
Vključite novi delay modul v projekt (glej “config.mk”)
V sklop “INC_PATH” dodajte pot do osnovne mape novega modula
V sklop “CSRC” dodajte poti in imena vseh potrebnih datotek tipa .c
V glavnem programu (main.c) vključite nov modul
#include <delay.h>
Uporabite funkciji delay_init() in delay_ms()
Dokumentacija modulov je običajno na voljo v glavni datoteki .h (npr. delay.h
14
Višji nivo - ioport
Modul common/services/ioport
Namesto registrov v glavnem programu uporabite ioport modul
Modul dodajte v projekt na enak način kot modul delay
Dokumentacija je na voljo v “ioport.h”
15
ASF – modul ioport (asf/common/ioport)
Funkcije (glej ioport.h):static inline void ioport_init(void)
Vklopi vsa paralelna vrata (PIOA, PIOB, PIOC, PIOD)
static inline void ioport_enable_pin(ioport_pin_t pin)
Vklopi clock za podani pin (potrebujemo za tipke)
ioport_pin_t pin: id oznaka pina (npr. PIO_PA13_IDX, glej “asf/sam/utils/cmsis/sam3x/include/pio/pio_sam3x8e.h”)
static inline void ioport_set_pin_dir(ioport_pin_t pin, enum ioport_direction dir)
Nastavi smer vhodno/izhodnega pina
static inline void ioport_set_pin_mode(ioport_pin_t pin, ioport_mode_t mode)
Nastavitev dodatnih funkcij za pine (npr. glitch/debounce filter, pullup/pulldown upor,...)
static inline void ioport_set_pin_level(ioport_pin_t pin, bool level)
Nastavitev stanja (1/0 oz. HIGH/LOW) izhodnega pina
static inline void ioport_toggle_pin_level(ioport_pin_t pin)
Zamenja stanje pina (1→0, 0→1)