From b49cd84c0991a17e01881a308ae00726cb6727ec Mon Sep 17 00:00:00 2001 From: Alix Chagot Date: Mon, 27 Mar 2023 16:49:42 +0200 Subject: [PATCH] UART --- ProjetsKEIL/Drivers/inc/UART.h | 27 +++++++++ ProjetsKEIL/Drivers/src/UART.c | 91 ++++++++++++++++++++++++++++++ ProjetsKEIL/Projet/src/Principal.c | 9 +++ ProjetsKEIL/Projet/tp1.uvoptx | 20 +++++-- ProjetsKEIL/Projet/tp1.uvprojx | 10 ++++ 5 files changed, 153 insertions(+), 4 deletions(-) create mode 100644 ProjetsKEIL/Drivers/inc/UART.h create mode 100644 ProjetsKEIL/Drivers/src/UART.c diff --git a/ProjetsKEIL/Drivers/inc/UART.h b/ProjetsKEIL/Drivers/inc/UART.h new file mode 100644 index 0000000..70aa2d7 --- /dev/null +++ b/ProjetsKEIL/Drivers/inc/UART.h @@ -0,0 +1,27 @@ +#ifndef UART_H +#define UART_H +#include "stm32f10x.h" + +typedef struct { + USART_TypeDef * UART; + unsigned int BaudRate; + unsigned char Wlengh; + unsigned char Wparity; + unsigned char Wstop; + +}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 diff --git a/ProjetsKEIL/Drivers/src/UART.c b/ProjetsKEIL/Drivers/src/UART.c new file mode 100644 index 0000000..bf073e0 --- /dev/null +++ b/ProjetsKEIL/Drivers/src/UART.c @@ -0,0 +1,91 @@ +#include "UART.h" +#include "gpio.h" +//faire GPIO + + +char data1 = 0x00; +char data2 = 0x00; +char data3 = 0x00; + +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; + + 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 |= (USART_CR1_TE | USART_CR1_RE | USART_CR1_UE | USART_CR1_RXNEIE); + + NVIC_EnableIRQ(USART1_IRQn); +} + +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 + } +} + +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 + } +} + +void USART3_IRQHandler(void) +{ + // Check if receive data register not empty + if(USART3->SR & USART_SR_RXNE) + { + data3 = USART3->DR; // read received data + // do something with received data + } +} + +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) + UART1.BaudRate = 9600; // Vitesse de communication MAX 118200 + UART1.Wlengh = Wlengh8; // longeur du mot (Wlengh8 ,Wlengh9) + UART1.Wparity = parity_even; // parité (parity_even, parity_odd, parity_none) + UART1.Wstop = stop1b; // nombre bit de stop (stop1b, stop2b) + MyUART_Init(&UART1); // initialisation +*/ + diff --git a/ProjetsKEIL/Projet/src/Principal.c b/ProjetsKEIL/Projet/src/Principal.c index 58d1fe0..cb17134 100644 --- a/ProjetsKEIL/Projet/src/Principal.c +++ b/ProjetsKEIL/Projet/src/Principal.c @@ -1,6 +1,7 @@ #include "stm32f10x.h" #include "gpio.h" #include "timer.h" +#include "UART.h" void changer_led(void); @@ -8,6 +9,8 @@ int main(void) { MyGPIO_Struct_TypeDef led2; MyGPIO_Struct_TypeDef b1; MyTimer_Struct_Typedef t3; + MyUART_Struct_Typedef UART1; + MyGPIO_InitClock(); @@ -29,6 +32,12 @@ int main(void) { MyTimer_DutyCycle(TIM1,1,10); MyTimer_Base_Start(t3); + UART1.UART = USART1; + UART1.BaudRate = 9600; + UART1.Wlengh = Wlengh8; + UART1.Wparity = parity_even; + UART1.Wstop = stop1b; + MyUART_Init(&UART1); do { diff --git a/ProjetsKEIL/Projet/tp1.uvoptx b/ProjetsKEIL/Projet/tp1.uvoptx index 64877fb..1a4ab04 100644 --- a/ProjetsKEIL/Projet/tp1.uvoptx +++ b/ProjetsKEIL/Projet/tp1.uvoptx @@ -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=920,358,1341,785,0)(121=-1,-1,-1,-1,0)(122=-1,-1,-1,-1,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=120,153,405,449,0)(130=624,173,1218,924,0)(131=931,121,1525,872,0)(132=973,161,1567,912,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=-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=920,358,1341,785,0)(121=-1,-1,-1,-1,0)(122=-1,-1,-1,-1,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=120,153,405,449,0)(130=624,173,1218,924,0)(131=931,121,1525,872,0)(132=973,161,1567,912,0)(133=-1,-1,-1,-1,0)(160=767,440,1215,854,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) 0 @@ -378,7 +378,7 @@ MesSources - 0 + 1 0 0 0 @@ -406,7 +406,7 @@ 2 2 1 - 1 + 0 0 0 ..\Drivers\src\gpio.c @@ -418,7 +418,7 @@ 2 3 1 - 1 + 0 0 0 ..\Drivers\src\timer.c @@ -426,6 +426,18 @@ 0 0 + + 2 + 4 + 1 + 0 + 0 + 0 + ..\Drivers\src\UART.c + UART.c + 0 + 0 + diff --git a/ProjetsKEIL/Projet/tp1.uvprojx b/ProjetsKEIL/Projet/tp1.uvprojx index 3fe9bc3..1932d6b 100644 --- a/ProjetsKEIL/Projet/tp1.uvprojx +++ b/ProjetsKEIL/Projet/tp1.uvprojx @@ -403,6 +403,11 @@ 1 ..\Drivers\src\timer.c + + UART.c + 1 + ..\Drivers\src\UART.c + @@ -810,6 +815,11 @@ 1 ..\Drivers\src\timer.c + + UART.c + 1 + ..\Drivers\src\UART.c +