/* ----------------------------------------------------- HardwareSerial_v003.cpp stellt die nicht im Core verfuegbaren Funktionen des UART / Serial zur Verfuegung MCU : CH32V003 Takt : 48 MHz 30.11.2025 R. Seelig ------------------------------------------------------ */ #ifdef CH32V00x #include "HardwareSerial_v003.h" // -------------------------------------------------------------------- // V003_Serial (Konstruktor) // -------------------------------------------------------------------- HardwareSerial_v003::HardwareSerial_v003() { } /* -------------------------------------------------------------------- begin initialisiert serielle Schnittstelle mit Protokoll 8N1 TxD an Pin PD5, RxD an Pin PD6 Uebergabe: baudrate : einzustellende Baudrate ---------------------------------------------------------- */ void HardwareSerial_v003::begin(uint32_t brate) { #define pinnr 6 // PD6 baudrate= brate; // Enable UART and GPIOD RCC->APB2PCENR |= RCC_APB2Periph_GPIOD | RCC_APB2Periph_USART1; // Push-Pull, 10MHz Output on D5, alternate function (TxD) GPIOD->CFGLR = (GPIOD->CFGLR & ~(0x0f << (4*5))) | ((GPIO_Speed_10MHz | GPIO_CNF_OUT_PP_AF)<<( 4*5 )); // PD6 Pull-Up Widerstand an GPIOD->BSHR |= (1 << pinnr); // PD6 als Input GPIOD->CFGLR &= ~(0x0f << (4 * pinnr)); GPIOD->CFGLR |= ((GPIO_CNF_IN_PUPD) << (4 * pinnr)); GPIOD->BSHR |= (1 << pinnr); // Setup UART for 8n1 USART1->CTLR1 = USART_WordLength_8b | USART_Parity_No | USART_Mode_Tx | USART_Mode_Rx; USART1->CTLR2 = USART_StopBits_1; // Set baud rate and enable UART USART1->BRR = ((FUNCONF_SYSTEM_CORE_CLOCK) + (baudrate)/2) / (baudrate); USART1->CTLR1 |= CTLR1_UE_Set; } /* ---------------------------------------------------------- putchar sendet ein Zeichen auf der seriellen Schnittstelle Uebergabe: ch : zu sendendes Zeichen ---------------------------------------------------------- */ void HardwareSerial_v003::putchar(uint8_t ch) { while(!(USART1->STATR & USART_FLAG_TXE)); USART1->DATAR = ch; } /* ---------------------------------------------------------- getchar wartet, bis auf der seriellen Schnittstelle ein Zeichen eingegangen ist und liest dieses ein. Rueckgabe: gelesenes Zeichen ---------------------------------------------------------- */ uint8_t HardwareSerial_v003::getchar(void) { while(!(USART1->STATR & USART_FLAG_RXNE)); return USART1->DATAR; } /* ---------------------------------------------------------- ischar testet, ob auf der seriellen Schnittstelle ein Zeichen eingegangen ist, liest dieses aber nicht ein Rueckgabe: 1 : es ist ein Zeichen eingetroffen 0 : kein Zeichen verfuegbar ---------------------------------------------------------- */ uint8_t HardwareSerial_v003::ischar(void) { return (USART1->STATR & USART_FLAG_RXNE); } /* ------------------------------------------------------------ Stream Methoden ------------------------------------------------------------ */ int HardwareSerial_v003::available() { return ischar() ? 1 : 0; } int HardwareSerial_v003::read() { return getchar(); } int HardwareSerial_v003::peek() { if(ischar()) return USART1->DATAR; return -1; } size_t HardwareSerial_v003::write(uint8_t ch) { putchar(ch); return 1; } #endif