diff --git a/Drivers/Include/Driver_UART.h b/Drivers/Include/Driver_UART.h index 98e39a5..c296384 100644 --- a/Drivers/Include/Driver_UART.h +++ b/Drivers/Include/Driver_UART.h @@ -3,9 +3,18 @@ #include "stm32f10x.h" +typedef struct { + USART_TypeDef * UART; + unsigned int baudrate; +}MyUART_Struct_Typedef; + void UART_send(char data); -void UART_init(void); -void UART_ITHandler(void); +char UART_read(char data, MyUART_Struct_Typedef * UART); +void UART_init(MyUART_Struct_Typedef * UART); +void USART1_IRQHandler(void); +void USART2_IRQHandler(void); +void USART3_IRQHandler(void); + diff --git a/Drivers/Sources/Driver_UART.c b/Drivers/Sources/Driver_UART.c index 2b1f6f9..11ed828 100644 --- a/Drivers/Sources/Driver_UART.c +++ b/Drivers/Sources/Driver_UART.c @@ -1,15 +1,25 @@ #include "Driver_UART.h" -void UART_init(void) +char received_data1, received_data2, received_data3; + +void UART_init(MyUART_Struct_Typedef * UART) { + if(UART->UART ==USART1) + RCC->APB2ENR |= RCC_APB2ENR_USART1EN; + if(UART->UART ==USART2) + RCC->APB2ENR |= RCC_APB1ENR_USART2EN; + if(UART->UART ==USART3) + RCC->APB2ENR |= RCC_APB1ENR_USART3EN; + + RCC->APB2ENR |= RCC_APB2ENR_USART1EN; // Validation horloge USART1 USART1->CR1 |= USART_CR1_UE; // Activer l'USART USART1->CR1 &= ~USART_CR1_M; // Choisir la taille 8bits de donnée USART1->CR2 |= USART_CR2_STOP; // 1 seul bit de stop - USART1->BRR |= 468 << 4; // Fixe le baud rate à 9600bps partie entière - USART1->BRR |= 75; // Fixe le baud rate à 9600bps partie fractionnaire - //USART1->BRR = 72000000/9600; // Fixer le Baudrate à 9600 + //USART1->BRR |= 468 << 4; // Fixe le baud rate à 9600bps partie entière + //USART1->BRR |= 75; // Fixe le baud rate à 9600bps partie fractionnaire + UART->UART->BRR = 72000000/(UART->baudrate); USART1->CR1 |= USART_CR1_TE; // Autoriser la transmission USART1->CR1 |= USART_CR1_RE; // Activer la réception USART1->CR1 |= USART_CR1_TCIE; // Activer l'interruption de transmission @@ -18,16 +28,29 @@ void UART_init(void) void UART_send(char data) { + while(!(USART1->SR & USART_SR_TXE)){} //Attendre l'autorisation de transmission USART1->DR |= data; while(!(USART1->SR & USART_SR_TC)){} //Attendre la fin de transmission } +char UART_read(char data, MyUART_Struct_Typedef * UART) + { + if(UART->UART == USART1) + return received_data1; + else if (UART->UART == USART2) + return received_data2; + else if (UART->UART == USART3) + return received_data3; + else + return 0; + } -void UART_ITHandler(void) + +void USART1_IRQHandler(void) { if (USART1->SR & USART_SR_RXNE) // si une donnée a été reçue { - char received_data = USART1->DR; // lire la donnée reçue + received_data1 = USART1->DR; // lire la donnée reçue } if (USART1->SR & USART_SR_TC) // si la transmission est terminée @@ -35,3 +58,29 @@ void UART_ITHandler(void) USART1->SR &= ~USART_SR_TC; // effacer le bit de transmission terminée } } + +void USART2_IRQHandler(void) +{ + if (USART2->SR & USART_SR_RXNE) // si une donnée a été reçue + { + received_data2 = USART2->DR; // lire la donnée reçue + } + + if (USART2->SR & USART_SR_TC) // si la transmission est terminée + { + USART2->SR &= ~USART_SR_TC; // effacer le bit de transmission terminée + } +} + +void USART3_IRQHandler(void) +{ + if (USART3->SR & USART_SR_RXNE) // si une donnée a été reçue + { + received_data3 = USART3->DR; // lire la donnée reçue + } + + if (USART3->SR & USART_SR_TC) // si la transmission est terminée + { + USART3->SR &= ~USART_SR_TC; // effacer le bit de transmission terminée + } +} diff --git a/GPIO_Test/GPIO_Test.uvoptx b/GPIO_Test/GPIO_Test.uvoptx index 305a639..c3d2a1d 100644 --- a/GPIO_Test/GPIO_Test.uvoptx +++ b/GPIO_Test/GPIO_Test.uvoptx @@ -75,7 +75,7 @@ 1 0 - 1 + 0 18 @@ -143,24 +143,7 @@ -U -O206 -S8 -C0 -P00 -N00("") -D00(00000000) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32F103RB$Flash\STM32F10x_128.FLM) - - - 0 - 0 - 51 - 1 -
134219346
- 0 - 0 - 0 - 0 - 0 - 1 - U:\INSA\Microcontrôleur\Projet_Voilier_grp\Voilier\GPIO_Test\Sources\Main.c - - \\GPIO_Test\Sources/Main.c\51 -
-
+ 0 @@ -274,7 +257,7 @@ 1 0 - 0 + 1 18 @@ -347,14 +330,47 @@ -U -O206 -S8 -C0 -P00 -N00("") -D00(00000000) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32F103RB$Flash\STM32F10x_128.FLM) - + + + 0 + 0 + 62 + 1 +
134218958
+ 0 + 0 + 0 + 0 + 0 + 1 + U:\INSA\Microcontrôleur\Projet_Voilier_grp\Voilier\GPIO_Test\Sources\Main.c + + \\GPIO_Test\Sources/Main.c\62 +
+ + 1 + 0 + 53 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + .\Sources\Main.c + + +
+
0 0 1 - 1 + 0 0 0 0 @@ -422,7 +438,7 @@ 1 2 1 - 0 + 1 0 0 ..\Drivers\Sources\Driver_Timer.c diff --git a/GPIO_Test/Sources/Main.c b/GPIO_Test/Sources/Main.c index 333bc74..e67bed9 100644 --- a/GPIO_Test/Sources/Main.c +++ b/GPIO_Test/Sources/Main.c @@ -10,8 +10,15 @@ int main (void){ //Déclaration d'une LED et d'un BP par structure GPIO MyGPIO_Struct_TypeDef LED; MyGPIO_Struct_TypeDef BP; + //Déclaration d'un Timer 500 ms MyTimer_Struct_TypeDef TIM500ms; + + //Déclaration de l'UART + MyUART_Struct_Typedef * UART; + UART->UART=USART1; + UART->baudrate=9600; + //Config LED PA5 LED.GPIO_Conf = Out_Ppull; LED.GPIO_Pin = 5; @@ -42,7 +49,8 @@ int main (void){ MyTimer_PWM(&TIM500ms, 50); - UART_init(); + + UART_init(UART); //NVIC_EnableIRQ(USART1_IRQn);// Activer les interruptions @@ -50,6 +58,9 @@ int main (void){ for (i = 0; i < len; i++) { UART_send(data[i]); } + + UART_read(data[i], UART); +