#include "usart.h" #include "crc.h" #include "stm32f1xx.h" #include "main.h" // USART1 Send Byte (blocking) void USART1_SendByte(uint8_t byte) { while (!(USART1->SR & USART_SR_TXE)); // Wait until transmit buffer empty USART1->DR = byte; // Send byte while (!(USART1->SR & USART_SR_TC)); // Wait until transmission complete } // USART1 Receive Byte (blocking) uint8_t USART1_ReceiveByte(void) { while (!(USART1->SR & USART_SR_RXNE)); // Wait until data received return USART1->DR; // Return received byte } // Receive byte with timeout (returns 0xFF if timeout) uint8_t USART1_ReceiveByteTimeout(uint32_t timeout) { uint32_t start = HAL_GetTick(); while (!(USART1->SR & USART_SR_RXNE)) { if (HAL_GetTick() - start > timeout) { return 0xFF; // Timeout } } return USART1->DR; } // Flush receive buffer void USART1_Flush(void) { while (USART1->SR & USART_SR_RXNE) { USART1->DR; // Read and discard } } void USART1_SendPacket(const uint8_t *data, uint8_t length) { uint16_t crc = crc16(data, length); uint8_t crc_h = (crc >> 8) & 0xFF; // CRC high byte (big-endian) uint8_t crc_l = crc & 0xFF; // CRC low byte USART1_SendByte(0x02); // Start byte USART1_SendByte(0x02); // length type < 256 USART1_SendByte(length); for (uint16_t i = 0; i < length; i++) { USART1_SendByte(data[i]); } USART1_SendByte(crc_h); USART1_SendByte(crc_l); USART1_SendByte(0x03); } void USART1_ReceivePacket(void) { } // Receive data types (big-endian) uint16_t USART1_ReceiveUInt16(void) { uint16_t value = (uint16_t)USART1_ReceiveByte() << 8; // MSB first value |= USART1_ReceiveByte(); // LSB second return value; } int16_t USART1_ReceiveInt16(void) { return (int16_t) USART1_ReceiveUInt16(); // Same byte order, just cast } uint32_t USART1_ReceiveUInt32(void) { uint32_t value = (uint32_t)USART1_ReceiveByte() << 24; // MSB first value |= (uint32_t)USART1_ReceiveByte() << 16; value |= (uint32_t)USART1_ReceiveByte() << 8; value |= USART1_ReceiveByte(); // LSB last return value; } int32_t USART1_ReceiveInt32(void) { return (int32_t)USART1_ReceiveUInt32(); // Same byte order, just cast }