Port parallèle et interruption 1. PORT PARALLELE GPIO DU C67 1.1. Position du switch 4 de la carte. Attention : le Switch 4 de SW3 doit être ON sur la maquette au Reset ! Les 3 autres OFF 1.2. Schéma de principe 1.3. Registres 1 Port parallèle et interruption 1.4. Utilisation en simple IO SUR LA MAQUETTE, on disposera : De la ligne 8, GP8 et en sortie seulement, de 0 à 3.3 V, (protégée par CMOS). De la ligne 0, GP0 en entrée seulement (avec ou sans interruption, voir plus loin). 2 Port parallèle et interruption 3 Port parallèle et interruption 4 1.5. Utilisation en interruption Par défaut, les lignes travaillent simplement sans fonctions logiques supplémentaires (mode Pass Through). Des fonctions logiques sont programmables par GPGC (Global Control Register) pour actionner l’interruption GPINT0. Non décrit ici. Il y a ainsi 16 sources d’interruptions possibles directes ou DMA. Seuls GPINT0 et GPINT[4…7] peuvent travailler en interruption directe pour le GPIO dub C6713. SUR LA MAQUETTE, on utilisera le bit GP0 et l’interruption GPINT0 Entrée 0, 3.3V protection par CMOS (doubles inverseurs par HC00). Validation des interruptions Se reporter au chapitre « Interruptions sur DSP C67 » pour plus de détail. Ici on ne fournit que les registres propres au GPIO. Pour les transitions LH Port parallèle et interruption 5 Pour les transitions HL On met 1 pour valider. Attention, la nomination est ici impropre, il ne s’agit pas d’un masque, mais plutôt d’une validation (en logique positive !!!) Drapeaux transition LH (Raz en écrivant 1) transition HL (Raz en écrivant 1) Port parallèle et interruption 6 Port parallèle et interruption 2. 7 INTERRUPTIONS SUR DSP C6713 2.1. Description rapide Il y a 32 sources d’interruption masquables (lignes extérieures, port parallèle GPIO, DMA, RINT et XINT des lignes séries rapides, Timer …). Initialisées au départ graphiquement par « l’outil de configuration » (fichier .cdb) Certains registres sont ainsi programmé automatiquement Nom de Fonction assembleur C _it_machin void machin(void) Pour 12 interruptions possibles (INT4 à INT15) Non masquables Reset NMI Réservée Réservée Masquables INT4 INT5 …. INT15 Validation à trois endroits différents : 1) Bit GIE (Global Interrupt Enable) bit de validation général dans le CSR (pas d’adresse, donc accessible en assembleur seul par MVC.., ou par une méthode spéciale en C si elle existe). Déjà à 1 dans le noyau de base de travail de la carte DSKC6713. 2) Bit IEi pour chaque INTi dans le IER (Interrupt Enable Register) (pas d’adresse, donc accessible en assembleur seul par MVC.., ou par une méthode spéciale en C si elle existe). Les drapeaux correspondant IFi dans IFR (Interrupt Flag Register) évoluent automatiquement. 3) Bits de validation des IT pour chaque périphérique, avec leurs drapeaux associés, que l’on remet à zéro par logiciel Une interruption n’est à priori pas interruptible. Si l’on voulait rendre interruptible une interruption (nested interrupt), c’est possible, voir plus loin. Port parallèle et interruption 8 2.2. Exemple sur la carte DSKC67 et le Code-Composeur 2.2.1. Source de l’interruption, et nom de la fonction 32 sources différentes Pour assigner une source à chaque INTi (i de 0 à 15) Par MUXH (019C0000) et MUXL (019C0004) (adresses indiquées ci-dessous, donc accessible en C). Port parallèle et interruption 9 Pour le bit 0 du GPIO (GPINT0) sur INT4, il faudra : MUXL = ……..10000 L’association de la source d’interruption et aussi du nom de la fonction se fait aisément au moyen de l’outil graphique (DSP/BIOS Config et fichier à Double cliquer dsk_c6713.cdb : Puis sheduling Puis HWI-Hardware interrupt service manager HWI_INT4 et click droit et propriété : Source : GPIO_interrupt0 Function : _Nomdelafonction (underscore obligatoire, car ce nom doit être reconnu par l’assembleur (en C le nom est : Nomdelafonction ) Pour annuler cette association : remettre HWI_unused comme nom de fonction. On peut ensuite vérifier (View Memory) que les 5 bits LSB de 019C0004 (MUXL) sont bien 10000. L’outil graphique ne prépare pas toute l’interruption, mais seulement et c’est déjà pas mal : L’association d’une source à une INTi particulière L’association d’un INTi à une fonction, et donc gère ainsi la table d’interruption. L’Interrupt Handler du C quand à lui s’occupera des sauvegardes nécessaires et du retour d’interruption. Port parallèle et interruption 10 2.2.2. Logiciel, et Interrupt Handler en C Table d’interruption : Interrupt Service Table (IST) Pas de vecteurs, le processeur part directement exécuter 8 instructions qui correspondent à l’interruption concernée : l’Interrrupt Service Fetch Packet (ISFP) IRP contient l’adresse de retour (Interrupt Return Pointer). L’adresse de retour d’interruption n’est pas empilé automatiquement ! (Attention donc, plantage complet si on a des interruptions multiples identiques sans retour !) Si le programme d’interruption dépasse 8 instructions, cas fréquent, des ISFP additionnels sont crées. L’outil graphique et l’Interrupt Handler gèrent d’interruption un peu particulière, heureusement !!! complètement cette table Port parallèle et interruption 11 Seul le ‘Reset Fetch Packet’ est toujours à l’adresse 0. Les autres sont le plus souvent déplacées en mémoire n’importe où par saut de 256 words. Tout ceci est configuré par logiciel sur la carte DSKC6713. voir éventuellement, mais finalement pas utile. Adresse de base à Bit GIE (bit Global Interrupt Enable du Control Status register CSR) déjà validé sur la carte DSK Sinon, à manipuler à priori par une fonction assembleur, car pas d’adresse. (Remarque : si on étudiait plus à fond les instructions spéciales du C, il se peut qu’il y ait un autre moyen). Bits IEi de IER (Interrupt Enable Register) validation d’interruption INT4 à INT15) Ces registres n’ont pas d’adresse, donc à manipuler à priori par une fonction assembleur. (Remarque : si on étudiait plus à fond les instructions spéciales du C, il se peut qu’il y ait un autre moyen). Pour valider ou inhiber INT4 sur la carte DSK, on écrira par exemple la fonction C : void valid_int4(void) ; void inhib_int4(void) ; .text MVK MVC OR MVC B NOP 5 MVK MVC AND MVC B NOP 5 10h,B1 ; 0001 0000 IER,B0 ;get IER B1,B0,B0 ;set to one B0,IER ;put in IER B3 ; B3 contient l’adresse de retour -17,B1 ; 1110 1111 IER,B0 ;get IER B1,B0,B0 ;set to one B0,IER ;put in IER B3 ; B3 contient l’adresse de retour (Ces fonctions sont fournies dans le fichier pour_it.asm). Bits IFi de IFR (Interrupt Flag Register) (drapeaux d’interruption INT4 à INT15) Port parallèle et interruption 12 Ceux ci se remettent à zéro automatiquement. On pourrait les manipuler par logiciel par les registres ISR (Interrupt Set Register) et ICR (Interrupt Clear Register), en écrivant 1 à chaque fois au niveau du bit manipulé. Interrupt Handler, écriture d’une simple interruption en C : Si on nommé cette fonction _it_machin au moyen de l’outil graphique DSP/BIOS Config. La mention interrupt est absolument nécessaire, sinon pas de message d’erreur, mais pas de génération de retour d’interruption, ni de sauvegarde et restitution de contexte. Donc le plantage serait total (outil de développement compris !!! ). On écrira en C ; interrupt void it_machin(void) { // description de la fonction GPDH = 0x01 ; Raz drapeau de front au niveau du périphérique : ici le bit 0 du GPIO pour une transition LH validée en interruption. } Le C gère toute la Table d’interruption, le retour d’interruption ainsi que toutes les sauvegardes de registres nécessaires. On ne s’occupera donc que de: La validation de l’interruption INTi utilisée (ici INT4). Voir ci-dessus. La remise à zéro des drapeaux associés aux évènements coté périphériques : pour vous le drapeau associé à une transition d’une ligne du GPIO (bit 0). Voir le chapitre sur le GPIO. cas d’interruption interruptible (Nested interrupt) Si pour des besoins de temps reél, on veut rendre une interruption interruptible, on devra écrire une fonction comme mle modèle ci-dessous : interrupt void it_machin(void) { Sauver IRP (Interrupt Return Pointer) et CSR (Control Status Register) dans deux variables locales (en assembleur, où si elle existe méthode spéciale en C car pas d’adresses). Revalider les interruptions générales (mise à 1 du bit 1, le bit GIE du CSR). // Travail en interruption pouvant alors être interrompu ! Port parallèle et interruption 13 Invalider les interruptions générales (mise à 0 du bit 1, le bit GIE du CSR). Restaurer l’ancien CSR, puis l’ancien IRP (assembleur ou méthode spéciale en C). } 2.2.3. Exemple: synthèse de fréquence, wobbulé par signal carré voir solution du TP correspondant. 1. 2. PORT PARALLELE GPIO DU C67 1 1.1. 1.2. 1.3. 1.4. 1.5. 1 1 1 2 4 Position du switch 4 de la carte. Schéma de principe Registres Utilisation en simple IO Utilisation en interruption INTERRUPTIONS SUR DSP C6713 7 2.1. Description rapide 2.2. Exemple sur la carte DSKC67 et le Code-Composeur 2.2.1. Source de l’interruption, et nom de la fonction 2.2.2. Logiciel, et Interrupt Handler en C 2.2.3. Exemple: synthèse de fréquence, wobbulé par signal carré 7 8 8 10 13