2016-12-21 1 views
1

J'utilise la carte STM32L486ZG en mode pouce. Je cours une application simple de métal nu sans aucun RTOS. J'ai SRAM externe connecté à la carte en utilisant FSM. La SRAM externe est située à l'adresse 0x60000000. Le système est initialisé et en cours d'exécution à 72MHz (j'ai essayé cette question avec une fréquence 18-80 MHz) maintenant dans ma fonction principale que j'ai le code suivant:L'instruction LDMIA ne fonctionne pas correctement sur la SRAM externe dans le cortex M4

int main(){ 
    asm volatile (
      "push {r0}\n" 
      "mov r0, #0x60000000\n" 
      "add r0, #0x400\n" 
      "stmdb r0!, {r1-r12}\n" 
      "ldmia r0!, {r1-r12}\n" 
      "pop {r0}\n" 
      ); 
} 

Selon ce code ne registre doit être changé après fonction principale a exécuté, mais ce n'est pas le cas après l'instruction suivante

ldmia r0!, {r1-r12} 

-à-dire r9 n'est pas correct après l'exécution. stmdb instruction fonctionne correctement mais ldmia ne charge pas les données correctement. J'ai vérifié cela en regardant le contenu de la mémoire.

Ce problème persiste avec tous les arguments de l'instruction ldmia: le 9ème registre est toujours affecté.

Explication: Disons que je suis mise au point de ce code et l'instruction suivante à exécuter est la suivante:

stmdb r0!, {r1-r12} 

après avoir quitté tous ces registres ont été enregistrés dans la mémoire et la valeur de r0 est 0x600003d0

le contenu de la mémoire:

0x600003D0 00000000 40021008 0000000C [email protected] 
0x600003DC 40000000 00000000 00000000 [email protected] 
0x600003E8 20017FEC 00000000 00000000 ì.. ........ 
0x600003F4 00000000 00000000 00000000 ............ 
contenu

des registres:

r0 0x600003d0 
r1 0x00000000 
r2 0x40021008 
r3 0x0000000c 
r4 0x40000000 
r5 0x00000000 
r6 0x00000000 
r7 0x20017fec 
r8 0x00000000 
r9 0x00000000 
r10 0x00000000 
r11 0x00000000 
r12 0x00000000 

cela montre que tous les registres sont sauvegardés avec succès dans la mémoire. Maintenant, j'étape, l'instruction suivante

ldmia r0!, {r1-r12} 

après ceux-ci sont le contenu des registres:

r0 0x60000400 
r1 0x00000000 
r2 0x40021008 
r3 0x0000000c 
r4 0x40000000 
r5 0x00000000 
r6 0x00000000 
r7 0x20017fec 
r8 0x00000000 
r9 0x555555d5 
r10 0x00000000 
r11 0x00000000 
r12 0x00000000 

que vous pouvez voir tous les registres sont restaurés à l'exception r9 qui a curieusement sa valeur « pop » ed de 0x60000000 au lieu de 0x600003F0.

Une idée de ce qui pourrait être à l'origine de ce problème. J'utilise Jlink pour écrire en flash.

P.S.Ce problème ne se produit pas lorsque les registres sont enregistrés sur SRAM onchip par opposition à SRAM externe;

modifier si l'instruction

ldmia r0!, {r1-r12} 

est divisé en deux parties comme:

ldmia r0!, {r1-r6} 
ldmia r0!, {r7-r12} 

alors tous les registres sont restaurés avec succès

+0

"J'ai une application SRAM externe connectée à la carte avec FSM" ... Qu'est-ce qu'un ** FSM ** – fazkan

+0

Les registres au-delà du 9ème sont-ils toujours corrects? Le fait qu'il semble aller de travers à une limite de 32 octets sent un peu comme si les lignes d'adresse ne sont pas câblées à droite ou le contrôleur de mémoire n'est pas configuré correctement (en particulier en ce qui concerne le fractionnement AHB et/ou le timing) . – Notlikethat

+0

@Notlikethat Oui, ils sont toujours corrects que le 9 est le défectueux. – ALK007

Répondre

5

Vous devez lire le STM32L4xx6xx Silicon Limites. Section 2.2.4 L'accès en rafale de neuf mots ou plus n'est pas pris en charge par FMC. (DocID026121 Rev 4) disponible auprès de ST.

« CPU accès en lecture fondit égal ou plus de 9 registres à FMC renvoie les données corrompues à partir du mot lu 9. Ces rafales ne peuvent être générés par CPU Cortex®-M4 et non par les autres maîtres (c.-à- Ce problème se produit lorsque la pile est reconfigurée dans la mémoire externe sur le FMC et Les opérations POP sont effectuées avec 9 registres ou plus Cela se produit également lorsque des opérations LDM/VLDM sont utilisées avec 9 registres ou plus. "

+0

Il fournit également le travail. Je n'ai mis qu'un extrait ici. –

+0

Merci Cela a vraiment aidé – ALK007