Projet-Voilier-3/driver/Driver_UART.c

59 lines
1.6 KiB
C

#include "Driver_UART.h"
void MyUART_Init(MyUART_Struct_TypeDef *UART) {
// Active l'horloge du périphérique UART
RCC->APB1ENR |= RCC_APB1ENR_USART3EN;
// Active l'UART pour permettre la transmission/réception de données
UART->UART->CR1 |= USART_CR1_UE;
// Configure la vitesse de transmission en utilisant la valeur de BRR
UART->UART->BRR = 7500/2; // Note : Certains UARTs sont connectés au 72Mhz/2
// Configure le format des données transmises/reçues : 8 bits de données, 1 bit de stop, pas de parité
UART->UART->CR1 &= ~(USART_CR1_M | USART_CR1_PS);
UART->UART->CR1 |= USART_CR1_TE | USART_CR1_RE;
UART->UART->CR2 &= ~(0x11 << 12);
USART3->CR1 |= USART_CR1_RXNEIE | USART_CR1_TXEIE; // Active les interruptions de l'UART
__enable_irq();// Active les interruptions globales
}
void MyUART_SendByte(MyUART_Struct_TypeDef *UART, uint8_t data) {
// Attendre que le registre de données soit prêt à être envoyé
//while (!(UART->UART->SR & USART_SR_TXE));
// Envoyer la donnée
UART->UART->DR = data;
USART3->CR1 |= USART_CR1_TXEIE; // Active l'interruption d'envoi de données
}
uint8_t MyUART_ReceiveByte(MyUART_Struct_TypeDef *UART) {
// Attendre que le registre de données soit rempli avec une nouvelle donnée
while (!(UART->UART->SR & USART_SR_RXNE));
// Lire la donnée reçue
uint8_t data = (uint8_t)(UART->UART->DR & 0xFF);
// Remettre flag à 0
UART->UART->SR &= ~USART_SR_RXNE;
// Renvoyer la donnée lue
return data;
}
void USART3_IRQHandler(void) {
if (USART3->SR & USART_SR_RXNE) {
}
if (USART3->SR & USART_SR_TXE) {
}
}