Documente Academic
Documente Profesional
Documente Cultură
Le Bloc EXTI
Chapitre
Le Bloc EXTI
Cortex-M3
Instructions Bus
DMA
Chapitre
Contrleurs DMA usage gnral (GP-DMA) dans les microcontrleurs STM32 (Famille F1)
Par Damergi Emir
Data Bus
System B
AHB Periph.
On voit bien que le processeur cortex-M3 peut accder aux instructions dans les mmoires Flash, SRAM systme (system SRAM) et la SRAM embarque (embedded SRAM). Pour les donnes, elles peuvent se trouver dans les diffrentes mmoires cites ainsi quau niveau des priphriques et peuvent tre accdes aussi bien par le processeur que par les 2 DMAs. Grce larchitecture en matrice du bus, il est possible deffectuer plusieurs transferts
1. Introduction
Comme tous les systmes processeurs, les microcontrleurs STM32 (famille F1) sont dots de contrleurs DMAs : 1 GP-DMA pour les low density et medium density devices. 2 GP-DMA pour les High density devices. 4 pour les connectivity line devices : 2GP-DMA et 2 contrleurs DMA ddis (SP-DMA) respectivement aux transferts vers et depuis les priphriques de communication Ethernet et USB. Ces Contrleurs DMA se partagent avec le Cortex-M3 un bus en matrice (multi AHB bus matrix) et permettent diffrentes combinaisons de transfert entre mmoires et priphriques (Figure 1).
simultans. Ainsi on peut avoir, par exemple, paralllement: Un accs du Cortex-M3 la mmoire Flash pour rcuprer des instructions (Inst bus). Un accs du DMA1 la mmoire Flash pour transfrer des donnes vers la mmoire SRAM embarque. Un accs du DMA2 la mmoire SRAM systme pour transfrer des donnes vers les priphriques.
Donc en bien choisissant les emplacements de stockage des donnes, les matres et les esclaves impliqus dans les transferts, on peut viter au maximum les conflits daccs une mme ressource et par consquent atteindre des performances optimales.
Chapitre
Le Bloc EXTI
Chapitre
Le Bloc EXTI
7 canaux possdant des niveaux de priorits matrielles fixes (Fixed hardware priority) par dfaut (Figure 3) qui peuvent tre reconfigurs par soft. Les priphriques pouvant mettre une requte de transfert aux diffrents canaux sont nombreux (Figure 3), mais un instant donn un seul priphrique par canal est autoris mettre une requte. Le transfert ne peut commencer si le signal de requte et le canal sont actifs Pour effectuer un transfert dune mmoire un autre, cest le signal MEM2MEM qui doit tre activ, et ceci ne peut se faire que par programmation soft (Figure 3). Dans ce cas le transfert sera lanc directement si le canal est actif. DMA 2 : disponible dans toutes les versions de la famille F1 lexception des low density devices qui ne contiennent que le DMA1. Le DMA 2 a les mmes proprits que le DMA 1 et est capable de grer jusqu 5 canaux (Figure 4).
Chapitre
Le Bloc EXTI
Chapitre
Le Bloc EXTI
transfrer, donc un maximum de 65535 units. Lunit pouvant tre 8, 16 ou 32 bits et est dtermine galement par le registre DMA_CCRx.
31.15 Not used DMA (Channel x) DMA_CMARx DMA_CNDTRx Data size Enable DMA_CRRx Transfer Direction Periph. DMA_CPARx 1 4 mem2 mem 1 3 Registre DMA_CCRx 1 2 1 1 MSIZE 1 0 9 8 PSIZE 7 MINC 6 PINC 5 CIRC 4 DIR 3
Interrupts
1
ENABLE
0 Channel ENABLE
bit
Pririty Level
// Voir parag 5
uint32_t DMA_M2M; uint32_t DMA_Priority; uint32_t DMA_MemoryDataSize;
Mmoire
Bridge
Figure -5 :
uint32_t DMA_DIR;
DMA_InitTypeDef;
Pour la configuration du DMA au niveau du code C (aprs activation de lhorloge) : 1On commence par dclarer une structure de type DMA_InitTypeDef DMA_InitStructure ;
DMA_InitTypeDef relative au DMA (faisant partie de la librairie Firmaware ST) et le contenu des registres prsents prcdemment. On prsentera ensuite la signification des paramtres. typedef struct {
Registre DMA_CPAR_x
DMA_InitTypeDef 2-
DMA_Deinit (DMAy_Channelx, &DMA_InitStructure) ; 3On initialise le canal x du DMA y avec les paramtres en invoquant la fonction
uint32_t DMA_PeripheralBaseAddr;
31.0 Bit
DMA_Init (DMAy_Channelx, &DMA_InitStructure) ; 4On active le canal par mise 1 du bit ENABLE (Un 0 dsactive le DMA)
Registre DMA_CMAR_x
DMA_Cmd (DMAy_Channelx, ENABLE); // pour dsactiver, on utilise pour le 2me paramtre // la valeur DISABLE
uint32_t DMA_MemoryBaseAddr;
31.0 Bit
Chapitre
Le Bloc EXTI
Chapitre
Le Bloc EXTI
Pour chacun des paramtres, on prsente ci-dessous la signification ainsi que les valeurs possibles quil peut prendre.
Proprit (Firmware Library) Bit (s) DMA_CCRx Signification La valeur permet de dterminer si le transfert doit tre effectu entre 2 mmoires ou non Transfert entre 2 mmoires. Dans ce cas la proprit DMA_PeripheralBaseAddr qui prend la valeur du registre DMA_CPARx reprsente ladresse dune zone mmoire. DMA_M2M_Enable 1 Mem. DMA (Channel x) DMA_CMARx DMA_CPARx DMA_MemoryInc_Disable 0 DMA_MemoryInc_Enable 1
DMA_MemoryInc
Bit 7
DMA_MemoryBaseAddr =DMA_CMARx doivent tre automatiquement incrmentes aprs chaque transfert. Incrmentation automatique de ladresse. Dans ce cas, si DMA_MemoryBaseAddr = X et DMA__BufferSize = Y. Alors le DMA commence par un transfert depuis ou vers ladresse X, ensuite incrmente ladresse aprs chaque transfert X+1, X+2,.X+Y. Donc, jusqu transfrer la totalit des donnes du Buffer. Paralllement DMA__BufferSize est dcrment. Aucune incrmentation. Cest gnralement le cas quand on lit partir dune adresse unique (DMA__BufferSize = 1).
DMA_M2M
Bit 14
DMA_PeripheralInc
DMA_M2M_Disable 0 Transfert entre un priphrique et une zone mmoire ou bien entre deux priphriques. Le Niveau de priorit attribu par programmation au canal. Si deux canaux ont le mme niveau de priorit, DMA_PeripheralInc_Disable DMA_PeripheralInc_Enable
Bit 6
1 0
Mme proprit que DMA_MemoryInc , mais pour la zone pointe par DMA_PeripheralBaseAddr Incrmentation automatique. Pas dincrmentation. Indique si le mode buffer circulaire est utilis. Le mode circulaire est utilis. Dans ce mode, une fois la dernire donne est transfre (ladresse X+Y), alors ladresse sera automatiquement rinitialise X et DMA__BufferSize Y. Rq: Ce mode ne peut tre utilis dans un transfert de mmoire mmoire (pour DMA_M2M = 1). Mode normal : aucune rinitialisation de ladresse
DMA_Priority
Bits 13, 12
alors cest la Fixed Hardware Priority (voir Parag 2) qui dtermine le canal le plus prioritaire. 4 niveaux sont possibles :
DMA_Mode
Bit5
11 10 01 00
Trs haute priorit Haute priorit Priorit moyenne Priorit faible La taille dune unit de donnes de la zone pointe par le registre DMA_CMARx. Elle peut tre : 1 byte (8 bits) demi mot (16 bits) 1 mot (32 bits) La taille dune unit de donnes de la zone pointe par le registre DMA_CPARx. Elle peut tre : 1 byte (8 bits) demi mot (16 bits) 1 mot (32 bits) Remarques : DMA_DIR_PeripheralSRC 0 DMA_DIR_PeripheralDST 1 DMA_Mode_Normal 0 DMA_Mode_Circular 1
DMA_MemoryDataSize 2
DMA_MemoryDataSize_Byte DMA_MemoryDataSize_HalfWord DMA_MemoryDataSize_Word
Bits 11, 10
00 01 10
DMA_DIR
Bit 4
Indique la direction du transfert. Zone pointe par DMA_PeripheralBaseAddr est la destination. Zone pointe par DMA_PeripheralBaseAddr est la source.
DMA_PeripheralDataSize
Bits 9, 8
00 01 10
Le changement dune proprit (donc laccs un registre) ne peut se faire que si le canal est dsactiv.
Si les tailles des zones source et destination sont diffrentes, consulter Paragraphe 6
Chapitre
Le Bloc EXTI
Chapitre
Le Bloc EXTI
1- Le registre DMA_ISR (DMA Interrupt Status Register) qui contient ltat des sources dinterruptions (IF : Interrupt Flag) de tous les canaux du DMA (4 bits pour chaque canal) et ne peut tre accd quen lecture :
Figure - 6 : Registre DMA_ISR Lactivation de ces sources dinterruptions se fait par la mise 1 des bits correspondants (Bits 3,2 et 1) dans le registre de configuration DMA_CCRx, un 0 pour les dsactiver :
4 3 TEIE 2 HTIE 1 TCIE 0 bit
Pour chaque canal x (x=1..7 pour DMA1 et x = 1..5 pour DMA2) : TEIFx, HTIFx et TCIFx chacun indiquant respectivement les tats des vnements (Transfer Error, Half Transfer et Transfer Complete). 1 si lvnement est a eu lieu, 0 sinon. GIFx (Global Interrupt Flag) est mis 1 si une ou plusieurs des 3 sources dinterruptions sont actives.
Bit 1 TCIE : Transfer Complete Interrupt Enable Bit 2 HTIE : Half Transfer Interrupt Enable Bit 3 TEIE : Transfer Error Interrupt Enable
Toutes les sources dinterruptions par canal ont une unique entre au niveau du contrleur dinterruptions NVIC et sont connectes au NIVIC comme suit (Figure 7)
DMA_ISR Register
DMA_CCRx Register
NVIC Register
Au niveau de la librairie Firmware ST, la fonction permettant daccder ces bits est : void DMA_ITConfig (param1, param2, param3) param1 tant le canal configurer ayant la syntaxe DMAy_Channelx (y : Nr DMA et x du canal). param2 spcifie les sources dinterruptions activer ou dsactiver et peut tre lune ou une combinaison (ou logique : | ) des valeurs suivantes : DMA_IT_TC, DMA_IT_HT et DMA_IT_TE. param3 prend la valeur ENABLED pour activer les sources dinterruptions et DISABLED pour les dsactiver. Exemple : pour activer les sources relatives au transfer complete et half transfer et dsactiver la source relative au transfer error du canal 5 du DMA2: DMA_ITConfig (DMA2_Channel5, DMA_IT_TC | DMA_IT_HT, ENABLE); DMA_ITConfig (DMA2_Channel5, DMA_IT_TE, DISABLE);
(Channel x)
OR OR
&
&
&
INT (NVIC)
Donc, pour quune interruption relative un canal x donn se dclenche, il faut que : Le canal DMA soit activ (bit EN du registre DMA_CCRx). Au moins, une parmi les sources dinterruptions autorises (bits TEIE, HTIE, TCIE du registre DMA_CCRx), se dclenche. Linterruption relative au canal soit autorise au niveau du NVIC. Ceci se fait par mise 1 du bit correspondant dans le registre de masquage du NVIC (ou bien en passant par la structure
En plus de ces bits, deux registres par DMA sont utiliss pour la gestion des sources dinterruptions :
10
Chapitre
Le Bloc EXTI
Par consquent, lors du dclenchement dune interruption relative un canal x, on ne peut dterminer directement la source de lvnement actif puisque toutes les 3 activent la mme ligne dinterruption au niveau du NVIC. Il faut donc commencer par consulter le registre DMA_ISR pour dterminer connatre quelle source parmi celles autorises a dclench linterruption. Pour la lecture de ltat dune source dinterruption dun canal x, soit on accde directement au bit (le registre fait partie de la zone Bit Banding), ou bien on peut utiliser une fonction de la STM32 Firmware Library :
2-
Le registre DMA_IFCR (DMA Interrupt Flag Clear Register) qui a exactement la mme
structure que le registre DMA_ISR (Figure 8). La mise 1 dun bit du registre DMA_IFCR a comme effet de remettre 0 le bit correspondant dans le registre DMA_ISR.
Figure -8 : Registre DMA_IFCR La mise 1 dun bit peut se faire par accs direct ou en utilisant la fonction du Firmware Library :
11
RM0008
RM0008
10.4.7
Register
DMA_CPAR4 Reset value DMA_CMAR4 Reset value
Table 60.
Offset
0x000
Register
DMA_ISR Reset value DMA_IFCR Reset value
Reserved
0 CTEIF7
0 CHTIF7
0 CTCIF7
0 CGIF7
0 CTEIF6
0 CHTIF6
0 CTCIF6
0 CGIF6
0 CTEIF5
0 CHTIF5
0 CTCIF5
0 CGIF5
0 CTEIF4
0 CHTIF4
0 CTCIF4
0 CGIF4
0 CTEIF3
0 CHTIF3
0 CTCIF3
0 CGIF3
0 CTEIF2
0 CHTIF2
0 CTCIF2
0 CGIF2
0 CTEIF1
0 CHTIF1
0 CTCIF1
0 CGIF1
0x058
DMA_CCR5
0x004
Reserved
Reset value 0x05C 0x060 0x064 DMA_CNDTR5 Reset value DMA_CPAR5 Reset value DMA_CMAR5 Reset value
0 MEM2MEM
0 M SIZE [1:0]
0 PSIZE [1:0]
0 MINC
0 PINC
0 CIRC
0 TEIE
0 HTIE
0 TCIE
0x008
DMA_CCR1
Reserved
PL [1:0] 0 0 0 0 0 0 0 0 0 0 0 0
DIR
Reset value 0x00C 0x010 0x014 0x018 DMA_CNDTR1 Reset value DMA_CPAR1 Reset value DMA_CMAR1 Reset value 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Reserved 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Reserved 0 PA[31:0] 0 0 0 0
0 0 0 0 MEM2MEM
0 0 0 0 M SIZE [1:0]
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
EN
NDT[15:0]
DMA_CCR6
MA[31:0] Reset value DMA_CNDTR6 Reset value DMA_CPAR6 Reset value DMA_CMAR6 Reset value
PSIZE [1:0]
MINC
CIRC
PINC
HTIE
TEIE
0x01C
DMA_CCR2
Reserved
PL [1:0] 0 0 0 0 0 0 0 0 0 0 0 0
TCIE
DIR
EN
0x074 0x078
Reset value 0x020 0x024 0x028 0x02C DMA_CNDTR2 Reset value DMA_CPAR2 Reset value DMA_CMAR2 Reset value 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Reserved 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Reserved 0 PA[31:0] 0 0 0 0
0 0 0 0 MEM2MEM
0 0 0 0 M SIZE [1:0]
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
NDT[15:0]
DMA_CCR7
MA[31:0] Reset value DMA_CNDTR7 Reset value DMA_CPAR7 Reset value DMA_CMAR7 Reset value
PSIZE [1:0]
MINC
CIRC
PINC
HTIE
TEIE
0x030
DMA_CCR3
Reserved
PL [1:0] 0 0 0 0 0 0 0 0 0 0 0 0
TCIE
DIR
EN
0x088 0x08C
Reset value 0x034 0x038 0x03C 0x040 DMA_CNDTR3 Reset value DMA_CPAR3 Reset value DMA_CMAR3 Reset value 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Reserved 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Reserved 0 PA[31:0] 0 0 0 0
0 0 0 0 MEM2MEM
0 0 0 0 M SIZE [1:0]
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0x090 0 0 0
NDT[15:0]
MA[31:0]
PSIZE [1:0]
MINC
CIRC
PINC
HTIE
TEIE
0x044
DMA_CCR4
Reserved
PL [1:0] 0 0 0 0 0 0
TCIE
DIR
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
NDT[15:0] 0
199/1003
EN
200/1003
EN 0
EN 0
EN 0