Electronique´ num´erique J.-M Friedt Electronique´ num´erique J.-M Friedt FEMTO-ST/d´epartement temps-fr´equence [email protected] transparents `a jmfriedt.free.fr 22 novembre 2020 1 / 25 Electronique´ num´erique J.-M Friedt Plan des interventions : 7 cours/TP d'introduction au STM32 en C baremetal : 1 Electronique´ num´eriqueet conception du circuit L3 : aspects analogiques, consommation ´electrique,lecture de datasheet Survol des divers p´eriph´eriquesqui seront abord´es(RS232, SPI, timer, ADC) repr´esentationdes donn´ees(tailles/encodage), masques, architecture Rappels sur Atmega32U4 (Makefile, compilation, masques ...) 2 Premiers pas sur le STM32, adresses des p´eriph´eriques,architecture 3 Fonctionnement de gcc et optimisations : pr´eprocess{compilateur{assembleur{linker, passage C `aassembleur, pointeurs 4 biblioth`equeset s´eparation algorithme/mat´eriel,simulateurs libopencm3, newlib & stubs, ressources requises par les biblioth`eques 5 Bus de communication s´erie,synchrone/asynchrone 6 arithm´etiquesur syst`emesembarqu´es entiers, flottants, convertir un algorithme exprim´een nombres `avirgules vers des entiers, timers 7 interruptions et acquisition de donn´eesanalogiques, fr´equence d'´echantillonnage vecteurs d'interruption, gestion des horloges du STM32, ADC 2 / 25 Electronique´ num´erique J.-M Friedt Compiler son compilateur Une cha^ınede compilation n´ecessite 1 le compilateur (gcc) 2 les outils pour convertir les divers formats de fichiers (binutils) 3 les biblioth`eques (newlib) + debugger (gdb) + outils de programmation du microcontr^oleur (avrdude, stm32flash, dfu-programmer ...) configure --target=arm-none-eabi --prefix=$fHOMEg/sat Automatiser ce processus dans un script pour g´en´ererun ensemble \coh´erent"d'outils 1. 1. explication de son utilisation `a http://jmfriedt.free.fr/summon_arm.pdf 3 / 25 Electronique´ num´erique J.-M Friedt newlib Implication de la biblioth`equede calculs flottants : sans stdio, avec une division flottante 12950 sans stdio, avec atan sur flottant 17090 toujours en thumb : avec stdio, avec une division flottante 80397 avec stdio, avec atan sur flottant 80397 Thumb est un sous-ensemble d'instructions pour processeur ARM cod´esur 16 bits au lieu de 32 bits 2 Diverses impl´ementations libres des biblioth`equesstandard du C : • glibc (http://www.gnu.org/software/libc/, utilis´eepar le noyau Linux) ... • ... et eglibc (embedded glibc, http://www.eglibc.org/home) ont fusionn´e, • uClibc (http://www.uclibc.org/, utilis´eepar uClinux), 2. J.-M Friedt, E.´ Carry, D´eveloppement sur processeur `abase de cœur ARM7 sous GNU/Linux, GNU/Linux Magazine France 117 (Juin 2009), pp.40-59 4 / 25 Electronique´ num´erique J.-M Friedt Le probl`eme... Dans un programme en C, l'appel `a malloc() se traduit par une erreur `al'´editionde liens arm-none-eabi/lib/thumb/cortex-m3/libc.a(lib_a-sbrkr.o): In function `_sbrk_r': newlib/libc/reent/sbrkr.c:58: undefined reference to `_sbrk' Idem pour printf() arm-none-eabi/lib/thumb/cortex-m3/libc.a(lib_a-sbrkr.o): In function `_sbrk_r': newlib/libc/reent/sbrkr.c:58: undefined reference to `_sbrk' arm-none-eabi/lib/thumb/cortex-m3/libc.a(lib_a-writer.o): In function `_write_r': newlib/libc/reent/writer.c:58: undefined reference to `_write' arm-none-eabi/lib/thumb/cortex-m3/libc.a(lib_a-closer.o): In function `_close_r': newlib/libc/reent/closer.c:53: undefined reference to `_close' arm-none-eabi/lib/thumb/cortex-m3/libc.a(lib_a-fstatr.o): In function `_fstat_r': newlib/libc/reent/fstatr.c:62: undefined reference to `_fstat' arm-none-eabi/lib/thumb/cortex-m3/libc.a(lib_a-isattyr.o): In function `_isatty_r': newlib/libc/reent/isattyr.c:58: undefined reference to `_isatty' arm-none-eabi/lib/thumb/cortex-m3/libc.a(lib_a-lseekr.o): In function `_lseek_r': newlib/libc/reent/lseekr.c:58: undefined reference to `_lseek' arm-none-eabi/lib/thumb/cortex-m3/libc.a(lib_a-readr.o): In function `_read_r': newlib/libc/reent/readr.c:58: undefined reference to `_read' 5 / 25 Electronique´ num´erique J.-M Friedt Exploitation d'une biblioth`eque{ newlib https://sourceware.org/newlib/libc.html#Stubs : 17 stubs, colle entre newlib et nos programmes 3. • exit : quitter un programme • lseek : sans fermer les fichiers ouverts • open : • environ : • read : lire depuis un fichier • execve : • sbrk : utilis´epar malloc • fork : • stat : • fstat : • times : • getpid : • unlink : • isatty : • wait : • kill : • write : ´ecriredans un fichier, • link : incluant stdout 3. http://wiki.osdev.org/Porting_Newlib 6 / 25 Electronique´ num´erique J.-M Friedt Exploitation d'une biblioth`eque{ newlib Exemple d'impl´ementation (envoyer stdio sur port s´erie) s s i z e t r e a d r (struct r e e n t ∗r , int file, void ∗ptr , s i z e t l e n ) fc h a r c; int i; unsigned char ∗p ; p = (unsigned char ∗) p t r ; f o r (i=0; i < l e n ; i ++) fw h i l e ( global i n d e x == 0) fg //!uart0 k b h i t()); c = g l o b a l tab [0]; global i n d e x =0; //(char) uart0 g e t c(); i f (c == 0x0D) f∗p='\0' ;break; g ∗p++ = c ; j m f putchar(c,NULL,0 ,0) ; g r e t u r n len − i ; g s s i z e t w r i t e r ( struct r e e n t ∗r , int file, const void ∗ptr , s i z e t l e n ) f i n t i; const unsigned char ∗p ; p = (const unsigned char ∗) p t r ; f o r (i=0; i < l e n ; i ++) f i f( ∗p == '\n' ) j m f p u t c h a r ( '\r' ,NULL,0 ,0) ; j m f p u t c h a r (∗p++,NULL , 0 , 0 ) ; g r e t u r n len; g v o i d jmf p u t c h a r (int a,char ∗chaine , int ∗ c h a i n e i n d e x ,int USARTx) f i f (chaine != NULL) fc h a i n e [∗ c h a i n e i n d e x ]=a ;∗ c h a i n e i n d e x=∗c h a i n e i n d e x +1;g e l s e f i f (usart p o r t ==1) fUSART SendData (USART1, a); w h i l e(USART GetFlagStatus(USART1, USART FLAG TC) == RESET) f ; g g e l s e fUSART SendData (USART2, a); w h i l e(USART GetFlagStatus(USART2, USART FLAG TC) == RESET) f ; g g g g 7 / 25 Electronique´ num´erique J.-M Friedt D´emonstration #ifdef use s t d i o f o r (tempe=1;tempe <10;tempe++) fmf=mf∗ l f ; g p r i n t f ( "\n+mf=%d\n" ,(int)mf); t =(char ∗)malloc(200); // malloc requiert s b r k p r i n t f ( "^%x\n^%x\n" ,(int)t[0],t[199]); memset(t ,0x55,200) ; p r i n t f ( "^%x\n^%x\n" ,(int)t[0],t[199]); #endif w h i l e (1) f #ifndef use s t d i o p u t chars(welcome); #else p r i n t f ( "%s" , welcome ) ; #endif i f (i <10) p u t c h a r (USART1 , i+'0' ); e l s e put c h a r (USART1 , i+'A' −10) ; i ++;if (i==16) i=0; ... 8 / 25 Electronique´ num´erique J.-M Friedt D´emonstration Compromis entre temps de d´eveloppement, fonctionnalit´eset occupation de ressources 3240 main.bin 31824 main_stdio.bin Ici, affichage par printf(), allocation de m´emoirepar malloc(), calculs flottants Un ´emulateurpour tester ses programmes en l'absence du mat´eriel: https://github.com/beckus/qemu_stm32 qemu-system-arm -M stm32-p103 -serial stdio -serial stdio -kernel main.bin suppose n´eanmoinsune impl´ementation\correcte" des p´eriph´eriques. simavr pour Atmega32U2 9 / 25 Electronique´ num´erique J.-M Friedt Stubs • Un programme principal contient toute l'\intelligence" du code : algorithmique • Ce programme fait exclusivement appel `ades fonctions g´en´eriques ind´ependantes du mat´eriel: stubs • L'acc`esde ces fonctions au mat´eriel est impl´ement´edans des fichiers s´epar´es • Algorithmique est li´eaux appels mat´erielpar le compilation (compilation s´epar´ee) • Possibilit´ede passer des arguments par Makefile : variables et tests conditionnels • Edition´ de lien g´en`ereun ex´ecutable algorithmique matériel1 matériel2, bibliothèque1 matériel2, bibliothèque2 led_on() GP3DAT |= 0x00070000; GPIO_SetBits(GPIOC,GPIO_Pin_2); gpio_set (GPIOA, GPIO4); led_off() GP3DAT |&= (~0x00070000); GPIO_ResetBits(GPIOC,GPIO_Pin_1); gpio_clear(GPIOA, GPIO4); communique() COMTX = a; USART_SendData (USART1, a); usart_send_blocking (USART1,a) Makefile MODBUS = 0 #include makefile.cortex_AD9958 #include makefile.cortex_XE1203 include makefile.aduc ifeq ($(MODBUS),1) ... endif Edition de liens −> exécutable ! remplacement \ais´e"de la plateforme mat´eriellesans modifier l'algorithme (HAL) ! \fausses fonctions" sur PC pour ´emulerles appels : test unitaire 10 / 25 Electronique´ num´erique HAL : Hardware Abstraction Layer J.-M Friedt Android HAL ST Microelectronics development fra- mework https://source.android.com/devices/architecture https://www.st.com/en/embedded-software/x-cube-spn14.html 11 / 25 Electronique´ num´erique J.-M Friedt Conception de logiciels 1 S´eparer le code li´eau mat´eriel(initialisation et acc`esaux ressources mat´erielles)de l'algorithmique 2 Compilation s´epar´ee: choisir une impl´ementationdu mat´erielou une ´emulationlogicielle (gcc supporte une multitude de plateformes) 3 Permet de tester son code sur PC avant de le porter au microcontr^oleur(simulation de diverses conditions mat´erielles){ test automatique, en particulier de cas pathologiques 4 Exploitation d'un simulateur pour conna^ıtrel'´etatinterne de la machine qui s´equencele code 5 qemu pour grand nombre de plateformes, simavr pour Atmega32U2 unsigned short interroge (unsigned short puissance, unsigned int freq,unsigned int offset,unsigned char chan) { unsigned int v12; FTW0[1] = (freq & 0xFF000000) >> 24; FTW0[2] = (freq & 0xFF0000) >> 16; FTW0[3] = (freq & 0xFF00) >> 8; FTW0[4] = (freq & 0xFF); [...] v12 = readADC12 (); readerF2_CLR; // coupe reception TIM_ITConfig (TIM3, TIM_IT_Update, ENABLE); return (v&0x03F); } 12 / 25 Electronique´ num´erique J.-M Friedt Conception de logiciels 1 S´eparer le code li´eau mat´eriel(initialisation et acc`esaux ressources mat´erielles)de l'algorithmique 2 Compilation s´epar´ee:
Details
-
File Typepdf
-
Upload Time-
-
Content LanguagesEnglish
-
Upload UserAnonymous/Not logged-in
-
File Pages25 Page
-
File Size-