Fixes on driver.md

This commit is contained in:
Yohan Boujon 2023-04-09 18:29:16 +02:00
parent c5e1ee0a59
commit 6e780d03a3

View file

@ -5,14 +5,21 @@ Dans notre cas chaque GPIO est dans APB2ENR (page 112 de [Reference Manual](../a
---
Par la suite il faut choisir quelle pin activer dans le GPIO et en quel mode. Tout cela se passe dans le registre CR ainsi que ODR pour un GPIO Précis. ODR lui va permettre de sélectionner le pull-up/pull-down. Voici le registre :
![ODR](../assets/odr.png)
Pour sélectionner le mode, cela se passe dans le registre CR L/H :
![CRLH](../assets/crl.PNG)
Attention pour les pins > 7 -> Il faut aller sur le registre high, donc CRH, qui suit la même logique que ce dernier, mais à la différence que celui-ci commence par le bit 8.
Il suffit donc avec tous ces registres de suivre le tableau **Figure 20** Sur les différents modes :
![CRLH](../assets/table20_portbit.PNG)
L'un des meilleurs moyens pour respecter ce dernier est donc de faire une énumération avec le configuration mode voulu. Comme ça plus besoin de chercher les bons bits. Pour les bits MODE, il suffit de mettre à 0 pour Input, et n'importe quelle autre variable pour Output.
Ensuite il faut modifier en conséquence CNF\[1:0], soit le tableau suivant :
|Configuration Name|Bits sets|
|:-:|---|
|In_Floating|0x04|
@ -23,7 +30,7 @@ Ensuite il faut modifier en conséquence CNF\[1:0], soit le tableau suivant :
|Out_OD|0x05|
|AltOut_Ppull|0x09|
|AltOut_OD|0x0d|
Tout ces defines doivent être décalés de $4\times PinNumber$.
Tout ces defines doivent être décalés de 4 \* PinNumber.
---
Pour ensuite set ou reset ces pins il suffit d'utiliser les deux registres suivants :
@ -40,16 +47,25 @@ Dans le cas du Timer il faut activer celui pour TIMXEN, le registre est dans **R
---
Il suffit ensuite de régler le PSC et l'ARR pour pouvoir obtenir l'horloge de notre choix sur un timer donné.
Le PSC permet de diviser la clock par un certain nombre en respectant cette formule :
$$\frac{f_{CK\_PSC}}{PSC+1}=CK\_CNT$$
```
fCKPSC/PSC+1 = fCKCNT
```
Ensuite en fonction du Time-base unit différents modes sont possible pour ARR, le registre de comptage va s'arrêter de compter à partir de cette valeur ARR. Mais le signal renvoyé par la clock, ou même le flag du timer ne répondra pas de la même manière.
Le mode par défaut est donc celui du change on reset. pour trouver la fréquence associée il nous suffit de faire :
$$\frac{f_{CK\_CNT}}{ARR+1}=CK\_ARR$$
```
fCKCNT/ARR+1 = CK_ARR
```
Au final les deux registres étant sur 16 bits, il est possible d'avoir une précision de la division à 32 bits/
## Interruption
Les interruptions doivent être activées de manières différente pour chaque module, mais cela dit il reste quelques similaritées sur le module NVIC qui doit être correctement configuré pour un module donné.
Il faut tout d'abord activer l'interruption du côté du module et ensuite modifier la table des vecteurs du NVIC.
La première est celle des prioritées, trouvable dans le [Manuel de Référence RM008](../assets/cd00171190-stm32f101xx-stm32f102xx-stm32f103xx-stm32f105xx-and-stm32f107xx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf) page 197, la second e est l'ISER qui permet la réecriture des fonction d'IRQ trouvable dans le [Manuel de programmation PM0056](../assets/New_Programming_Manual_CortexM3.pdf) page 119.
```c
uint32_t IRQNumber = GetInterruptNum(); //XXX_IRQn
NVIC->IP[IRQNumber] |= (Prio << 0x4);
@ -71,10 +87,12 @@ Pour activer le mode PWM il existe un registre pour chacun des timers permettant
CCMR2 possède les channels 3 et 4, et CCMR1 1 et 2. Tous sont utilisable pour chaque Timer.
---
Le CCRX (Capture/Compare Register) est un registre de 16 bit qui va déterminer pour un mode de PWM donné le moment où le timer renverra 1 ou 0. Cette variable peut être directement liée à l'ARR : ce qui permet de régler l'$\alpha$ d'un PWM directement.
Le CCRX (Capture/Compare Register) est un registre de 16 bit qui va déterminer pour un mode de PWM donné le moment où le timer renverra 1 ou 0. Cette variable peut être directement liée à l'ARR : ce qui permet de régler l'alpha d'un PWM directement.
Et finalement pour activer ce registre le Timer possède un registre nommé CCER
![ODR](../assets/ccer.png)
Ce dernier permet d'activer avec CCXE le registre précedemment paramétré.
---
@ -85,24 +103,33 @@ Dans le cas de l'UART il faut activer celui pour USARTXEN, le registre est dans
---
Après cela il suffit de régler le registre BRR. C'est un registre de 16 bits qui permet de calculer le baud rate. Il existe une méthode de calcul avec le chiffre après la virgule mais il est ici inutile de l'utiliser. Il suffit de faire :
$$BRR=\frac{f_{CLK}}{BaudRate}$$
A noter que le $f_{CLK}$ est différent en fonction de l'U(S)ART choisi. Ici nous avons retenu que :
|UART Channel|$f_{CLK}$|
```
BRR=f_CLK/BaudRate
```
A noter que le f_CLK est différent en fonction de l'U(S)ART choisi. Ici nous avons retenu que :
|UART Channel|f_CLK|
|:-:|---|
|1|72 MHz|
|2|36 MHz|
|3|36 MHz|
*Ces données sont trouvables dans le schéma de câblage des UARTs*
---
Par la suite il faut régler le mode de l'UART, pour cela nous allons nous concentrer sur deux registres :
|Registre|Fonctions|
|:-:|:--|
|CR1|Enable, Taille, Parité, RxD/TxD Enable, Interruption|
|CR2|Bits de stop|
Voici le registre CR1 de l'UART et quels bits modifier pour chacune des fonctions voulues :
![ODR](../assets/usart_cr1.png)
Les registres qui nous intéresse sont donc les suivants :
- **UE** : USART Enable, à activer dès le début
- **M** : Taille de la donnée, 0->8 bits, 1->9 bits
@ -110,6 +137,7 @@ Les registres qui nous intéresse sont donc les suivants :
- **TE** et **RE** : Activation de la transmission et de la reception
- **RXNEIE** : Activation de l'interruption pour la reception
Pour CR2 tout ce qui nous intéresse sont les bits **STOP** (12 et 13):
|STOP \[1:0]|Stop bit|
|:-:|---|
|00|1|
@ -119,7 +147,9 @@ Pour CR2 tout ce qui nous intéresse sont les bits **STOP** (12 et 13):
---
Pour la reception ou la transmission des bits sont associés pour savoir si le uC a bien envoyé ou reçu une donnée depuis le TR/RR (TxD Register, RxD Register) vers le Data Register, Ils sont tous présents dans le SR (Status Register) :
![ODR](../assets/usart_sr.png)
- RXNE détermine qu'une donnée est reçue si ce bit est à 1. Après lecture de la donnée dans le DR(Data Register), il faut forcer ce dernier à 0 pour le reset
- TXE permet de savoir si le registre TR est vide (ce qui veut dire que la donnée a bien été envoyée).
- TC permet de savoir si le dernier bit de stop a bien été mis dans le TR.