Bon, j'ai un peu avancé, mais pas du coté hardware ( cela sera en 2 ème partie) mais plutôt du coté software mais je rencontre encore quelques problèmes pour charger un .wav dans la flash.
J'utilise une autre carte que la tienne (STM32F4-disco), j'utilise une STM32L476-disco cependant sur la carte il y a exactement le mm DAC audio (CS43L22) avec la prise jack par contre les entrée analog ne sont pas accessible depuis l'extension.
Bref du coup j'ai essayé de mettre en pratique ce que j'ai écris dans un de mes précédent post, soit charger un .wav ds la flash.
Tout d'abord j'utilise comme IDE keil µvision 5 lite (bloqué a 32Ko pour le prg) et j'ai donc téléchargé le firmware proposé sur le site de ST pour tester ma carte.
Donc le programme s'appelle SAI_AudioPlay avec une partie du readme qui explique ce a quoi on doit arriver si tout ce passe correctement:
This example shows how to use the SAI HAL API to play an audio file using the DMA
circular mode and how to handle the buffer update.
Plug a headphone to ear the sound /!\ Take care of yours ears.
Default volume is 20%.
The audio file is played in loop
@Note: Copy file 'audio.bin' (available in AudioFile) directly in the flash
at @0x08080000 using ST-Link utility
Once started, LED5 is toggling on STM32L476G-Discovery.
Après plusieurs recherche j'ai donc trouvé comment charger ce fameux 'audio.bin' qui est téléchargé lors du téléchargment du firmware ==> STM32Cube_FW_L4_V1.3.0 ( voila son petit nom)
Donc j'ai du installé STM32 ST-LINK Utility:
Voir ci-dessus le snap de STM32 ST-LINK Utility après avoir injecté mon fichier 'audio.bin' dans la flash de mon µcontroleur
J'ai du changer le start adress car par défaut cela commencé a 0x08000000 alors que ds le readme il indique de commencer a 0x08080000.
Ensuite j'ai compilé le programme SAI_AudioPlay (avec keil), je l'ai chargé, passé en mode debug, Start et bingo enfin du son sort de mon casque audio une mauvaise musique en boucle qui dure 3s environ et ce répète en boucle.
Je ne voulais pas en rester la et j'ai décidé d'injecter mon propre morceau (.wav) première chose je suis limité a 1Mo (taille de ma flash) et au extension .bin ( je crois que c'est le seul format accepté par ST-LINK Utility ).
Et la commença le début de la galère. Déja j'ai galéré pour transformer un .wav en .bin mais bon j'ai réussi en créant un image cd avec daemon tools, mon .wav devient un .iso (car daemon ou moi lol ne sait pas faire directement de .bin) ensuite j'ai utilisé magicIso pour convertir mon .iso en .bin ==> yes ca marche sauf qu'a chaque conversion mon fichier fait plus qu' 1 Mo et peut importe la taille du fichier .wav.
En modifiant des paramètres dans daemon j'arrive a sortir des fichiers inferieurs a 100 Ko, bien bien, je le charge dans ma flash pas d'erreur de chargement par contre aucun son qui sort et la LED5 reste figé ce qui indique une erreur lors du deroulement du programme.
Je cherches, je regarde quelques paramètres audios implémentés dans le prog SAI_AudioPlay:
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 SaiHandle.Init.AudioMode = SAI_MODEMASTER_TX; SaiHandle.Init.Synchro = SAI_ASYNCHRONOUS; SaiHandle.Init.OutputDrive = SAI_OUTPUTDRIVE_ENABLE; SaiHandle.Init.NoDivider = SAI_MASTERDIVIDER_ENABLE; SaiHandle.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_1QF; SaiHandle.Init.AudioFrequency = SAI_AUDIO_FREQUENCY_22K; SaiHandle.Init.Protocol = SAI_FREE_PROTOCOL; SaiHandle.Init.DataSize = SAI_DATASIZE_16; SaiHandle.Init.FirstBit = SAI_FIRSTBIT_MSB; SaiHandle.Init.ClockStrobing = SAI_CLOCKSTROBING_FALLINGEDGE; SaiHandle.Init.SynchroExt = SAI_SYNCEXT_DISABLE; SaiHandle.Init.Mckdiv = 0; /* N.U */ SaiHandle.Init.MonoStereoMode = SAI_STEREOMODE; SaiHandle.Init.CompandingMode = SAI_NOCOMPANDING; SaiHandle.Init.TriState = SAI_OUTPUT_NOTRELEASED; SaiHandle.FrameInit.FrameLength = 32; SaiHandle.FrameInit.ActiveFrameLength = 16; SaiHandle.FrameInit.FSDefinition = SAI_FS_CHANNEL_IDENTIFICATION; SaiHandle.FrameInit.FSPolarity = SAI_FS_ACTIVE_LOW; SaiHandle.FrameInit.FSOffset = SAI_FS_BEFOREFIRSTBIT; SaiHandle.SlotInit.FirstBitOffset = 0; SaiHandle.SlotInit.SlotSize = SAI_SLOTSIZE_DATASIZE; SaiHandle.SlotInit.SlotNumber = 2; SaiHandle.SlotInit.SlotActive = (SAI_SLOTACTIVE_0 | SAI_SLOTACTIVE_1);
La dedans j'arrive a dechiffrer quelques lignes qui correspondent au paramètre de mon fichier audio, du coup je choisis un fichier .wav avec ces caractéristiques:
-216k, stereo, 16-bit, 22050 Hz, 2.5 seconds
Je refait la manip idem aucun son ne sort...
Je passe en mode debug, j'avance pas a pas pour voir ou est le pb et dès qu j'arrive a cette ligne :
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 /* Check if the buffer has been loaded in flash */ if(*((uint64_t *)AUDIO_FILE_ADDRESS) != 0x017EFE2446464952 ) Error_Handler();
si je fais étape suivante (en mode debug), je suis renvoyé au if (UpdatePointer != 1) de la boucle sans fin du program:
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 /* Start loopback */ while(1) { BSP_LED_Toggle(LED5); /* Wait a callback event */ while(UpdatePointer==-1); int position = UpdatePointer; UpdatePointer = -1; /* Upate the first or the second part of the buffer */ for(int i = 0; i < PLAY_BUFF_SIZE/2; i++) { PlayBuff[i+position] = *(uint16_t *)(AUDIO_FILE_ADDRESS + PlaybackPosition); PlaybackPosition+=2; } /* check the end of the file */ if((PlaybackPosition+PLAY_BUFF_SIZE/2) > AUDIO_FILE_SIZE) { PlaybackPosition = PLAY_HEADER; } if(UpdatePointer != -1) { /* Buffer update time is too long compare to the data transfer time */ Error_Handler(); } }
Et la fonction Error_Handler fait ceci:
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 /** * @brief This function is executed in case of error occurrence. * @param None * @retval None */ void Error_Handler(void) { /* LED5 On in error case */ BSP_LED_On(LED5); while (1) { } }
Donc on est bien dans une erreur_handler.
Ensuite j'ai essayé d'occulter la ligne en la mettant en commentaire:
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 /* Check if the buffer has been loaded in flash */ //if(*((uint64_t *)AUDIO_FILE_ADDRESS) != 0x017EFE2446464952 ) Error_Handler();
Et la mon fichier son s’exécute mais avec un horrible grésillement.
Bref pour le moment je ne vois pas trop d'ou le problème peut venir je vais y réfléchir et essayer de trouver des infos...
Si ca intéresse du monde je peux mettre un peu plus de programme je ne voulais pas inonder mon post avec du code imbitable...
Partager