mirror of
https://git.etud.insa-toulouse.fr/boujon/voilier-team-1.git
synced 2025-06-08 07:50:49 +02:00
Added ADC section in driver.mds
This commit is contained in:
parent
5c83198ad4
commit
15885e832a
3 changed files with 59 additions and 1 deletions
BIN
assets/adc_cfgr.png
Normal file
BIN
assets/adc_cfgr.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.6 KiB |
BIN
assets/adc_cr2.PNG
Normal file
BIN
assets/adc_cr2.PNG
Normal file
Binary file not shown.
After Width: | Height: | Size: 26 KiB |
|
@ -78,9 +78,26 @@ Enfin, une fonction nommée XXX_IRQHandler sera appelée à l'interruption, il s
|
||||||
### Timer Interruption
|
### Timer Interruption
|
||||||
Le registre pour l'activation de l'interruption est dans TimerX_DIER, sur le bit 0 nommé UIE (Update Interrupt Enable).
|
Le registre pour l'activation de l'interruption est dans TimerX_DIER, sur le bit 0 nommé UIE (Update Interrupt Enable).
|
||||||
Le flag d'interruption est UIF.
|
Le flag d'interruption est UIF.
|
||||||
|
### ADC Interruption
|
||||||
|
L'adc est plus complexe que les autres car il demande des pins pour être liés à une interruption, pour activer ce dernier nous allons observer un registre en particulier, **ADC_CR2** :
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Ici quelques bits vont être mis à 1 pour permettre l'interruption, soit :
|
||||||
|
- **ADC_CR2_EXTTRIG** : active un trigger externe
|
||||||
|
- **ADC_CR2_EXTSEL** : On choisi l'event externe pour l'allumage de l'adc, par défaut SWSTART
|
||||||
|
On active ensuite l'interruption avec le bit **EOCIE** qui est présent dans le registre **CR1**.
|
||||||
|
Le flag d'intteruption est **EOC** (End of Conversion) dans le registre **SR**.
|
||||||
|
|
||||||
|
Pour relancer une conversion ou init le premier, il faut mettre à 1 dans le registre **CR2** le bit SWSTART comme ceci :
|
||||||
|
```c
|
||||||
|
ADC->CR2 |= ADC_CR2_SWSTART;
|
||||||
|
```
|
||||||
|
|
||||||
|
*NB : Il est important de faire tout ce qui est fait dans la partie ADC avant de faire les interruptions. En effet ADON sert toujours à l'initialisation mais ne servira pas pour relancer une conversion, il est remplacé par SW_START*
|
||||||
### UART Interruption
|
### UART Interruption
|
||||||
Le registre pour l'activation de l'interruption est dans USART_CR1, sur le bit 5 (RXNEIE pour la recepetion) et 7 (TXEIE pour la transmission).
|
Le registre pour l'activation de l'interruption est dans USART_CR1, sur le bit 5 (RXNEIE pour la recepetion) et 7 (TXEIE pour la transmission).
|
||||||
Le flag d'intteruption est .
|
Le flag d'intteruption est RXNE ou TXE.
|
||||||
|
|
||||||
## PWM
|
## PWM
|
||||||
Pour activer le mode PWM il existe un registre pour chacun des timers permettant d'activer un mode pwm précis. Ce dernier est présent dans le registre CCMRx. Les bits qui nous intéresse sont OCXM. Il existe différents modes pouvant être trouvés page 414 du [Reference Manual](../assets/cd00171190-stm32f101xx-stm32f102xx-stm32f103xx-stm32f105xx-and-stm32f107xx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf). Ici nous utiliseront le même car il est simple :
|
Pour activer le mode PWM il existe un registre pour chacun des timers permettant d'activer un mode pwm précis. Ce dernier est présent dans le registre CCMRx. Les bits qui nous intéresse sont OCXM. Il existe différents modes pouvant être trouvés page 414 du [Reference Manual](../assets/cd00171190-stm32f101xx-stm32f102xx-stm32f103xx-stm32f105xx-and-stm32f107xx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf). Ici nous utiliseront le même car il est simple :
|
||||||
|
@ -99,6 +116,47 @@ Ce dernier permet d'activer avec CCXE le registre précedemment paramétré.
|
||||||
---
|
---
|
||||||
Une GPIO est ainsi associé à chaque PIN. Pour la retrouver il suffit de se rendre à la page 28 du [Manuel F103RB](../assets/STM32F103RB-3.pdf) et voir quelle pin est associée à quel channel de timer. Il suffit de mettre cette dernière en AltOutPpull.
|
Une GPIO est ainsi associé à chaque PIN. Pour la retrouver il suffit de se rendre à la page 28 du [Manuel F103RB](../assets/STM32F103RB-3.pdf) et voir quelle pin est associée à quel channel de timer. Il suffit de mettre cette dernière en AltOutPpull.
|
||||||
|
|
||||||
|
## ADC
|
||||||
|
Dans le cas de l'ADC il faut activer celui pour ADCX, le registre est dans **RCC->APB2ENR**.
|
||||||
|
|
||||||
|
---
|
||||||
|
L'une des difficultés que nous pouvons rencontrer avec l'ADC est la prédivision de la clock qui doit être réalisé pour qu'une conversion soit possible. En effet la clock de base de 72 MHz fonctionne bien trop rapidement par rapport au module ADC. Ce dernier fonctionne au maxmimum à 16 MHz. Pour régler ce dernier il faut alors toucher au **RCC_CFGR**, le registre de clock configuration. Les bits qui nous intéresses sont 15 et 14 : **ADCPRE** :
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Le minimum pouvant être mis en place est donc "10" avec PCLK2 divisé par 6, ce qui donne 12 MHz
|
||||||
|
|
||||||
|
```c
|
||||||
|
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
|
||||||
|
RCC->CFGR |= RCC_CFGR_ADCPRE_1;
|
||||||
|
```
|
||||||
|
---
|
||||||
|
Le second registre qui nous intéressera sera **ADC_SMPRX**. Ce dernier permet de modifier pour un channel donné X, le nombre de cycle que l'adc devra réalisé pour récupérer une donnée. Une explication liée au résistance peut être faite, mais ici nous nous sommes contentés de mettre sa valeur à 41.5 cycles, soit 100.
|
||||||
|
|
||||||
|
```c
|
||||||
|
ADCStructPtr->ADC->SMPR2 |= (ADCStructPtr->cycle<<(ADCStructPtr->channel*3));
|
||||||
|
//ou pour channel > 10 :
|
||||||
|
ADCStructPtr->ADC->SMPR1 |= (ADCStructPtr->cycle<<((ADCStructPtr->channel-10)*3));
|
||||||
|
```
|
||||||
|
---
|
||||||
|
Le prochain registre est le **ADC_SQR1** : Ce dernier va nous permettre de faire un certain nombre de conversions. Ici nous ne voulons qu'une seule donc la donnée dans les bits **L** (Bits 23-20) sera *0000*.
|
||||||
|
```c
|
||||||
|
ADCStructPtr->ADC->SQR1 &= ADC_SQR1_L;
|
||||||
|
```
|
||||||
|
---
|
||||||
|
Le registre **ADC_SQR3** va par la suite nous permettre de sélectionner quel channel nous utilisons pour l'ADC. En effet après avoir changé le nombre de cycles, il faut faire comprendre au STM32 que nous voulons la donnée sur un channel précis. C'est donc aux bits SQ1(Bits 4-0) que nous mettrons un numéro de channel sur 5 bits. C'est le premier channel de conversion, il est possible dans régler d'autres par la suite, mais nous ne l'avons pas fait.
|
||||||
|
```c
|
||||||
|
ADCStructPtr->ADC->SQR3 |= channel; //avec channel de 0 à 17
|
||||||
|
```
|
||||||
|
---
|
||||||
|
Finalement, pour initialiser ou faire une une conversion analogique numérique un biot précis dans le registre **ADC_CR2** doit être mis à 1.
|
||||||
|
Ce dernier est ADON et permet dans un premier temps d'initialiser l'ADC, et dans un second, de faire une conversion quelconque, il est donc préférable de l'utiliser en tant que MACRO :
|
||||||
|
```c
|
||||||
|
ADCStructPtr->ADC->CR2 |= ADC_CR2_ADON;
|
||||||
|
//utilisation en macro :
|
||||||
|
#define MyADC_Start(ADC) (ADC->CR2 |= ADC_CR2_ADON)
|
||||||
|
```
|
||||||
|
|
||||||
## UART
|
## UART
|
||||||
Dans le cas de l'UART il faut activer celui pour USARTXEN, le registre est dans **RCC->APBXENR**. Pour l'USART 1 il se trouve dans APB2ENR, et pour les autres dans APB1ENR.
|
Dans le cas de l'UART il faut activer celui pour USARTXEN, le registre est dans **RCC->APBXENR**. Pour l'USART 1 il se trouve dans APB2ENR, et pour les autres dans APB1ENR.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue