port parallele gpio et interruptions

publicité
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
Téléchargement