Compare commits
18 commits
c2a78c3a95
...
9d6c764ca5
Author | SHA1 | Date | |
---|---|---|---|
9d6c764ca5 | |||
91fbddca0d | |||
6e780d03a3 | |||
c5e1ee0a59 | |||
24cd95c9e3 | |||
381f0b6147 | |||
5f5fa1a099 | |||
3376dbff59 | |||
a1d5cd57d8 | |||
2a1180c521 | |||
5ec32ced3e | |||
9606282533 | |||
355f050ddd | |||
d9a4ae852d | |||
820a3db260 | |||
b2f1785052 | |||
398575d7c5 | |||
b7d418f6ad |
BIN
assets/New_Programming_Manual_CortexM3.pdf
Normal file
BIN
assets/STM32F103RB-3.pdf
Normal file
BIN
assets/ccer.png
Normal file
After Width: | Height: | Size: 7.6 KiB |
BIN
assets/crl.PNG
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
assets/odr.png
Normal file
After Width: | Height: | Size: 9.1 KiB |
BIN
assets/raspberry_config.jpg
Normal file
After Width: | Height: | Size: 599 KiB |
BIN
assets/raspberry_uart.jpg
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
assets/resultcmd0.png
Normal file
After Width: | Height: | Size: 5.6 KiB |
BIN
assets/table20_portbit.PNG
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
assets/usart_cr1.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
assets/usart_sr.png
Normal file
After Width: | Height: | Size: 14 KiB |
|
@ -41,4 +41,4 @@ void ADC1_2_IRQHandler(void)
|
|||
(*pFncADC) (); /* appel indirect de la fonction */
|
||||
MyADC_Base_Start(ADC1);
|
||||
ADC1->SR &= ~ADC_SR_EOC; //Prochaine lecture pouvant <20>tre effectu<74>e.
|
||||
}
|
||||
}
|
||||
|
|
163
driver/driver.md
Normal file
|
@ -0,0 +1,163 @@
|
|||
# Driver cheat sheet
|
||||
## GPIO
|
||||
Ne pas oublier de toujours activer la clock pour le driver concerné. Dans le cas du GPIO il faut activer celui pour GPIO_X, le registre est dans **RCC->APBXENR**
|
||||
Dans notre cas chaque GPIO est dans APB2ENR (page 112 de [Reference Manual](../assets/cd00171190-stm32f101xx-stm32f102xx-stm32f103xx-stm32f105xx-and-stm32f107xx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf)) : Des variables sont disponibles comme *RCC_APB2ENR_IOPAEN*
|
||||
|
||||
---
|
||||
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 :
|
||||
|
||||

|
||||
|
||||
Pour sélectionner le mode, cela se passe dans le registre CR L/H :
|
||||
|
||||

|
||||
|
||||
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 :
|
||||
|
||||

|
||||
|
||||
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|
|
||||
|In_PullDown|0x08|
|
||||
|In_PullUp|0xF8 *(normalement 0x08, mais ici différencié)*|
|
||||
|In_Analog|0x00|
|
||||
|Out_PullUp|0x01|
|
||||
|Out_OD|0x05|
|
||||
|AltOut_Ppull|0x09|
|
||||
|AltOut_OD|0x0d|
|
||||
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 :
|
||||
- BSRR pour set -> 1 décalé de la pin
|
||||
- BRR pour reset -> 1 décalé de la pin
|
||||
Pour observer ces dernières, le registre IDR est le plus intéressant :
|
||||
```c
|
||||
char gpioRead = (GPIO->IDR & (0x1 << GPIO_Pin)) > 0;
|
||||
```
|
||||
|
||||
## Timer
|
||||
Dans le cas du Timer il faut activer celui pour TIMXEN, le registre est dans **RCC->APBXENR**. Pour le timer 1 il se trouve dans APB2ENR, et pour les autres dans APB1ENR.
|
||||
|
||||
---
|
||||
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 :
|
||||
|
||||
```
|
||||
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 :
|
||||
|
||||
```
|
||||
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
|
||||
int iserRegister = 0; //A voir par rapport au manue lde reference RM008 -> emplacement de la table
|
||||
uint32_t IRQNumber = GetInterruptNum(); //XXX_IRQn
|
||||
NVIC->IP[IRQNumber] |= (Prio << 0x4);
|
||||
NVIC->ISER[iserRegister] |= (0x1<<(IRQNumber-(32*iserRegister)));
|
||||
```
|
||||
Enfin, une fonction nommée XXX_IRQHandler sera appelée à l'interruption, il suffiera de réecrire cette dernière pour qu'elle soit active.
|
||||
*NB : Il est important de remettre le flag d'interruption à 0 pour relancer ce dernier.*
|
||||
|
||||
### Timer Interruption
|
||||
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.
|
||||
### 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 flag d'intteruption est .
|
||||
|
||||
## 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 :
|
||||
- 110 : **PWM Mode 1**, tant que TIMx_CNT < TIMx_CCRX le channel est actif.
|
||||
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.
|
||||
|
||||
Et finalement pour activer ce registre le Timer possède un registre nommé CCER
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||
## 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.
|
||||
|
||||
---
|
||||
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=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 :
|
||||
|
||||

|
||||
|
||||
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
|
||||
- **PCE** et **PS** : PCE active ou non la parité. Si PCE=1, alors PS détermine le type de parité : 0 pour paire, 1 pour impaire.
|
||||
- **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|
|
||||
|01|0.5|
|
||||
|10|1.5|
|
||||
|11|2|
|
||||
|
||||
---
|
||||
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) :
|
||||
|
||||

|
||||
|
||||
- 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.
|
||||
*NB : Il est préférable d'utiliser TXE pour l'envoi de donnée.
|
||||
Ces trois bits fonctionnent aussi en interruption*
|
||||
|
||||
---
|
||||
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 USART Tx/Rx. Par la suite il est conseillé de mettre les différentes pins dans ces modes :
|
||||
- RXD : In Floating/In Pull up (pour un RaspberryPi par exemple)
|
||||
- TXD : AltOut Push Pull
|
|
@ -4,6 +4,7 @@
|
|||
void plantage(void) {
|
||||
while(1);
|
||||
}
|
||||
|
||||
void (*IT_Tim1) (void) = plantage;
|
||||
void (*IT_Tim2) (void) = plantage;
|
||||
void (*IT_Tim3) (void) = plantage;
|
||||
|
@ -168,10 +169,10 @@ if(Timer == TIM1)
|
|||
MyGPIO_Init(&PWM_OUT);
|
||||
}
|
||||
|
||||
void MyTimer_DutyCycle(TIM_TypeDef * Timer, char Channel, unsigned char DutyCycle)
|
||||
void MyTimer_DutyCycle(TIM_TypeDef * Timer, char Channel, unsigned int DutyCycle)
|
||||
{
|
||||
unsigned int RC;
|
||||
RC = ((Timer->ARR)/100)*(DutyCycle);
|
||||
RC = ((Timer->ARR)*(DutyCycle)/10000);
|
||||
switch (Channel) {
|
||||
case 1:
|
||||
Timer->CCR1 = RC;
|
||||
|
@ -189,4 +190,4 @@ void MyTimer_DutyCycle(TIM_TypeDef * Timer, char Channel, unsigned char DutyCycl
|
|||
Timer->CCR4 = RC;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ typedef struct {
|
|||
void MyTimer_Base_Init(MyTimer_Struct_Typedef * Timer);
|
||||
void MyTimer_ActiveIT(TIM_TypeDef * Timer, char Prio, void (*IT_function) (void));
|
||||
void MyTimer_PWM(TIM_TypeDef * Timer ,char Channel);
|
||||
void MyTimer_DutyCycle(TIM_TypeDef * Timer, char Channel, unsigned char DutyCycle);
|
||||
void MyTimer_DutyCycle(TIM_TypeDef * Timer, char Channel, unsigned int DutyCycle);
|
||||
|
||||
#define MyTimer_Base_Start(Tim) (Tim.Timer->CR1 |= TIM_CR1_CEN)
|
||||
#define MyTimer_Base_Stop(Tim) (Tim.Timer->CR1 &= ~TIM_CR1_CEN)
|
||||
|
|
184
driver/uart.c
|
@ -2,83 +2,156 @@
|
|||
#include "gpio.h"
|
||||
//faire GPIO
|
||||
|
||||
void (* pFncUART) (uint8_t data); /* d<>claration d<>un pointeur de fonction */
|
||||
|
||||
char data1 = 0x00;
|
||||
char data2 = 0x00;
|
||||
char data3 = 0x00;
|
||||
void MyUART_Init_Periph (void (* ptrFonction)(uint8_t))
|
||||
{
|
||||
pFncUART = ptrFonction; /* affectation du pointeur */
|
||||
}
|
||||
|
||||
int MyUART_setClockBit(MyUART_Struct_Typedef * UARTStructPtr)
|
||||
{
|
||||
if (UARTStructPtr->UART == USART1)
|
||||
{
|
||||
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
|
||||
USART1->BRR = 72000000/(UARTStructPtr->BaudRate); //Calculating the baudrate depending on the clock frequency
|
||||
return 0;
|
||||
}
|
||||
else if (UARTStructPtr->UART == USART2)
|
||||
{
|
||||
RCC->APB1ENR |= RCC_APB1ENR_USART2EN;
|
||||
USART2->BRR = 36000000/(UARTStructPtr->BaudRate);
|
||||
return 0;
|
||||
}
|
||||
else if (UARTStructPtr->UART == USART3)
|
||||
{
|
||||
RCC->APB1ENR |= RCC_APB1ENR_USART3EN;
|
||||
USART3->BRR = 36000000/(UARTStructPtr->BaudRate);
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t MyUART_GetInterruptNum(USART_TypeDef * UART)
|
||||
{
|
||||
if(UART == USART1)
|
||||
{
|
||||
return USART1_IRQn;
|
||||
}
|
||||
else if(UART == USART2)
|
||||
{
|
||||
return USART2_IRQn;
|
||||
}
|
||||
else if(UART == USART3)
|
||||
{
|
||||
return USART3_IRQn;
|
||||
}
|
||||
else{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void MyUART_ActiveIT(USART_TypeDef * UART, uint8_t Prio)
|
||||
{
|
||||
uint32_t IRQNumber = MyUART_GetInterruptNum(UART);
|
||||
UART->CR1 |= (USART_CR1_RXNEIE); //Interruption active pour la reception UNIQUEMENT
|
||||
NVIC->IP[IRQNumber] |= (Prio << 0x4); //Prio de l'interruption (p.197 manuel reference RM0008 pour ADC1_IRQn)
|
||||
NVIC->ISER[1] |= (0x1<<(IRQNumber-32)); //Active l'interruption au niveau NVIC (p.119 manuel programming pour ISER[1])
|
||||
}
|
||||
|
||||
void MyUART_Init(MyUART_Struct_Typedef * UARTStructPtr){
|
||||
if (UARTStructPtr->UART == USART1)
|
||||
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
|
||||
if (UARTStructPtr->UART == USART2)
|
||||
RCC->APB2ENR |= RCC_APB1ENR_USART2EN;
|
||||
if (UARTStructPtr->UART == USART3)
|
||||
RCC->APB2ENR |= RCC_APB1ENR_USART3EN;
|
||||
MyUART_setClockBit(UARTStructPtr); //Clock enable and setting the baud.
|
||||
UARTStructPtr->UART->CR1 = 0x00; // Clear ALL
|
||||
UARTStructPtr->UART->CR1 |= USART_CR1_UE;
|
||||
UARTStructPtr->UART->CR1 |= ((UARTStructPtr->length)<<12); //Setting the Length of the data transmitted
|
||||
|
||||
UARTStructPtr->UART->BRR = 72000000/(UARTStructPtr->BaudRate);
|
||||
UARTStructPtr->UART->CR1 |= ((UARTStructPtr->Wlengh)<<12);
|
||||
UARTStructPtr->UART->CR1 |= (0x1<<10);
|
||||
|
||||
if(UARTStructPtr->Wparity == parity_none)
|
||||
UARTStructPtr->UART->CR1 &= ~(0x1<<10);
|
||||
if(UARTStructPtr->Wparity == parity_odd)
|
||||
UARTStructPtr->UART->CR1 |= (0x1<<9);
|
||||
if(UARTStructPtr->Wparity == parity_even)
|
||||
UARTStructPtr->UART->CR1 &= ~(0x1<<9);
|
||||
|
||||
if(UARTStructPtr->Wstop == stop1b)
|
||||
UARTStructPtr->UART->CR2 &= ~(0x3<<12);
|
||||
if(UARTStructPtr->Wstop == stop2b){
|
||||
UARTStructPtr->UART->CR2 &= ~(0x3<<12);
|
||||
UARTStructPtr->UART->CR2 |= (0x1<<13);
|
||||
UARTStructPtr->UART->CR1 &= ~(0x3<<9); //reset CR1 9-10 bits, Parity Selection
|
||||
if(UARTStructPtr->parity != parityNone) //if parity is enabled
|
||||
{
|
||||
UARTStructPtr->UART->CR1 |= (UARTStructPtr->parity<<9); //depending on the parity changing the 9th bit, and set 10th bit to 1
|
||||
}
|
||||
UARTStructPtr->UART->CR1 |= (USART_CR1_TE | USART_CR1_RE | USART_CR1_UE | USART_CR1_RXNEIE);
|
||||
|
||||
NVIC_EnableIRQ(USART1_IRQn);
|
||||
|
||||
UARTStructPtr->UART->CR2 &= ~(0x3<<12); //reset CR2 13-12 bits, Stop bits
|
||||
if(UARTStructPtr->stop != stopBit1) //if stop bits > 1
|
||||
{
|
||||
UARTStructPtr->UART->CR2 |= (UARTStructPtr->stop<<12); //depending on the stop changing the 12th and 13th bit.
|
||||
}
|
||||
//TxD Enable, RxD Enable, USART Global Enable
|
||||
UARTStructPtr->UART->CR1 |= (USART_CR1_TE | USART_CR1_RE);
|
||||
MyUART_ActiveIT(UARTStructPtr->UART,1);
|
||||
}
|
||||
|
||||
void MyUART_InitGPIO(MyUART_Struct_Typedef * UARTStructPtr)
|
||||
{
|
||||
MyGPIO_Struct_TypeDef rxd,txd;
|
||||
if(UARTStructPtr->UART == USART1)
|
||||
{
|
||||
rxd = (MyGPIO_Struct_TypeDef){GPIOA,10,In_Floating};
|
||||
txd = (MyGPIO_Struct_TypeDef){GPIOA,9,AltOut_Ppull};
|
||||
}
|
||||
else if(UARTStructPtr->UART == USART2) {
|
||||
rxd = (MyGPIO_Struct_TypeDef){GPIOA,3,In_Floating};
|
||||
txd = (MyGPIO_Struct_TypeDef){GPIOA,2,AltOut_Ppull};
|
||||
}
|
||||
else if(UARTStructPtr->UART == USART3) {
|
||||
rxd = (MyGPIO_Struct_TypeDef){GPIOB,11,In_PullUp};
|
||||
txd = (MyGPIO_Struct_TypeDef){GPIOB,10,AltOut_Ppull};
|
||||
}
|
||||
else {
|
||||
return;
|
||||
}
|
||||
MyGPIO_Init(&rxd);
|
||||
MyGPIO_Init(&txd);
|
||||
}
|
||||
|
||||
void MyUART_Send(MyUART_Struct_Typedef *UART, uint8_t data)
|
||||
{
|
||||
UART->UART->DR = data;
|
||||
//du DR au Registre de Transmission, on attend que le shift register ai récupéré le DR
|
||||
while (!(UART->UART->SR & USART_SR_TXE));
|
||||
}
|
||||
|
||||
uint8_t MyUART_Receive(MyUART_Struct_Typedef *UART)
|
||||
{
|
||||
while (!(UART->UART->SR & USART_SR_RXNE)); // Si RXNE est mis à 1, alors on vient de recevoir une donnée !
|
||||
uint8_t data = UART->UART->DR; // Read the data.
|
||||
UART->UART->SR &= ~USART_SR_RXNE; //flag to 0
|
||||
return data;
|
||||
}
|
||||
|
||||
void USART1_IRQHandler(void)
|
||||
{
|
||||
// Check if receive data register not empty
|
||||
if(USART1->SR & USART_SR_RXNE)
|
||||
{
|
||||
data1 = USART1->DR; // read received data
|
||||
// do something with received data
|
||||
}
|
||||
if((USART1->SR & USART_SR_RXNE) == USART_SR_RXNE) //verify the flag
|
||||
{
|
||||
if (pFncUART != 0)
|
||||
(*pFncUART) (USART1->DR); /* appel indirect de la fonction */
|
||||
USART1->SR &= ~USART_SR_RXNE; //flag to 0
|
||||
}
|
||||
}
|
||||
|
||||
void USART2_IRQHandler(void)
|
||||
{
|
||||
// Check if receive data register not empty
|
||||
if(USART2->SR & USART_SR_RXNE)
|
||||
{
|
||||
data2 = USART2->DR; // read received data
|
||||
// do something with received data
|
||||
}
|
||||
if((USART2->SR & USART_SR_RXNE) == USART_SR_RXNE) //verify the flag
|
||||
{
|
||||
if (pFncUART != 0)
|
||||
(*pFncUART) (USART2->DR); /* appel indirect de la fonction */
|
||||
USART2->SR &= ~USART_SR_RXNE; //flag to 0
|
||||
}
|
||||
}
|
||||
|
||||
void USART3_IRQHandler(void)
|
||||
{
|
||||
// Check if receive data register not empty
|
||||
if(USART3->SR & USART_SR_RXNE)
|
||||
if((USART3->SR & USART_SR_RXNE) == USART_SR_RXNE) //verify the flag
|
||||
{
|
||||
data3 = USART3->DR; // read received data
|
||||
// do something with received data
|
||||
if (pFncUART != 0)
|
||||
(*pFncUART) (USART3->DR); /* appel indirect de la fonction */
|
||||
USART2->SR &= ~USART_SR_RXNE; //flag to 0
|
||||
}
|
||||
}
|
||||
|
||||
char MyUART_Read(MyUART_Struct_Typedef * UARTStructPtr)
|
||||
{
|
||||
if(UARTStructPtr->UART == USART1)
|
||||
return data1;
|
||||
else if(UARTStructPtr->UART == USART2)
|
||||
return data2;
|
||||
else if(UARTStructPtr->UART == USART3)
|
||||
return data3;
|
||||
else
|
||||
return 0xFF;
|
||||
}
|
||||
|
||||
/* exemple utilisation fonction :
|
||||
|
||||
UART1.UART = USART1; // choix UART (USART1, USART2, USART3)
|
||||
|
@ -88,4 +161,3 @@ char MyUART_Read(MyUART_Struct_Typedef * UARTStructPtr)
|
|||
UART1.Wstop = stop1b; // nombre bit de stop (stop1b, stop2b)
|
||||
MyUART_Init(&UART1); // initialisation
|
||||
*/
|
||||
|
||||
|
|
|
@ -2,26 +2,35 @@
|
|||
#define UART_H
|
||||
#include "stm32f10x.h"
|
||||
|
||||
typedef enum {
|
||||
lengthBit8,
|
||||
lengthBit9
|
||||
} MyUART_Enum_Length;
|
||||
|
||||
typedef enum {
|
||||
parityNone,
|
||||
parityEven = 0b10,
|
||||
parityOdd = 0b11
|
||||
} MyUART_Enum_Parity;
|
||||
|
||||
typedef enum {
|
||||
stopBit1,
|
||||
stopBit0d5,
|
||||
stopBit2,
|
||||
stopBit1d5
|
||||
} MyUART_Enum_StopBits;
|
||||
|
||||
typedef struct {
|
||||
USART_TypeDef * UART;
|
||||
unsigned int BaudRate;
|
||||
unsigned char Wlengh;
|
||||
unsigned char Wparity;
|
||||
unsigned char Wstop;
|
||||
|
||||
uint32_t BaudRate;
|
||||
MyUART_Enum_Length length;
|
||||
MyUART_Enum_Parity parity;
|
||||
MyUART_Enum_StopBits stop;
|
||||
}MyUART_Struct_Typedef;
|
||||
|
||||
#define parity_none 0x0
|
||||
#define parity_even 0x1
|
||||
#define parity_odd 0x2
|
||||
#define Wlengh8 0x0
|
||||
#define Wlengh9 0X1
|
||||
#define stop1b 0x0
|
||||
#define stop2b 0x2
|
||||
|
||||
void MyUART_Init(MyUART_Struct_Typedef * UARTStructPtr);
|
||||
void USART1_IRQHandler(void);
|
||||
void USART2_IRQHandler(void);
|
||||
void USART3_IRQHandler(void);
|
||||
char MyUART_Read(MyUART_Struct_Typedef * UARTStructPtr);
|
||||
#endif
|
||||
void MyUART_InitGPIO(MyUART_Struct_Typedef * UARTStructPtr);
|
||||
void MyUART_Send(MyUART_Struct_Typedef *UART, uint8_t data);
|
||||
uint8_t MyUART_Receive(MyUART_Struct_Typedef *UART);
|
||||
void MyUART_Init_Periph (void (* ptrFonction)(uint8_t));
|
||||
#endif
|
||||
|
|
41
implementation/motoreducteur.c
Normal file
|
@ -0,0 +1,41 @@
|
|||
#include "motoreducteur.h"
|
||||
#include "timer.h"
|
||||
#include "gpio.h"
|
||||
|
||||
void MyMotor_Init(void)
|
||||
{
|
||||
MyTimer_Struct_Typedef Timer;
|
||||
MyGPIO_Struct_TypeDef Pin_Direction;
|
||||
|
||||
//F de 50kHz
|
||||
Timer.Timer = TIM3;
|
||||
Timer.ARR = 3599; //72Mhz / 50kHz = 1440 et 1440*1 = 1440
|
||||
Timer.PSC = 0;
|
||||
|
||||
Pin_Direction.GPIO = GPIOB;
|
||||
Pin_Direction.GPIO_Pin = 1;
|
||||
Pin_Direction.GPIO_Conf = Out_PullUp;
|
||||
|
||||
MyTimer_Base_Init(&Timer);
|
||||
MyGPIO_Init(&Pin_Direction);
|
||||
|
||||
//Pin Timer 3 Channel 3 PB0
|
||||
MyTimer_PWM(TIM3, 3);
|
||||
MyTimer_DutyCycle(TIM3, 3, 0);
|
||||
|
||||
MyTimer_Base_Start(Timer);
|
||||
MyMotor_ChangeDirection(ANTIHOR);
|
||||
}
|
||||
|
||||
void MyMotor_ChangeSpeed(unsigned int DC)
|
||||
{
|
||||
MyTimer_DutyCycle(TIM3, 3, DC);
|
||||
}
|
||||
|
||||
void MyMotor_ChangeDirection(uint8_t Sens)
|
||||
{
|
||||
if (Sens == HORAIRE)
|
||||
MyGPIO_Set(GPIOB, 1);
|
||||
if (Sens == ANTIHOR)
|
||||
MyGPIO_Reset(GPIOB, 1);
|
||||
}
|
12
implementation/motoreducteur.h
Normal file
|
@ -0,0 +1,12 @@
|
|||
#ifndef MYMOTOR_H
|
||||
#define MYMOTOR_H
|
||||
#include "stm32f10x.h"
|
||||
|
||||
#define HORAIRE 0x1
|
||||
#define ANTIHOR 0x0
|
||||
|
||||
void MyMotor_Init(void);
|
||||
void MyMotor_ChangeSpeed(unsigned int DC);
|
||||
void MyMotor_ChangeDirection(uint8_t Sens);
|
||||
|
||||
#endif
|
36
implementation/remote.c
Normal file
|
@ -0,0 +1,36 @@
|
|||
#include "remote.h"
|
||||
#include "gpio.h"
|
||||
#include "motoreducteur.h"
|
||||
|
||||
MyUART_Struct_Typedef uartCool = {USART1,9600,lengthBit8,parityNone,stopBit1};
|
||||
|
||||
void remote(uint8_t data)
|
||||
{
|
||||
MyUART_Send(&uartCool,data);
|
||||
int8_t signedData = (int8_t)data;
|
||||
if(signedData >= 0)
|
||||
{
|
||||
MyMotor_ChangeDirection(HORAIRE);
|
||||
MyMotor_ChangeSpeed(signedData*100);
|
||||
}
|
||||
else {
|
||||
MyMotor_ChangeDirection(ANTIHOR);
|
||||
MyMotor_ChangeSpeed((-signedData)*100);
|
||||
}
|
||||
}
|
||||
|
||||
void initRemote(void)
|
||||
{
|
||||
MyUART_InitGPIO(&uartCool);
|
||||
MyUART_Init(&uartCool);
|
||||
MyUART_Init_Periph(remote);
|
||||
}
|
||||
|
||||
void testRemote(void)
|
||||
{
|
||||
MyUART_Send(&uartCool,'s');
|
||||
MyUART_Send(&uartCool,'a');
|
||||
MyUART_Send(&uartCool,'l');
|
||||
MyUART_Send(&uartCool,'u');
|
||||
MyUART_Send(&uartCool,'t');
|
||||
}
|
11
implementation/remote.h
Normal file
|
@ -0,0 +1,11 @@
|
|||
#ifndef REMOTE_H
|
||||
#define REMOTE_H
|
||||
#include "uart.h"
|
||||
|
||||
//XBEE 9600 baud, zero parite, 1 bit de stop,
|
||||
|
||||
void remote(uint8_t data);
|
||||
void initRemote(void);
|
||||
void testRemote(void);
|
||||
|
||||
#endif
|
51
implementation/remote.md
Normal file
|
@ -0,0 +1,51 @@
|
|||
# Initialisation de l'UART avec un Raspberry Pi
|
||||
### Yohan Boujon
|
||||
---
|
||||
Pour tester l'intégration de l'UART j'ai décidé de me focaliser uniquement sur l'UART 1 du STM32. Afin de simplifier la programmation côté microcontrôleur, et aussi d'apprendre plus sur mon Raspberry Pi ce choix était plus complaisant.
|
||||
|
||||
## Configuration du Raspberry Pi
|
||||
|
||||
La première chose est de vérifier si les pins pour la communication UART sont dans le bon mode. Pour se faire il suffit de lancer la commande :
|
||||
```bash
|
||||
sudo raspi-gpio get 14-15
|
||||
```
|
||||
Normalement le résultat devrait être le suivant :
|
||||

|
||||
Si func n'est pas TXD/RXD alors entrez ces commandes :
|
||||
```bash
|
||||
sudo raspi-gpio set 15 a5
|
||||
sudo raspi-gpio set 14 a5
|
||||
```
|
||||
Pour rappel, le terme après 15/14 détermine l'alternative function, plus d'informations peuvent être trouvées ici [Détail sur les différentes ALT](https://blog.boochow.com/wp-content/uploads/rpi-gpio-table.png). Pour vérifier si vous voulez UART1 ou UART 0, avec la commande ```ls -l /dev``` il est possible de voir le lien symbolique réalisé entre votre serialX et la pin réelle de votre pi. Choisissez celle que vous voulez, mais si vous avez besoin du bluetooth, **ttyS0** est la liaison serie recommandée. *(Dans notre cas elle est reliée à l'UART1)*
|
||||
|
||||
Pour finalement activer du côté hardware l'UART, il faut entrer la commande suivante :
|
||||
```bash
|
||||
sudo raspi-config
|
||||
```
|
||||
Après cela une fenêtre bleue avec divers paramètres sont disponible. Ce qui nous intéresse c'est donc d'activer le port UART, soit :
|
||||
**3 Interface Option** > **I6 Serial Port** > **No** > **Yes**
|
||||
Il faut ensuite vérifier que le fichier de configuration accepte bien l'UART, soit :
|
||||
```bash
|
||||
sudo nano /boot/config.txt
|
||||
```
|
||||
et entrez les paramètres suivants en fin de ligne :
|
||||
```
|
||||
enable_uart=1
|
||||
dtoverlay=disable-bt
|
||||
dtoverlay=uart1,txd1_pin=14,rxd1_pin=15
|
||||
```
|
||||
Le premier active l'UART, le second désactive le bluetooth *(peut poser des problèmes sur l'UART 1 ou 0, dépendant des cas)* et enfin le dernier active le txd/rxd 0/1 pour une certaine pin.
|
||||
Faites **CTRL+X** , **'y'** et rebootez votre Raspberry :
|
||||
```bash
|
||||
sudo reboot
|
||||
```
|
||||
|
||||
Ensuite il ne reste plus qu'à tester ! à l'aide du programme [**minicom**](https://doc.ubuntu-fr.org/minicom) il est possible de tester simplement l'UART en rebouclant les GPIO comme ici :
|
||||

|
||||
|
||||
Maintenant testons avec la commande
|
||||
```bash
|
||||
minicom -b 9600 -o -D /dev/ttyS0
|
||||
```
|
||||
|
||||

|
37
implementation/rtc.c
Normal file
|
@ -0,0 +1,37 @@
|
|||
#include "rtc.h"
|
||||
|
||||
void plantage_i2C(void) {
|
||||
while(1);
|
||||
}
|
||||
|
||||
void (*IT_I2C_Err) (void) = plantage_i2C;
|
||||
|
||||
void MyRTC_Init(void)
|
||||
{
|
||||
MyI2C_Init(I2C2, 15, IT_I2C_Err);
|
||||
}
|
||||
|
||||
void MyRTC_GetTime(int* sec, int* min, int* hour, int* day, int* date, int* month, int* year)
|
||||
{
|
||||
MyI2C_RecSendData_Typedef data;
|
||||
char regCopy = 0;
|
||||
|
||||
data.SlaveAdress7bits = 0x68;
|
||||
data.Ptr_Data = ®Copy;
|
||||
data.Nb_Data = 1;
|
||||
|
||||
MyI2C_GetString(I2C2, 0x00, &data);
|
||||
*sec = ((regCopy >> 4) & 0x07) * 10 + (regCopy & 0x0F);
|
||||
MyI2C_GetString(I2C2, 0x01, &data);
|
||||
*min = ((regCopy >> 4) & 0x07) * 10 + (regCopy & 0x0F);
|
||||
MyI2C_GetString(I2C2, 0x02, &data);
|
||||
*hour = 0;
|
||||
MyI2C_GetString(I2C2, 0x03, &data);
|
||||
*day = (regCopy & 0x07);
|
||||
MyI2C_GetString(I2C2, 0x04, &data);
|
||||
*date = ((regCopy >> 4) & 0x03) * 10 + (regCopy & 0x0F);
|
||||
MyI2C_GetString(I2C2, 0x05, &data);
|
||||
*month = ((regCopy >> 4) & 0x01) * 10 + (regCopy & 0x0F);
|
||||
MyI2C_GetString(I2C2, 0x06, &data);
|
||||
*year = ((regCopy >> 4) & 0xF0) * 10 + (regCopy & 0x0F) + 2000;
|
||||
}
|
9
implementation/rtc.h
Normal file
|
@ -0,0 +1,9 @@
|
|||
#ifndef MYRTC_H
|
||||
#define MYRTC_H
|
||||
#include "stm32f10x.h"
|
||||
#include "MyI2C.h"
|
||||
|
||||
void MyRTC_Init(void);
|
||||
void MyRTC_GetTime(int* sec, int* min, int* hour, int* day, int* date, int* month, int* year);
|
||||
|
||||
#endif
|
30
implementation/servo.c
Normal file
|
@ -0,0 +1,30 @@
|
|||
#include "servo.h"
|
||||
#include "timer.h"
|
||||
|
||||
void MyServo_Init(void)
|
||||
{
|
||||
MyTimer_Struct_Typedef Timer;
|
||||
|
||||
//Période de 20ms -> F de 50Hz
|
||||
Timer.Timer = TIM2;
|
||||
Timer.ARR = 3599; //20*180 (angle) = 3600
|
||||
Timer.PSC = 399; //72Mhz / 50Hz = 1.44Mhz et 3600*400 = 1.44M
|
||||
|
||||
MyTimer_Base_Init(&Timer);
|
||||
|
||||
//Pin Timer 2 Channel 1 PA0
|
||||
MyTimer_PWM(TIM2, 1);
|
||||
MyTimer_DutyCycle(TIM2, 1, 750);
|
||||
|
||||
MyTimer_Base_Start(Timer);
|
||||
}
|
||||
|
||||
void MyServo_ChangeAngle(uint8_t Angle)
|
||||
{
|
||||
if (Angle > 180)
|
||||
Angle = 180;
|
||||
|
||||
int DC = 500 + (Angle * 500 / 180);
|
||||
|
||||
MyTimer_DutyCycle(TIM2, 1, DC);
|
||||
}
|
13
implementation/servo.h
Normal file
|
@ -0,0 +1,13 @@
|
|||
#ifndef MYSERVO_H
|
||||
#define MYSERVO_H
|
||||
#include "stm32f10x.h"
|
||||
|
||||
/*
|
||||
180 correspond à 0°
|
||||
0 correspond à 90°
|
||||
*/
|
||||
|
||||
void MyServo_Init(void);
|
||||
void MyServo_ChangeAngle(uint8_t Angle);
|
||||
|
||||
#endif
|
|
@ -132,7 +132,7 @@ Reset_Handler PROC
|
|||
EXPORT Reset_Handler [WEAK]
|
||||
IMPORT __main
|
||||
IMPORT SystemInit
|
||||
LDR R0, =SystemInit
|
||||
a LDR R0, =SystemInit
|
||||
BLX R0
|
||||
LDR R0, =__main
|
||||
BX R0
|
||||
|
|
|
@ -1,13 +1,36 @@
|
|||
#include "stm32f10x.h"
|
||||
#include "MyI2C.h"
|
||||
#include "MySPI.h"
|
||||
#include "gpio.h"
|
||||
#include "servo.h"
|
||||
#include "motoreducteur.h"
|
||||
#include "rtc.h"
|
||||
#include "remote.h"
|
||||
#include "accelerometer.h"
|
||||
|
||||
void initImplementation(void);
|
||||
|
||||
float GX, GY, GZ;
|
||||
int main (void)
|
||||
{
|
||||
Init_accelerometre();
|
||||
while(1){
|
||||
|
||||
//MyGPIO_Struct_TypeDef led = {GPIOA,5,Out_PullUp}; //led
|
||||
//MyGPIO_Init(&led); //test des leds pour ignorer les contraintes li<6C>es aux diff<66>rents ports
|
||||
initImplementation();
|
||||
//MyRTC_GetTime(&sec, &min, &hour, &day, &date, &month, &year);
|
||||
while(1){
|
||||
Lecture_accelerometre(&GX,&GY,&GZ);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
void initImplementation(void)
|
||||
{
|
||||
MyServo_Init();
|
||||
MyServo_ChangeAngle(179);
|
||||
initRemote();
|
||||
Init_accelerometre();
|
||||
testRemote();
|
||||
MyMotor_Init();
|
||||
MyMotor_ChangeSpeed(0);
|
||||
MyMotor_ChangeDirection(HORAIRE);
|
||||
MyRTC_Init();
|
||||
accelerometre();
|
||||
}
|
||||
|
|
|
@ -26,9 +26,9 @@
|
|||
<ToolsetNumber>0x4</ToolsetNumber>
|
||||
<ToolsetName>ARM-ADS</ToolsetName>
|
||||
<TargetOption>
|
||||
<CLKADS>8000000</CLKADS>
|
||||
<CLKADS>12000000</CLKADS>
|
||||
<OPTTT>
|
||||
<gFlags>1</gFlags>
|
||||
<gFlags>0</gFlags>
|
||||
<BeepAtEnd>1</BeepAtEnd>
|
||||
<RunSim>0</RunSim>
|
||||
<RunTarget>1</RunTarget>
|
||||
|
@ -79,8 +79,8 @@
|
|||
</OPTFL>
|
||||
<CpuCode>18</CpuCode>
|
||||
<DebugOpt>
|
||||
<uSim>1</uSim>
|
||||
<uTrg>0</uTrg>
|
||||
<uSim>0</uSim>
|
||||
<uTrg>1</uTrg>
|
||||
<sLdApp>1</sLdApp>
|
||||
<sGomain>1</sGomain>
|
||||
<sRbreak>1</sRbreak>
|
||||
|
@ -117,21 +117,6 @@
|
|||
<pMon>BIN\UL2CM3.DLL</pMon>
|
||||
</DebugOpt>
|
||||
<TargetDriverDllRegistry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>ARMRTXEVENTFLAGS</Key>
|
||||
<Name>-L70 -Z18 -C0 -M0 -T1</Name>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>DLGDARM</Key>
|
||||
<Name>(1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(111=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(180=-1,-1,-1,-1,0)(120=429,109,850,536,0)(121=247,294,668,721,0)(122=875,109,1296,536,0)(123=-1,-1,-1,-1,0)(140=-1,-1,-1,-1,0)(240=-1,-1,-1,-1,0)(190=-1,-1,-1,-1,0)(200=-1,-1,-1,-1,0)(170=-1,-1,-1,-1,0)(130=-1,-1,-1,-1,0)(131=123,134,717,885,0)(132=-1,-1,-1,-1,0)(133=-1,-1,-1,-1,0)(160=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(210=-1,-1,-1,-1,0)(211=-1,-1,-1,-1,0)(220=-1,-1,-1,-1,0)(221=-1,-1,-1,-1,0)(230=-1,-1,-1,-1,0)(234=-1,-1,-1,-1,0)(231=-1,-1,-1,-1,0)(232=-1,-1,-1,-1,0)(233=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0)</Name>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>ARMDBGFLAGS</Key>
|
||||
<Name>-T0</Name>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>UL2CM3</Key>
|
||||
|
@ -139,30 +124,18 @@
|
|||
</SetRegEntry>
|
||||
</TargetDriverDllRegistry>
|
||||
<Breakpoint/>
|
||||
<WatchWindow1>
|
||||
<Ww>
|
||||
<count>0</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>voyons</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>1</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>returnValue</ItemText>
|
||||
</Ww>
|
||||
</WatchWindow1>
|
||||
<Tracepoint>
|
||||
<THDelay>0</THDelay>
|
||||
</Tracepoint>
|
||||
<DebugFlag>
|
||||
<trace>0</trace>
|
||||
<periodic>1</periodic>
|
||||
<aLwin>1</aLwin>
|
||||
<periodic>0</periodic>
|
||||
<aLwin>0</aLwin>
|
||||
<aCover>0</aCover>
|
||||
<aSer1>0</aSer1>
|
||||
<aSer2>0</aSer2>
|
||||
<aPa>0</aPa>
|
||||
<viewmode>1</viewmode>
|
||||
<viewmode>0</viewmode>
|
||||
<vrSel>0</vrSel>
|
||||
<aSym>0</aSym>
|
||||
<aTbox>0</aTbox>
|
||||
|
@ -208,7 +181,7 @@
|
|||
<ToolsetNumber>0x4</ToolsetNumber>
|
||||
<ToolsetName>ARM-ADS</ToolsetName>
|
||||
<TargetOption>
|
||||
<CLKADS>8000000</CLKADS>
|
||||
<CLKADS>12000000</CLKADS>
|
||||
<OPTTT>
|
||||
<gFlags>1</gFlags>
|
||||
<BeepAtEnd>1</BeepAtEnd>
|
||||
|
@ -299,35 +272,10 @@
|
|||
<pMon>STLink\ST-LINKIII-KEIL_SWO.dll</pMon>
|
||||
</DebugOpt>
|
||||
<TargetDriverDllRegistry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>DLGTARM</Key>
|
||||
<Name>(1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)</Name>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>DLGUARM</Key>
|
||||
<Name>(105=-1,-1,-1,-1,0)</Name>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>ST-LINKIII-KEIL_SWO</Key>
|
||||
<Name>-U066FFF504955857567155843 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(1BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8000 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32F103RB$Flash\STM32F10x_128.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2</Name>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>ARMRTXEVENTFLAGS</Key>
|
||||
<Name>-L70 -Z18 -C0 -M0 -T1</Name>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>DLGDARM</Key>
|
||||
<Name>(1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)</Name>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>ARMDBGFLAGS</Key>
|
||||
<Name>-T0</Name>
|
||||
<Name>-U066FFF504955857567155843 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(1BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32F103RB$Flash\STM32F10x_128.FLM)</Name>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
|
@ -335,48 +283,19 @@
|
|||
<Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103RB$Flash\STM32F10x_128.FLM))</Name>
|
||||
</SetRegEntry>
|
||||
</TargetDriverDllRegistry>
|
||||
<Breakpoint>
|
||||
<Bp>
|
||||
<Number>0</Number>
|
||||
<Type>0</Type>
|
||||
<LineNumber>58</LineNumber>
|
||||
<EnabledFlag>1</EnabledFlag>
|
||||
<Address>134219020</Address>
|
||||
<ByteObject>0</ByteObject>
|
||||
<HtxType>0</HtxType>
|
||||
<ManyObjects>0</ManyObjects>
|
||||
<SizeOfObject>0</SizeOfObject>
|
||||
<BreakByAccess>0</BreakByAccess>
|
||||
<BreakIfRCount>1</BreakIfRCount>
|
||||
<Filename>C:\Users\guilh\OneDrive\Bureau\COURS\INSA AE\µC S6\voilier-team-1\implementation\accelerometer.c</Filename>
|
||||
<ExecCommand></ExecCommand>
|
||||
<Expression>\\cool_reel\../implementation/accelerometer.c\58</Expression>
|
||||
</Bp>
|
||||
</Breakpoint>
|
||||
<WatchWindow1>
|
||||
<Ww>
|
||||
<count>0</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>quelquechose</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>1</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>returnValue</ItemText>
|
||||
</Ww>
|
||||
</WatchWindow1>
|
||||
<Breakpoint/>
|
||||
<Tracepoint>
|
||||
<THDelay>0</THDelay>
|
||||
</Tracepoint>
|
||||
<DebugFlag>
|
||||
<trace>0</trace>
|
||||
<periodic>1</periodic>
|
||||
<aLwin>1</aLwin>
|
||||
<periodic>0</periodic>
|
||||
<aLwin>0</aLwin>
|
||||
<aCover>0</aCover>
|
||||
<aSer1>0</aSer1>
|
||||
<aSer2>0</aSer2>
|
||||
<aPa>0</aPa>
|
||||
<viewmode>1</viewmode>
|
||||
<viewmode>0</viewmode>
|
||||
<vrSel>0</vrSel>
|
||||
<aSym>0</aSym>
|
||||
<aTbox>0</aTbox>
|
||||
|
@ -435,30 +354,6 @@
|
|||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>1</GroupNumber>
|
||||
<FileNumber>2</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\implementation\accelerometer.h</PathWithFileName>
|
||||
<FilenameWithoutPath>accelerometer.h</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>1</GroupNumber>
|
||||
<FileNumber>3</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\implementation\accelerometer.c</PathWithFileName>
|
||||
<FilenameWithoutPath>accelerometer.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
</Group>
|
||||
|
||||
<Group>
|
||||
|
@ -469,7 +364,7 @@
|
|||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>4</FileNumber>
|
||||
<FileNumber>2</FileNumber>
|
||||
<FileType>4</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
@ -481,19 +376,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>5</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\driver\adc.c</PathWithFileName>
|
||||
<FilenameWithoutPath>adc.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>6</FileNumber>
|
||||
<FileNumber>3</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
@ -505,7 +388,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>7</FileNumber>
|
||||
<FileNumber>4</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
@ -517,7 +400,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>8</FileNumber>
|
||||
<FileNumber>5</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
@ -529,73 +412,69 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>6</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\driver\adc.c</PathWithFileName>
|
||||
<FilenameWithoutPath>adc.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
</Group>
|
||||
|
||||
<Group>
|
||||
<GroupName>MesImplementations</GroupName>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>7</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\implementation\servo.c</PathWithFileName>
|
||||
<FilenameWithoutPath>servo.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>8</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\implementation\motoreducteur.c</PathWithFileName>
|
||||
<FilenameWithoutPath>motoreducteur.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>9</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\driver\adc.h</PathWithFileName>
|
||||
<FilenameWithoutPath>adc.h</FilenameWithoutPath>
|
||||
<PathWithFileName>..\implementation\rtc.c</PathWithFileName>
|
||||
<FilenameWithoutPath>rtc.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>10</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\driver\gpio.h</PathWithFileName>
|
||||
<FilenameWithoutPath>gpio.h</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>11</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\driver\MyI2C.h</PathWithFileName>
|
||||
<FilenameWithoutPath>MyI2C.h</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>12</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\driver\MySPI.h</PathWithFileName>
|
||||
<FilenameWithoutPath>MySPI.h</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>13</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\driver\timer.h</PathWithFileName>
|
||||
<FilenameWithoutPath>timer.h</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>14</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\driver\uart.h</PathWithFileName>
|
||||
<FilenameWithoutPath>uart.h</FilenameWithoutPath>
|
||||
<PathWithFileName>..\implementation\remote.c</PathWithFileName>
|
||||
<FilenameWithoutPath>remote.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
|
@ -611,7 +490,7 @@
|
|||
|
||||
<Group>
|
||||
<GroupName>::Device</GroupName>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>1</RteFlg>
|
||||
|
|