Upload
vuongtruc
View
222
Download
0
Embed Size (px)
Citation preview
M1-Archi 2016-2017 Page1
___________________________________________________________________________
TPn°1:Architecturedessystèmesàmicroprocesseur___________________________________________________________________________
Objectifsdelaséance
-Priseenmaindel’environnementdedéveloppementµVisiondeKiel-Compréhensiondesfichierssourcesnécessairesàlaprogrammationdumicrocontrôleur-Utilisationdudebugger,visualisationdesregistresetdesmémoires
___________________________________________________________________________
Matérielrequis: -Uneplateformenucleo-boardSTM32F401REparbinôme___________________________________________________________________________Organisationdelaséance:
1) Analysedesfichiers2) Utilisationdudebugger3) Ajoutdefonctionnalités4) Conclusion/Bilan
ToutaulongdeceTP,desquestionsvoussontposées.Prenezletempsd’yrépondreetdeprendredesnotes.___________________________________________________________________________I. Introduction
Onseproposed’utiliserl’outilSTM32CubeMX.Cetutilitairepermetdeconfigurergraphiquementlemicrocontrôleur.Onyspécifienotammentlessourcesd’horloge,lespériphériquesquel’onsouhaiteutiliser,lessourcesinterruptions,etc.
1. LancerSTM32CubeMX
M1-Archi 2016-2017 Page2
2. Créerunnouveauprojet.Chercheretsélectionnerensuitelaplateformequel’onsouhaiteutiliser(Nucleo64avecunMCUSTM32F401RETx)puisOK.
Vousarrivezsurl’écranprincipaledeconfigurationduMCU.
M1-Archi 2016-2017 Page3
3. Faireuneremiseàzérodesbrochesvial’ongletPinout/ClearPinouts
4. VouspouvezobserverdanslafenêtrePinout,l’ensembledespériphériquesquipeuventêtreutilisésainsiquelesOStemps-réelsetautresfonctionnalitéslogicielles.
5. AcôtédePinoutsetrouveclockconfiguration.
Danscettefenêtre,vouspouvezgraphiquementdéfinirlessourcesd’horlogepourconfigurerl’horlogeprincipale(SYSCLK)dumicrocontrôleur.Vousnoterezqu’ilexisteplusieursentréespossibles(HSI/HSEetPLLCLK).End’autrestermes,vouspouvezchoisirentreuneclockinterne(HSI-16MHz),uneclockexterne
M1-Archi 2016-2017 Page4
(HSE–4à26MHz)etunehorlogegénéréeparunePLL(PLLCLK).Deplus,vousremarquerezquel’horlogedesbusetdespériphériquesdépendentdeSYSCLK,hormisl’horlogepourl’USBainsiquepourl’audio(I2Sclock).
Nous allons choisir une source d’horloge externe et générer une horlogesystème SYSCLK à 84MHz. Nous avons vu aussi qu’il existe un registrespécifiquedecontrôleauseindumicrocontrôleurpermettantdeconfigurerlasourced’horlogeprincipale.C’estleregistreRCC(ResetandClockControl).Dans la fenêtrePinout, indiquer comme source d’horloge HSE (High SpeedClock)quelasourced’horlogeprovientduCrystal/CeramicResonator.
Vouspouvezobserverdanslafenêtreclockconfigurationqu’unesourced’horlogeà8MHzaétédéfinie.Ilresteàconfigurerlesmultiplexeursetlediviseur.Enmodifiantlavaleurdupré-scaleurMde16à8,vousdevezobtenirunehorlogeSYSCLKà84MHzcommeindiquésurlafiguresuivante:
M1-Archi 2016-2017 Page5
6. Lecontrôleurderesetetd’horloge(RCC)permetaussidegérerlesdifférentessourcesdereset:
o Systemreset(remiseàzérodesregistresviaNRSTpin)o Powerreset,o Backupdomainreset.
Il est nécessaire d’autoriser les interruptions au niveau du contrôleurd’interruption NVIC comme indiqué sur la figure suivante, accessible via lafenêtreconfiguration:
ApplyandOK.
M1-Archi 2016-2017 Page6
Toujoursdanslafenêtreconfiguration,cliquersurRCC.SurVddVoltage,vouspouvezremarquerquel’onpeutdirectementajusterlatensiond’alimentationdumicrocontrôleur(1.71<Vdd<3.6V).DanslesousongletNVICSettings,toujoursdanslemenuRCC,onpeutremarquerquelesinterruptionsglobalesontétéprisesencompte(vialesactionsaupoint6).
7. OnsouhaiteaussipouvoircontrôlerlaLED.Celle-ciestconnectéeauPortAd’E/S(GPIOA)etàlabroche5(PA5).VouspouvezlacherchervialeFind:
IlfautdoncladéfinirentantqueGPIO_Outputcommesuit:
VousnoterezquelabrochePA5possèdeplusieursfonctionnalités(pouvantserviràd’autrespériphériquescommeleTIMER,l’ADC,laliaisonSPI…).Unefoisconfiguré,retournerdanslafenêtreconfiguration,puisGPIO.Vousnoterezcommentaétéconfigurélabroche(push-pull…)
M1-Archi 2016-2017 Page7
8. GénérationducodeetduprojetpourKeiluVisionC’estladernièreétapedeconfigurationduprojet.AllerdansProject/Settings.
DansProjectNameindiquerlenomdevotreprojet.DansProjectlocation,indiquerlerépertoiredevotreprojetoùseragénérerlecode.DansToolchain/IDE,indiquerMDK-ARMv5.DansLinkerSettings,vouspouvezobserverlatailledeszonesdeHeapetdeStack(Pile).Lazone‘Heap’estunemémoireallouéepourstockerdesvariablescrééesdynamiquementaucoursdel’exécution.LaPileestunemémoirespécifiquepermettantlasauvegarded’information(contenuderegistre,adressedesous-programme,…).Typiquement,sil’ondéfinitunetaillemiminalede0x200,celarevientàréserver512octetsdemémoireRAMpourlazonede‘heap’.PourlaPile,lazoneminimaleestdeuxfoisplusgrande(environ1Ko).
M1-Archi 2016-2017 Page8
Dansl’ongletsuivant,CodeGenerator,sélectionner“Copyonlythenecessarylibraryfiles”.PuisOK
Enfin,dansl’ongletProject,GenerateCode.
CliquerensuitesurOpenProjectpourouvrirleprojetgénérésousµVision.
M1-Archi 2016-2017 Page9
II. AnalysedesfichiersgénérésdansµVisiondeKiel
Avantdes’intéresseràlaprogrammationdumicrocontrôleur,onseproposed’étudierlesfichierssourcesquiontétégénérésafindebiencomprendreleursrôlesrespectifs.
DanslafenêtreProject,vouspouvezobserverplusieursrépertoires: Application/MDK-ARM Drivers/CMSIS Drivers/STM32F4xx_HAL_Driver Application/UserLerépertoireApplication/MDK–ARMcontientunfichiernomméstartup_stm32F401xe.s.Question:
-Selonvousàquoisertcefichier?Retrouverlesinformationssuivantes: .TailledelaPile? .Contenuàl’adresse0delatabledesvecteursd’exceptions/interruptions? -QuelleactionestréaliséelorsduresetparleReset_Handler?
Dans le répertoire Drivers/CMSIS, regarder le fichier nommé system_stm32f4xx.c. Vouspouvez observer que ce fichier contient plusieurs fonctions réalisant notammentl’initialisationduCPU,laconfigurationdel’horlogesystème(SYSCLK).Vousaureznoté,quelafonctionSystemInitestlafonctionappeléedirectementàlasuitedureset.DanslerépertoireDrivers/STM32F4xx_HAL_Driverssontprésentslesdriverspermettantlecontrôledenombreuxpériphériquesdumicroprocesseur(DMA,Timer,GPIO,…).DansledernierdossierappeléApplication/User,setrouve3fichiers. -main.c -stm32f4xx_hal_msp.c -stm32f4xx_it.cQuestion:Quecontiennentlesfichiersstm32f4xx_it.cetstm32f4xx_hal_msp.c?Ouvrerlefichierstm32f401xe.h(étendezlefichiermain.c)Question:Quecontientcefichier?Retrouverlemappingmémoire.
-AquellesadressescommenceetterminelaFLASH?laSRAM?lamémoireallouéepourlespériphériques?
M1-Archi 2016-2017 Page10
-Aquelleadressecommencelazonemémoirepourl’ADC?III. Ajoutdefonctionnalités
Commevouspouvezleremarquer,lecoden’effectueaucuntraitementspécialaprèslesétapesd’initialisationetdeconfiguration.Nousallonsdoncrajouterquelquestraitements.1) Initialisationdedeuxtableaux
a. Ecrituredelafonction
Danslefichiermain.c,réaliserunefonctionvoidinit_tab()quiréalisel’initialisationdedeuxtableauxde10entiersnonsignésaveclesvaleurssuivantes: Tab0={0,1,2,3,4,5,6,7,8,9};
Tab1={10,11,12,13,14,15,16,17,18,19};
Unefoislecodecomplété,compilervialatoucheF7oul’icône:S’ilyauneerreur,consulterlesfenêtresBuildOutputetErrorlistpoursavoird’oùelleprovientetlacorriger.Recompilerjusqu’àcequ’iln’yaitplusd’erreur.Sic’estlecas,lefichierexécutableaétécréé.Onpeutpasseràl’étapededebug.
b. DebugConnecterlaplateformevialelienUSB.Ilestpossiblequeledriverdedebugnesoitpasspécifié.Vérifierdansl’ongletFlash/ConfigureFlashTools,puisdansDebug,vérifierqueST-LinkDebuggerestbienchoisicommeindiquéparlafigureci-dessous,puisOK:
Onvamaintenants’intéresseraudebugger.Lancerlevial’ongletDebug/Start-StopDebugsession.
M1-Archi 2016-2017 Page11
Unmessageindiquantl’utilisationdelaversiond’évaluation(limitantlatailledufichierexécutable)peutapparaître.CliquersurOK.
• Lesfenêtresdevisualisation
Plusieursfenêtressontalorsvisiblescommelemontrelafiguresuivante:
o Registers->affichelecontenucourantdesregistresdumicrocontrôleur.o Disassembly->affichelecodeassembleurgénéréàpartirdevotrecodeC.o Command -> permet à l’utilisateur de rentrer des commandes lors du
debugo CallStack+locals->permetd’observerl’adressedelafonctioncourante
exécutéeainsiquelesvariableslocalesutilisées(adressesetcontenus)
M1-Archi 2016-2017 Page12
Questions: -Quelleest l’adresseduregistrePCau lancementdudebug?Dansquellemémoirevotrefonctionmaina-t-elledoncétéplacée?-Mêmequestionpourlepointeurdepile(StackPointer)?-QuecontientleregistrexPSR?
uVision est très riche en outils permettant le debug efficace d’un code. Des fenêtressupplémentairespeuventêtreajoutéesvial’ongletView.Parexemple,dansSerialWindows,onpeutobserverlesdonnéesenvoyéessurlaliaisonsérie(UART,printf).µVisiondisposeaussid’un analyseur logique (View/Analysis Windows/Logic Analyzer) permettant d’observerl’évolutiond’unsignalaucoursdutemps.Lors de l’exécution d’un programme, il peut être intéressant d’enregistrer les tracesd’exceptionsetd’évènementsquisesontproduitsdurantl’exécution(View/Trace/TraceexceptionsouEventcounters).Lorsdel’utilisationdepériphérique,touslesregistrescorrespondantspeuventêtrevisualisésviaView/SystemViewer/.
-RajouterunefenêtredevisualisationdelamémoireviaMemoryWindows/Memory1.
-TaperdanslechampAddress,lavaleurPC.è Onpeutdoncvisualiserlecontenudesregistresàleur
emplacementenmémoireainsiquepourtouteslesvariablesdel’application.Anoterquel’affichagedesdonnées(decimal,signed,unsignedint/short..)peutêtremodifiéviaunclicdroitdanslazonemémoire.
-Effectuerunenouvellerecherchepourtab0.
Questions: -Dansquellemémoiresonttab0ettab1?
Mettreunpointd’arrêtsurlaligned’appelàlafonctioninit_tab()danslefichiermain.c(encliquantsurlazonegriseàgauchedunumérodeligne).
M1-Archi 2016-2017 Page13
Onlanceensuitel’exécutionducodejusqu’àcetteligneencliquantsurF5ouvial’icônesuivante.Ondisposeaussideplusieurscommandespoureffectuerdupas-à-pas:
1)2)3)4)
NB: 1-Step->permetderentrerdanslaprochaineétaped’exécutiondelacommandeC
2-Stepover->permetdecontinuerl’exécutionjusqu’àlaprochaineligne3-Stepout->permetdesortiedelafonctioncourante4-Runcursortoline->permetdelancerl’exécutionducodejusqu’àlaligneindiquée
Avanttouteautrechose,releverlavaleurduPCetduLR.Chercheraussienmémoirel’adressedeinit_tab()etlarelever. Avantfonctioninit_tab(): PC= LR=Puisrentrerdanslafonctioninit_tab()eneffectuantunpas(icôneStepouvialatoucheF11).NoterànouveaulavaleurdePCetLR.
Aprèsentréedanslafonction PC= LR=Regarderaussidanslafenêtrecallstack+Locals(cf.fenêtreenbasàdroite),l’adresseetlecontenudelavariabled’indexdeboucle(sivousavezutiliséuneboucleforparexemple).
-Questionoptionnelle:déterminerdansquelregistredetravaileststockéelavariabled’indexdelaboucle
Onvamaintenantvérifierenpas-à-pas(icôneStepOveroutoucheF10)quel’initialisationdutableausedéroulecorrectement.Onpourravérifiersimultanémentl’évolutionducontenumémoirevialafenêtreMemory1,address=tab0outab1.Alafindelafonctioninit_tab()etavantderevenirauprogrammeprincipal,noterànouveaulesvaleursdePCetLR. Findefonctioninit_tab() PC= LR=Avancerdenouveauàl’aidedeStepOver(F10). Retourauprogrammeprincipal PC= LR=ConcluresurlefonctionnementduregistrePCetduregistreLR.Sibesoin,reprendrelesétapesprécédentesenvisualisantlecodeassembleurvialafenêtreDisassembly.(NoteBLetBXindiquedesbranchementscf.http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/CIHJJEIH.htmlpuisl’instructionset).Laremiseà0dumicrocontrôleurpeuts’effectuerviaDebug/ResetCPU.IMPORTANT:silecontenudetab0ettab1àlafindelafonctiond’initialisationnesontpascorrects,modifiervotrecodeetré-itérerledebug.
M1-Archi 2016-2017 Page14
2) Additionsdescontenusdesdeuxtableaux
Onsouhaitemaintenant faire l’additiondesdeuxtableauxtab0et tab1.Dans le fichiermain.c,décriremaintenantlafonctionadd_tab()quipermetderéaliserl’opérationsuivante: Tab1[i]=Tab0[i]+Tab1[i];Compiler et s’il n’y a pas d’erreur, lancer le debugger. Vérifier en pas à pas, le bonfonctionnementdevotreprogrammeetobserverlesrésultatsenmémoire.Pourcela,refairecommeprécédemment,placerunpointd’arrêtsurlorsdel’appelàlafonctionadd_tab()etexécuterenpasàpaslesinstructions.
3) Détectiondesommepaire
Onsouhaitemaintenantdétectersilasommeducontenudetab1estpaire.Sic’estlecas,onallumeralaledLD2.Celle-ciestconnectéephysiquementàlabroche5duportGPIOA(PinA5).Pourpouvoirmanipulerdesélémentsexternesaucoeur, ilestnécessairedeconfigurerlesportsd’entrée-sortie.Dansnotrecas,ilfaudraconfigurerleportGPIOAetlapin5.Ceciadéjàété réalisé par l’utilitaire STM32CubeMX qui a décrit la fonctionMX_GPIO_Init(). On nechercherapasforcémentàcomprendretoutecettefonction(CourssurlesGPIOsàvenir).Dansunpremiertemps,écrivezlafonctionunsignedintcalcul_somme()quiretournelasommedetouslesélémentsdeTab1.Vérifiersonfonctionnement.Dansunsecondtemps,modifiervotrecodepourmettreà1laledsilasommeestpaire,sinonlalaisserà0. Utiliserlalignesuivantepourallumerlaled:
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET); Pourl’éteindre: HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);Unefoisquetoutfonctionne,vouspouveztesterl’autrecaspossible.Enmodedebug,placervousaprèslafonctioncalcul_somme().Enaccédantdirectementauxregistresetàlamémoireetsansmodifierlecodeexistant,chercherànepasallumerlaled.IV. Bilanetconclusion
LorsdeceTP,vousavezpuvousanalyserlesdifférentsfichiersnécessairesàl’initialisationetlaconfigurationdumicrocontrôleur.Le debugger est un élément indispensable lors de tout développement de code pour unprocesseurouunmicrocontrôleur.µVisiondisposed’unenvironnementtrèsrichedontvousavezvuquelquespossibilités.Ainsi,pouvoiraccéderdirectementauxregistres,visualiserlecontenudesmémoires,(etc.)sontautantd’élémentsindispensablespourbiencomprendre,testeretvalideruneimplémentation.
M1-Archi 2016-2017 Page15