vaja 1fides.fe.uni-lj.si/~jernejo/modulb_due/vaje/vaja1_v1.pdfzagonske skripte, definicije...

15
Vaja 1 Uvod, programiranje v jeziku C, PIO

Upload: others

Post on 05-Jan-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Vaja 1

Uvod, programiranje v jeziku C, PIO

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,...

4

Arduino DUE

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)