Compare commits

...

18 commits

Author SHA1 Message Date
9d6c764ca5 Merge branch 'guilhem' 2023-04-11 14:21:35 +02:00
91fbddca0d cedric me fait changer un truc <3 2023-04-11 09:48:20 +02:00
6e780d03a3 Fixes on driver.md 2023-04-09 18:29:16 +02:00
c5e1ee0a59 Added driver explainations 2023-04-09 18:21:25 +02:00
24cd95c9e3 Merging from guilhem to master 2023-04-07 14:34:13 +02:00
381f0b6147 Remote now uses the motor, creation of initImplementation 2023-04-07 14:13:00 +02:00
5f5fa1a099 Merging errors cleared 2023-04-07 13:53:08 +02:00
3376dbff59 Merging yohan to master 2023-04-07 13:38:25 +02:00
a1d5cd57d8 Signed number for UART 2023-04-07 13:21:27 +02:00
2a1180c521 Merge branch 'alix' of boujon/voilier-team-1 into master
ok
2023-04-07 12:57:08 +02:00
5ec32ced3e Finishing the Rtc function 2023-04-05 08:25:25 +02:00
9606282533 découverte des bits à lire 2023-04-04 15:26:37 +02:00
355f050ddd Added servo, motoreducteur and working on rtc 2023-04-04 14:36:29 +02:00
d9a4ae852d Added remote(int) and initRemote functions. remote is linked to the interruption for USART 1 and is called everytime we receive a data. 2023-04-04 14:34:09 +02:00
820a3db260 Added MyUART_InitGPIO() function to init directly the GPIO for UART 2023-04-04 13:14:09 +02:00
b2f1785052 UART Working (test with rspi). Interruption for Receiving. Pinout for the different UARTS 2023-04-02 22:53:49 +02:00
398575d7c5 Explaining how the UART is tested with a Raspberry Pi 2023-04-02 13:08:18 +02:00
b7d418f6ad Modified uart driver, created base files 2023-03-31 12:18:42 +02:00
31 changed files with 1135 additions and 780 deletions

Binary file not shown.

BIN
assets/STM32F103RB-3.pdf Normal file

Binary file not shown.

BIN
assets/ccer.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

BIN
assets/crl.PNG Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
assets/odr.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

BIN
assets/raspberry_config.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 599 KiB

BIN
assets/raspberry_uart.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
assets/resultcmd0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

BIN
assets/table20_portbit.PNG Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
assets/usart_cr1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
assets/usart_sr.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -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
View 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 :
![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|
|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
![ODR](../assets/ccer.png)
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 :
![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
- **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) :
![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.
*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

View file

@ -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;
}
}
}

View file

@ -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)

View file

@ -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
*/

View file

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

View 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);
}

View 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
View 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
View 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
View 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 :
![sudo raspi-gpio get 14-15](../assets/resultcmd0.png)
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 :
![Raspberry Pi](../assets/raspberry_config.jpg)
Maintenant testons avec la commande
```bash
minicom -b 9600 -o -D /dev/ttyS0
```
![Raspberry Pi UART](../assets/raspberry_uart.jpg)

37
implementation/rtc.c Normal file
View 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 = &regCopy;
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
View 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
View 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
View 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

View file

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

View file

@ -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();
}

View file

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

File diff suppressed because it is too large Load diff