EB906635

Page 1


Programujeme STM32

zdolejte jednočipy profesionálů

Ing. Vojtěch Skřivánek

2. vydání{

RCC_OscInitTypeDef RCC_OscInitStruct = {0};

RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

/** Configure the main internal regulator output voltage

/** Initializes the CPU, AHB and APB busses clocks

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSI

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

/** Initializes the CPU, AHB and APB busses c

podpory firem

Programujeme STM32

zdolejte jednočipy profesionálů

Ing. Vojtěch Skřivánek

2.vydání

Poděkování

Děkujifirmám SIEMENS

zapodporupřipsanítétoknihy.

Vydání první 2022

© Ing. Vojtěch Skřivánek

© Mgr. Tomáš Zahradníček - TZ-one

ISBN: 978-80-7539-131-5 (PDF verze)

ISBN: 978-80-7539-132-2 (ePub verze)

ISBN: 978-80-7539-133-9 (mobi verze)

Obsah

1Úvod

1.1Motivaceknihy

2Vývojovénástroje

2.1Vývojovádeska

2.2Vývojovéprostředí

2.3Dokumentace

4Vstupně/výstupnípiny

4.1.1Frekvencevýstupníhopinu

4.1.2Napěťovéúrovněsignálů

4.2Praktickéukázky

4.2.1TlačítkemrozsvícenáLED

4.2.1.1Založenínovéhoprojektu

4.2.1.2Konfigurátor

4.2.1.3Nastaveníperiferií

4.2.1.4Strukturaprojektu

4.2.1.5Tvorbaprogramu

4.2.1.6Spuštěníprogramu

4.2.1.7Ladění(debuggování)programu

5Přerušení

5.1Nezbytnáteorie

5.1.1Softwarovéahardwarovépřerušení

5.1.2Maskovánípřerušení

5.1.2.1Maskováníglobálníhopřerušení

5.1.2.2Maskováníspecifickéhopřerušení

5.1.3Příznakpřerušení

5.1.4Prioritapřerušení

5.1.5Vektorpřerušení

5.1.6Obsluhapřerušení(ISR)

5.2Praktickéukázky

5.2.1TlačítkemrozsvícenáLEDpomocípřerušení

5.2.1.1Nataveníperiferií

5.2.1.2Tvorbaprogramu

5.2.1.3Zapojení

5.2.1.4Rozborprogramu

5.2.1.5Callbackfunkcepřerušení

6.1Nezbytnáteorie

6.1.1Protokolkomunikace

6.1.2UARTuSTM32

6.2.1Příjemaodeslánídatbezknihoven

6.2.1.1Převodníksériovékomunikace

6.2.1.2Nastaveníperiferií

6.2.1.3Tvorbaprogramu

6.2.2LEDrozsvícenápovelemzpočítače

6.2.2.1Nastaveníperiferií

7.1.1.2Outputcompare(OC)

7.1.1.3InputCapture(IC)

7.1.1.4PWM-pulzněšířkovámodulace

7.2.1Blikánípomocíčasovačespřerušením

7.2.1.1Nastaveníhodinovéhosignálu

7.2.1.2nastaveníperiferií

7.2.1.3Tvorbaprogramu

7.2.2BlikánípomocíOCrežimu

7.2.2.1Nastaveníhodinovéhosignálu

7.2.2.2Nastaveníperiferií

7.2.2.3Tvorbaprogramu

7.2.3BlikánísnastavenímdélkypomocíICrežimu

7.2.3.1Nastaveníhodinovéhosignálu

7.2.3.2Nastaveníperiferií

7.2.3.3Tvorbaprogramu

7.2.3.4Zapojení

7.2.4NastaveníjasuLEDpomocíPWMrežimu

7.2.4.1Nastaveníhodinovéhosignálu

7.2.4.2Nastaveníperiferií

7.2.4.3Tvorbaprogramu

7.2.5Časovačspuštěnýčítačemvnějšíchudálostí

7.2.5.1Nastavenihodinovéhosignálu

7.2.5.2Nastaveníperiferií

7.2.5.3Tvorbaprogramu

7.2.5.4Zapojení

8.1.1Režimyměření

8.1.1.1Režimjednotlivéhoměřenísekvencekanálů ....................

8.1.1.2Režimnepřetržitéhoměřenísekvencekanálů

8.1.1.3Režimpřerušovanéhoměřenísekvencekanálů

8.2.1Přerušovanéměřenídvoukanálů

8.2.1.1Nastaveníperiferií

8.2.1.2Tvorbaprogramu

8.2.1.3Zapojení

8.2.2Jednotlivéměřenídvoukanálůsexternímspouštěním

8.2.2.1Nastaveníperiferií

8.2.2.2Tvorbaprogramu

9.2.1NastaveníjasuLEDpomocíDAC

10.1.3SPIuSTM32

10.2.1JednosměrnáSPIkomunikaceMaster->Slave

10.2.1.1Nastaveníperiferií

10.2.1.2Tvorbaprogramu

10.2.1.3Zapojení

10.2.2JednosměrnáSPIkomunikaceSlave->Master

10.2.2.1Nastaveníperiferií

10.2.2.2Tvorbaprogramu

10.2.2.3Zapojení

10.2.2.4Rozborprogramu

10.2.3ObousměrnáSPIkomunikaceMaster<->Slave

10.2.3.1Nastaveníperiferií

10.2.3.2Tvorbaprogramu

10.2.3.3Zapojení

10.2.3.4Rozborprogramu

10.3Kvíz

11.1.1Protokolkomunikace

11.1.1.1Startovacíaukončovacísignál

11.1.1.2Adresovýbajt ....................................

11.1.1.3Potvrzovacíbit

11.1.1.4Zpomaleníhodinovéhosignálu

11.1.2I2CuSTM32

11.2.1JednosměrnákomunikaceMaster->SlaveaMaster<-Slave

11.2.1.1Nastaveníperiferií

11.2.1.2Tvorbaprogramu ..................................

11.2.1.3Zapojení .......................................

11.2.1.4Rozborprogramu

12.3.1DMApřenoszpamětidopaměti

12.3.1.1Nastaveníperiferií

12.3.1.2Tvorbaprogramu

12.3.1.3Rozborprogramu ..................................

12.3.2DMApřenoszperiferiedopaměti

12.3.2.1Nastaveníperiferií ..................................

12.3.2.2Tvorbaprogramu

12.3.3DMApřenoszperiferiedoperiferie

12.3.3.1Nastaveníperiferií

12.3.3.2Tvorbaprogramu

12.3.3.3Zapojení

12.4Kvíz

Kapitola1

Úvod

Milý(budoucí)programátoremikrokontrolerů,takéužseTistalo,žeseschtělnaučitprogramovatnový typmikrokontroleru,alenevěděljsi,jakzačít?Netušiljsi,jakévývojovéplatformyanástrojejsoukdispozici, jakéjsoumožnostimikrokontroleruajakjejnastavitapoužívattak,abydělal,coodnějchceš?

Pokudano,jistějsivyužilinternetukhledánínepřebernéhomnožstvídokumentů,doporučení,návodů, tipů,příkladů,diskuzíafór.Vtompřípadějsitakéčastozjistil,ževelkáčástznalezenýchinformacíje oduživatelskékomunity,tvořenamnohdydomněnkami,fámami,bájemi.Apokudužjsinějakéřešenínašel, většinouneposkytloodpověďnaTvojiotázku.

Ztohodůvodujezdetatokniha,kteráTěprovedevšímzákladním,copotřebuješvědětoprogramování mikrokontrolerůSTM32.

1.1Motivaceknihy

Původnímdůvodemknapsánítétoknihybylovytvořitstudijnípodkladyprostudentypředmětu„Laboratořeaplikovanéelektroniky“(neoficiálněSiemensEmbeddedAcademy)naČVUT.Tentopředmětvedený zaměstnancifirmySiemenssijižněkolikletdávázacílnaučitstudenty,jakprogramovatmikrokontrolery STM32.Poté,cojsemsepsalkapitolykjednotlivýmpřednáškám,midošlo,žebybylaškodatytomateriály omezitpouzekúčeluvýukystudentů.Jednotlivédokumentyjsemspojilvjedencelek–knihu,kterouprávě držítevruce.

Tatoknihajeurčenapředevšímprogramátorůmmikrokontrolerů,aťužúplnýmnováčkůmčinadšencům. Takétěm,kteříjižmajínějakézkušenostismikrokontroleryjinýchznaček(PIC,AVR,MSP430)anyníby rádipracovalismikrokontrolerySTM32,alenevědí,jakzačít.Ovšemiprofesionálovétutoknihuvyužijípro rychlýpřechodzjinýchkontrolerůnaSTM32.

Avšakzřejměnejvětšímotivacíknihyjeukázatvšem,žeprogramováníprofesionálypoužívanýchčipů STM32nenítakobtížné,jaksemůžepootevřenítisícistránkovéhoreferenčníhomanuáluzdát.

Jepravda,žejižexistujípublikace,kteréoprácisSTM32pojednávají.Tytoknihyalemajímimopředností isvénedostatky.Praktickyvšechnyjsoucizojazyčné,cožsamoosoběmůžebýtnapříkladprostředoškolského studentaproblémem.OdbornécizojazyčnéknihyjsouvČRšpatnědostupnéajejichcenanebývápříznivá. Nahlédneme-lidoněkterýchznich,zjistíme,žemnohdyaninepokrývajívšechnyzákladníperiferiekontroleru. Případněsenaopakzbytečnědetailnězabývajítěmi,ježvpraxinejsoupříliščastopoužívané.Ukázkové příkladybývajízbytečněsložitéamatoucí,jeknimpotřebadalšíhardware,nebovyužívajíneoficiálníči zastaraléknihovnífunkce.

Všemtěmtonedostatkůmsesnažítatoknihavyhnout.Postupnědleobtížnostialogickénávaznostijsou popsányvšechnyzákladníperiferievjejichnejpoužívanějšíchrežimech.Příkladyjsouvelmijednoduchékpochopení,praktické,psanézapoužitíoficiálníchvývojovýchprostředkůaknihoven,ježudržujevýrobcečipů STMicroelectronics.Kevšempříkladůmstačípouzejednavývojovádeska,nenítedynutné,mimopropojovacíchdrátků,dokupovatčisnadsestavovatžádnýdodatečnýhardware.

1.2Strukturaknihy

Knihavesvýchdevítikapitoláchpopisujenejdůležitějšíperiferie,kterémajítéměřvšechnyřadymikrokontrolerůSTM32.

Každáztěchtokapitolmástejnoustrukturu.Poúvodnímslovu,kčemudanáperiferieobecněslouží, následujepodkapitolasnezbytnouteorií.Tajeurčenápředevšímtěmčtenářům,kteřískontroleryještěmoc velkézkušenostinemají.Vtétopodkapitolesezpravidlanacházíblokovýdiagramdanéperiferieajehopopis zaúčelemsnadnéhopochopeníjejíhořešeníafunkce.

Následujícípodkapitolapojednáváomožnostech,režimechčidalšíchfunkcíchdanéperiferie.Jevníblíže popsáno,couživatelimůžedanáperiferienabídnoutktomu,abysnadnodosáhlkýženéhovýsledku.Poslední podkapitoloujsouprakticképříklady,vnichžjenázorněukázáno,jakperiferiinastavitdodanéhorežimua jakjipoužívattak,abyplnilaočekávánoufunkci.

Nakoncikaždékapitolysenacházíkrátkýkvíz,kterýotestuje,zdasičtenářzdanékapitolyodnesldůležité poznatky.Kvízjeopěturčenýpředevšímpronováčky.

Každákapitolapředpokládáznalostizkapitolpředchozích,atopředevšímupříkladů.Nenítedydoporučenokapitolypřeskakovat,zvláštěpakvpřípadě,kdyčtenářnemápředchozízkušenostisžádnýmikontrolery.

Zdrojovýkódpříkladůjezdeveforměobrázků.Důvodyjsoudva.Prvníjeedukativní–čtenářtaknemůže textzkopírovatdovývojovéhoprostředí,alemusíjejskutečněnapsat.Tímtozpůsobemsičlověkspíšeuvědomí, covlastněprogramuje.Druhýmdůvodemjeto,žečtenářnaobrázkuvidí,sjakýmsouboremprojektua knihapracujejakémřádkukódudanéhosouborusenacházíme.(Našifunkcionalitutotižbudemevždypouze doplňovatdopředemvygenerovanéhokódu.)

Errataaprojektypříkladůztétoknihyjemožnénajítna www.programujemekontrolery.cz.

1.3Fontytextu

Anglickézkratky,názvynabídekapolíčekvývojovéhoprostředíanázvyregistrůjsouvždynapsánytučnou kurzívou-např. AutoReload registr.Ačbybylokonzistentnějšípoužívatvknizebuďpouzečeské,nebo anglickénázvosloví,existuje-ličeskýekvivalent(např.názvuregistru),jepoužit,jelikožlépezapadnedověty, kterájepaksrozumitelnější.

Vknizesenacházíobrázkynejčastějivpodoběblokovýchdiagramů.Vnichjsouněkteréčástizvýrazněny případněičíselněoznačeny.Natatooznačeníjevtextuodkazovánotučněpsanýmčíslemvzávorce–např. (1).

Matematickévýrazyčivzorcejsouvždynapsánykurzívou–např. (početpulzů+1)

Odkazynapoužitézdrojejsouuvedenyčíslemvhranatýchzávorkách–např.[1].

Kapitola2

Vývojovénástroje

Kprogramovánímikrokontrolerůjsouzapotřebítřizákladnínástroje.

Prvnímznichjesamozřejměsamotnýmikrokontroler.Nejsnazšímzpůsobem,jakmítkdispozicifunkční mikrokontrolerpřipravenýkprogramováníapoužíváníjehoperiferií,jeopatřitsivývojovoudesku.Firma STMicroelectronicsnabízíširokouškálucenověpříznivýchvývojovýchdesek.Mezinejznámějšípatřířadydesek Nucleo a Discovery.Tyseodsebelišítím,žezatímco Nucleo obsahujepřevážněpouzemikrokontrolera konektory, Discovery dostčastoskýtátakérozličnésenzory,tlačítka,LED,displejeajinéprvkypřipojené přímokekontroleruapřipravenékokamžitémupoužití.

Druhýmpotřebnýmnástrojemjeprogramátormikrokontroleru,kterýdokáženahrátbinárníkódzPCdo pamětiprogramučipu.Tentoprogramátorjemožnékoupitsamostatně,alevýhodouvšechvývojovýchdesek firmySTMicroelectronicsje,žekaždáznichmávsoběprogramátoradebugger(používanýkladěníprogramu) jižintegrovaný.

Zbýváposlednínástroj,ačkolivjdevlastněodva,kteréjevšakmožnoopětzískatvjednombalíčku.Prvnímjevývojovéprostředí,vekterémjemožnésnadnopsátkódaspravovatprojektprogramu.Druhýmje překladačzdrojovéhokódu,psanéhovjazyceC,dostrojovéhobinárníhokódu,kterémurozumídanýkontroler.FirmaSTMicroelectronicsnabízízdarmasvévývojovéprostředí STM32CubeIDE,vekterémjemožné napsatzdrojovýkód,přeložitjejdostrojovéhoapomocíprogramátorujejnahrátdoprogramovépaměti mikrokontroleru.

2.1Vývojovádeska

Vývojovádeska,kterájepoužitanavšechnypříkladyvtétoknize,jezřadydesek Nucleo snázvem NUCLEO-L073RZ .

VývojovádeskaNUCLEO-L073RZ[2]

Deskaobsahuje,mimomikrokontroleru STM32L073RZ ,takéjižzmíněnýprogramátoradebuggersloužícíkladěníprogramu (1).Programátorsenacházívhorníčástidesky,kteroujemožnéodspodníodlomit. KprogramováníkontrolerůmimovývojovoudeskusloužíkonektorCN4vlevéčásti (2).HorníčásttakéobsahujepřevodníkzUSBkomunikacena UART (kteréjevěnovánacelákapitolatétoknihy),jehožvývody CN3 jsouvpravoodprogramovacíhokonektoru (3).Anijedenztěchtokonektorůnenítřebapoužívat,jelikož programátoripřevodníkjsouskontroleremspojenymůstkymezihorníadolníčástídesky.

Nadolníčástideskysenacházídvětlačítka,jednoznich- B2 -sloužíkresetováníprogramumikrokontroleru (4),druhé- B1 -jeuživatelské (5),kteréjepřipojenénapinmikrokontroleruaježbudečastovyužívané vnašichpříkladech.

KroměLEDsignalizujícíchfunkciprogramátoruasprávnénapájení,jenadesceumístěnatakéjedna uživatelskáLED LD2 (6),kteroulzepinemmikrokontroleruovládat.

Nakrajíchdeskypaknelzepřehlédnoutdvatypykonektorů.VnitřnítvořenédutinkamijsoukompatibilnísevšemirozšiřujícímideskamiproplatformuArduino.Vnějšíhřebínkovéjsoupřivedenykevšempinům kontroleru.

POZOR!! Nevšechnykonektoryjsouskutečněpřipojenykpinůmkontroleru.Někdyjenutnénapříslušné místonadescepřipájetnulovýrezistor,abydošlokpropojení.Důvodemje,žedanýpinjejižpoužitnapříklad programátorem.Detailyjemožnénajítvdokumentaci Nucleo desky[2].

Kroměvýšezmíněnéhodeskaještěnabízímožnostpřipájenívlastníhopřesnéhooscilátoru,místonaměření proudovéspotřebyapřepnutínaexternínapájení.Nicztohoalevtétoknizenenívyužito.

Pokuddisponujetejinouvývojovoudeskou,snejvětšípravděpodobnostíbudetemocivětšinupříkladůtéto knihyvyzkoušettaké.Jedinývelkýrozdílbudespočívatvjinýchpinech,kteréprojednotlivéperiferiepoužijete.

2.2Vývojovéprostředí

Jakjižbylozmíněno,výrobcečipuposkytujezdarmavývojovéprostředí STM32CubeIDE,vekterém jsouvytvořenyvšechnypříkladytétoknihy.

Totoprostředívsoběobsahujekonfigurátorperiferiíčipu,programováníasprávuprojektu,nahráníprogramudomikrokontroleruamožnostjeholadění(debuggování).

Sinstalacívývojovéhoprostředníseautomatickynainstalujeiovladačprogramátoru,kterýjeumístěnýna Nucleodesce,apřekladačzezdrojovéhokódunastrojový.

STM32CubeIDE jemožnéporegistracinawebovýchstránkáchfirmySTMicroelectronicsstáhnout zcelazdarma.Nejsnazšímzpůsobemnalezeníodkazukestaženíjezadatdointernetovéhovyhledávačeheslo „STM32CubeIDE“apravděpodobněhnedprvníodkazbudemířitnasprávnoustránku,kdenajdetetaké návodnainstalaciamanuálkpoužití.

Věřím,ženenínutnépopisovatinstalacivývojovéhoprostředí,kterájeplněautomatickáanainstalujei všechnynutnéovladače.

2.3Dokumentace

Kprácismikrokontroleremavývojovoudeskoupřijdouvhodčtyřidokumenty.

Prvnímanejdůležitějšímjereferenčnímanuálmikrokontroleru[1].Tentodokumentobsahujekompletní popiskontroleru,jehofunkcíaperiferií.Pojehootevřeníjenutnénezaleknoutsepočtustránek,jelikožne všechnyjsoustejnědůležité.Veškerékapitolyoperiferiíchkontroleru,majístejnoustrukturu.Poobecném úvoduavýpisufunkcíperiferienásledujeblokovýdiagramperiferie,nakterýbudetatoknihačastoodkazovat. Kapitolapokračujepopisemjednotlivýchfunkcíarežimůperiferie.Itytoinformacejsoučastozmíněnyvtéto knize.Posledníčástíkapitolyvreferenčnímmanuálujsoupopisyregistrůspjatýchsdanouperiferií.Funkce některýchzregistrůjsouopětpopsányvtétoknize,alevětšinaznichmůžebýtspravovánaknihovními funkcemi.Tyjsoupoužityvpříkladech,aprotovětšinounenídůležitésejednotlivýmiregistryzabývat.

Druhýmdokumentemjeuživatelskýmanuálvývojovédesky Nucelo [2].Vněmlzemimojinénajít,jaké pinykontrolerujsoupřipojenykdutinkovýmahřebínkovýmkonektorůmdeskyčinakterýchpinechjepřipojenouživatelskétlačítkoauživatelskáLED.Takésevněmnacházíinformace,kterépinynejsouskonektory spojenyvůbecazdajemožnétododatečněudělatpřipájenímnulovéhorezistorunakonkrétnípájicíplošky nadesce.

Dalšímdůležitýmdokumentemjemanuál HAL knihoven[3](HardwareAbstractionLayer),kteréjsou použityvpříkladechtétoknihy.JdeooficiálníknihovnyvytvořenéaudržovanéfirmouSTMicroelectronics. Vtomtodokumentusenacházívýčetapopisvšechknihovníchfunkcíkovládáníperiferiímikrokontroleru. Jsouzdeknalezenívstupníavýstupníparametryfunkcíajejichvýznam.Obdobnýpopisjeivkomentářích souborůimplementacefunkcí.Nenítedynutnémítpřiprácinaprogramutentodokumentotevřený,stačímít vevývojovémprostředízobrazenýdanýsoubor.

Poslední,spíšedoplňkovýdokument,jekatalogovýlist(datasheet)[4]rodinymikrokontroleru.Vdokumentujsouuvedenaobecnádataomikrokontroleru,jakodruhy,početastručnýpopisvšechperiferií,velikosti pamětí,dostupnápouzdra,statickéadynamickécharakteristiky(napájeníaspotřebačipu,teplotnícharakteristiky,chybypřevodníků...),názvypinůpouzder,informaceonapájeníčipu,informacepronávrhplošného spojeaproosazení.Tentodokumentjezdeuvedenpředevšímkvůlidůležitétabulcepopisujícíjednotlivépiny kontroleru,kterájezmíněnavkapitoleovstupně/výstupníchpinech.

Všechnytytodokumentysehodívmomentě,kdysechystámepracovatsjehoperiferiínebojepotřebak mikrokontrolerupřipojitexterníperiferii.

2.4Shrnutí

Popřečtenítétokapitolybymělmítčtenářkúspěšnémunaprogramovánípříkladůuvedenýchvtétoknize připravenynásledujícínejnutnějšívěci:

• vývojovoudesku NUCLEO-L073RZ,

• USB kabelkpřipojenídeskykpočítači,

• počítačsnainstalovanýmvývojovýmprostředím STM32CubeIDE,

• a několikdrátků kvzájemnémupropojenívnějšíchkonektorůvývojovédesky.

Stoutonezbytnouvýbavou,knížjedoporučenomítkdispozicizmíněnoudokumentaci,jemožnésesměle pustitdočtenínásledujícíchkapitol,kteréodhalujíprogramovánímikrokontrolerůSTM32.

Kapitola3

Mikrokontroler

Naúvodjevhodnévestručnostiříci,cojemikrokontroler,zčehosenutněskládáajakémůžeobsahovat periferie.

Mikrokontroler(jinakmikrořadič,jednočipovýpočítaččimikropočítač)jeprogramovatelnáelektronická součástka,jejížchováníjedefinovánoprogramemuloženýmvprogramovépaměti.

Základníčástikaždéhomikrokontrolerujsou:

• Mikroprocesorovájednotka(protojeoznačenímikrokontrolerujakoprocesornebomikroprocesornepřesné,procesorjetotižpouzesoučástmikrokontroleru),

• paměťprogramu,

• operačnípaměťdat,

• vstupně/výstupníperiferie,

• asběrnicepropojujícívšechnybloky.

Beztěchtočástínemůžekontrolerfungovat.

Jakozákladníčástkontrolerubysedalnazvatizdrojhodinovýchsignálůpohánějícíprocesorovoujednotku, aletentozdrojmůžebýtiexterní(byťdnesjižkaždýkontrolermáminimálnějedenzdrojintegrovaný).

Všechnytytozákladníblokysesvýmivlastnostmilišívzávislostinavýrobciaceně.Kmitočet,naněmž pracujeprocesor,semůžepohybovatoddesítekkHzdostovekMHz,pamětiprogramuadatmohounabývat velikostiodněkolikakBdojednotekMB,avstupně/výstupníchpinůmůžebýtpouzeněkolikpárů,čipřes stovku.

Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.