diff --git a/assets/raspberry_config.jpg b/assets/raspberry_config.jpg new file mode 100644 index 0000000..5e97a93 Binary files /dev/null and b/assets/raspberry_config.jpg differ diff --git a/assets/raspberry_uart.jpg b/assets/raspberry_uart.jpg new file mode 100644 index 0000000..06c5277 Binary files /dev/null and b/assets/raspberry_uart.jpg differ diff --git a/assets/resultcmd0.png b/assets/resultcmd0.png new file mode 100644 index 0000000..a6a111a Binary files /dev/null and b/assets/resultcmd0.png differ diff --git a/driver/adc.c b/driver/adc.c index 366b286..0ddd5df 100644 --- a/driver/adc.c +++ b/driver/adc.c @@ -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 �tre effectu�e. -} \ No newline at end of file +} diff --git a/driver/timer.c b/driver/timer.c index 768cc8b..c21b31f 100644 --- a/driver/timer.c +++ b/driver/timer.c @@ -189,4 +189,4 @@ void MyTimer_DutyCycle(TIM_TypeDef * Timer, char Channel, unsigned char DutyCycl Timer->CCR4 = RC; break; } -} \ No newline at end of file +} diff --git a/driver/uart.c b/driver/uart.c index 84df976..ff29c1a 100644 --- a/driver/uart.c +++ b/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) diff --git a/driver/uart.h b/driver/uart.h index 70aa2d7..262a4c5 100644 --- a/driver/uart.h +++ b/driver/uart.h @@ -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 \ No newline at end of file +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 diff --git a/implementation/remote.c b/implementation/remote.c new file mode 100644 index 0000000..f5394ac --- /dev/null +++ b/implementation/remote.c @@ -0,0 +1,33 @@ +#include "remote.h" +#include "gpio.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) + { + MyGPIO_Set(GPIOA,5); + } + else { + MyGPIO_Reset(GPIOA,5); + } +} + +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'); +} diff --git a/implementation/remote.h b/implementation/remote.h new file mode 100644 index 0000000..581bfd4 --- /dev/null +++ b/implementation/remote.h @@ -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 diff --git a/implementation/remote.md b/implementation/remote.md new file mode 100644 index 0000000..bc7299a --- /dev/null +++ b/implementation/remote.md @@ -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) \ No newline at end of file diff --git a/keilproject/RTE/Device/STM32F103RB/startup_stm32f10x_md.s b/keilproject/RTE/Device/STM32F103RB/startup_stm32f10x_md.s index 1ab7096..0ac2873 100644 --- a/keilproject/RTE/Device/STM32F103RB/startup_stm32f10x_md.s +++ b/keilproject/RTE/Device/STM32F103RB/startup_stm32f10x_md.s @@ -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 diff --git a/keilproject/RTE/_R_el/RTE_Components.h b/keilproject/RTE/_R_el/RTE_Components.h index 849a0e6..d0354e4 100644 --- a/keilproject/RTE/_R_el/RTE_Components.h +++ b/keilproject/RTE/_R_el/RTE_Components.h @@ -3,7 +3,7 @@ * Auto generated Run-Time-Environment Configuration File * *** Do not modify ! *** * - * Project: 'gpiodriver' + * Project: 'voilier' * Target: 'Réel' */ diff --git a/keilproject/Source/Principale.c b/keilproject/Source/Principale.c index e4d5a23..70e4ee1 100644 --- a/keilproject/Source/Principale.c +++ b/keilproject/Source/Principale.c @@ -1,8 +1,17 @@ #include "stm32f10x.h" -#include "../../driver/MyI2C.h" -#include "../../driver/MySPI.h" +#include "MyI2C.h" +#include "MySPI.h" +#include "remote.h" +#include "gpio.h" int main (void) { - while(1){}; + MyGPIO_Struct_TypeDef led = {GPIOA,5,Out_PullUp}; //led + MyGPIO_Init(&led); //test des leds pour ignorer les contraintes liées aux différents ports + + initRemote(); + testRemote(); + + while(1){ + }; } diff --git a/keilproject/voilier.uvoptx b/keilproject/voilier.uvoptx index b667108..02e7df9 100644 --- a/keilproject/voilier.uvoptx +++ b/keilproject/voilier.uvoptx @@ -75,7 +75,7 @@ 1 0 - 1 + 0 18 @@ -125,7 +125,7 @@ 0 DLGDARM - (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=1468,53,1889,480,1)(121=1469,437,1890,864,1)(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=1285,87,1879,838,1)(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) + (1010=1460,461,1836,1018,1)(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=1009,499,1430,926,1)(121=1469,437,1890,864,0)(122=875,109,1296,536,0)(123=-1,-1,-1,-1,0)(140=-1,-1,-1,-1,0)(240=105,137,504,482,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=879,71,1473,822,0)(132=-1,-1,-1,-1,0)(133=-1,-1,-1,-1,0)(160=1014,43,1462,457,1)(161=568,150,1016,564,1)(162=1351,117,1799,531,1)(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) 0 @@ -142,9 +142,9 @@ 0 0 - 15 + 29 1 -
134218740
+
134219444
0 0 0 @@ -153,55 +153,39 @@ 1 .\Source\Principale.c - \\cool_Simule\Source/Principale.c\15 + \\cool_Simule\Source/Principale.c\29
1 0 - 19 + 28 1 -
0
+
134219442
0 0 0 0 0 - 0 + 1 .\Source\Principale.c - + \\cool_Simule\Source/Principale.c\28
2 0 - 7 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - .\Source\Principale.c - - -
- - 3 - 0 8 1 -
0
+
134219308
0 0 0 0 0 - 0 + 1 .\Source\Principale.c - + \\cool_Simule\Source/Principale.c\8
@@ -258,16 +242,6 @@ - - - System Viewer\GPIOA - 35905 - - - System Viewer\GPIOB - 35904 - - 1 1 @@ -332,7 +306,7 @@ 1 0 - 0 + 1 18 @@ -414,7 +388,23 @@ 0 0 - 6 + 10 + 1 +
134219708
+ 0 + 0 + 0 + 0 + 0 + 1 + ..\implementation\remote.c + + \\cool_reel\../implementation/remote.c\10 +
+ + 1 + 0 + 9 1
0
0 @@ -423,7 +413,7 @@ 0 0 0 - .\Source\Principale.c + ..\implementation\remote.c
@@ -482,6 +472,12 @@ + + + System Viewer\USART1 + 35905 + + 1 0 @@ -510,6 +506,18 @@ 0 0 + + 1 + 2 + 1 + 0 + 0 + 0 + ..\implementation\remote.c + remote.c + 0 + 0 + @@ -520,7 +528,7 @@ 0 2 - 2 + 3 4 0 0 @@ -530,6 +538,54 @@ 0 0 + + 2 + 4 + 1 + 1 + 0 + 0 + ..\driver\adc.c + adc.c + 0 + 0 + + + 2 + 5 + 1 + 1 + 0 + 0 + ..\driver\gpio.c + gpio.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\driver\timer.c + timer.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\driver\uart.c + uart.c + 0 + 0 + diff --git a/keilproject/voilier.uvprojx b/keilproject/voilier.uvprojx index cda4e65..6858c3b 100644 --- a/keilproject/voilier.uvprojx +++ b/keilproject/voilier.uvprojx @@ -10,7 +10,8 @@ Simulé 0x4 ARM-ADS - 5060960::V5.06 update 7 (build 960)::.\ARMCC + 5060960::V5.06 update 7 (build 960)::.\ARM_Compiler_5.06u7 + 5060960::V5.06 update 7 (build 960)::.\ARM_Compiler_5.06u7 0 @@ -388,6 +389,11 @@ 1 .\Source\Principale.c + + remote.c + 1 + ..\implementation\remote.c + @@ -398,6 +404,26 @@ 4 ..\driver\Lib_Com_Periph_2022.lib + + adc.c + 1 + ..\driver\adc.c + + + gpio.c + 1 + ..\driver\gpio.c + + + timer.c + 1 + ..\driver\timer.c + + + uart.c + 1 + ..\driver\uart.c + @@ -741,7 +767,7 @@ - .\Include + .\Include;..\driver;..\implementation @@ -790,6 +816,11 @@ 1 .\Source\Principale.c + + remote.c + 1 + ..\implementation\remote.c + @@ -800,6 +831,26 @@ 4 ..\driver\Lib_Com_Periph_2022.lib + + adc.c + 1 + ..\driver\adc.c + + + gpio.c + 1 + ..\driver\gpio.c + + + timer.c + 1 + ..\driver\timer.c + + + uart.c + 1 + ..\driver\uart.c +