UART Soon finish

This commit is contained in:
Cedric Chanfreau 2023-03-31 12:21:52 +02:00
parent e8800d0c58
commit f979a89e5f
4 changed files with 117 additions and 32 deletions

View file

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

View file

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

View file

@ -75,7 +75,7 @@
<OPTFL>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<IsCurrentTarget>1</IsCurrentTarget>
<IsCurrentTarget>0</IsCurrentTarget>
</OPTFL>
<CpuCode>18</CpuCode>
<DebugOpt>
@ -143,24 +143,7 @@
<Name>-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)</Name>
</SetRegEntry>
</TargetDriverDllRegistry>
<Breakpoint>
<Bp>
<Number>0</Number>
<Type>0</Type>
<LineNumber>51</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134219346</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>U:\INSA\Microcontrôleur\Projet_Voilier_grp\Voilier\GPIO_Test\Sources\Main.c</Filename>
<ExecCommand></ExecCommand>
<Expression>\\GPIO_Test\Sources/Main.c\51</Expression>
</Bp>
</Breakpoint>
<Breakpoint/>
<Tracepoint>
<THDelay>0</THDelay>
</Tracepoint>
@ -274,7 +257,7 @@
<OPTFL>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<IsCurrentTarget>0</IsCurrentTarget>
<IsCurrentTarget>1</IsCurrentTarget>
</OPTFL>
<CpuCode>18</CpuCode>
<DebugOpt>
@ -347,14 +330,47 @@
<Name>-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)</Name>
</SetRegEntry>
</TargetDriverDllRegistry>
<Breakpoint/>
<Breakpoint>
<Bp>
<Number>0</Number>
<Type>0</Type>
<LineNumber>62</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134218958</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>U:\INSA\Microcontrôleur\Projet_Voilier_grp\Voilier\GPIO_Test\Sources\Main.c</Filename>
<ExecCommand></ExecCommand>
<Expression>\\GPIO_Test\Sources/Main.c\62</Expression>
</Bp>
<Bp>
<Number>1</Number>
<Type>0</Type>
<LineNumber>53</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>0</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>0</BreakIfRCount>
<Filename>.\Sources\Main.c</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
</Bp>
</Breakpoint>
<Tracepoint>
<THDelay>0</THDelay>
</Tracepoint>
<DebugFlag>
<trace>0</trace>
<periodic>1</periodic>
<aLwin>1</aLwin>
<aLwin>0</aLwin>
<aCover>0</aCover>
<aSer1>0</aSer1>
<aSer2>0</aSer2>
@ -422,7 +438,7 @@
<GroupNumber>1</GroupNumber>
<FileNumber>2</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Drivers\Sources\Driver_Timer.c</PathWithFileName>

View file

@ -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
@ -51,6 +59,9 @@ int main (void){
UART_send(data[i]);
}
UART_read(data[i], UART);
while(1){