diff --git a/src/shared/drivers/usart/USART.cpp b/src/shared/drivers/usart/USART.cpp index bc5612a0855997b158c2a1cc5f35c2b01248ce94..65e675a44cad64402923d964c3b1f9979baef0ce 100644 --- a/src/shared/drivers/usart/USART.cpp +++ b/src/shared/drivers/usart/USART.cpp @@ -251,29 +251,6 @@ namespace Boardcore USARTInterface::~USARTInterface() {} -bool USARTInterface::initPins(miosix::GpioPin tx, int nAFtx, miosix::GpioPin rx, - int nAFrx) -{ - if (pinInitialized) - { - return false; - } - - miosix::FastInterruptDisableLock dLock; - - this->tx = tx; - this->rx = rx; - - tx.mode(miosix::Mode::ALTERNATE); - tx.alternateFunction(nAFtx); - - rx.mode(miosix::Mode::ALTERNATE); - rx.alternateFunction(nAFrx); - - pinInitialized = true; - return true; -} - void USART::IRQhandleInterrupt() { char c; @@ -315,110 +292,43 @@ USART::USART(USARTType *usart, Baudrate baudrate, unsigned int queueLen) { case USART1_BASE: this->id = 1; - initPins(u1tx1::getPin(), 7, u1rx1::getPin(), 7); - irqn = USART1_IRQn; + irqn = USART1_IRQn; break; case USART2_BASE: this->id = 2; - initPins(u2tx1::getPin(), 7, u2rx1::getPin(), 7); - irqn = USART2_IRQn; + irqn = USART2_IRQn; break; case USART3_BASE: this->id = 3; - initPins(u3tx1::getPin(), 7, u3rx1::getPin(), 7); - irqn = USART3_IRQn; + irqn = USART3_IRQn; break; case UART4_BASE: this->id = 4; - initPins(u4tx1::getPin(), 8, u4rx1::getPin(), 8); - irqn = UART4_IRQn; + irqn = UART4_IRQn; break; case UART5_BASE: this->id = 5; - initPins(u5tx::getPin(), 8, u5rx::getPin(), 8); - irqn = UART5_IRQn; + irqn = UART5_IRQn; break; case USART6_BASE: this->id = 6; - initPins(u6tx1::getPin(), 8, u6rx1::getPin(), 8); - irqn = USART6_IRQn; + irqn = USART6_IRQn; break; #ifdef STM32F429xx case UART7_BASE: this->id = 7; - initPins(u7tx1::getPin(), 8, u7rx1::getPin(), 8); - irqn = UART7_IRQn; + irqn = UART7_IRQn; break; case UART8_BASE: this->id = 8; - initPins(u8tx::getPin(), 8, u8rx::getPin(), 8); - irqn = UART8_IRQn; + irqn = UART8_IRQn; break; #endif // STM32F429xx } - commonConstructor(usart, baudrate); -} - -USART::USART(USARTType *usart, Baudrate baudrate, miosix::GpioPin tx, - miosix::GpioPin rx, unsigned int queueLen) - : rxQueue(queueLen) -{ - // Setting the id of the serial port - switch (reinterpret_cast<uint32_t>(usart)) - { - case USART1_BASE: - this->id = 1; - initPins(tx, 7, rx, 7); - irqn = USART1_IRQn; - break; - case USART2_BASE: - this->id = 2; - initPins(tx, 7, rx, 7); - irqn = USART2_IRQn; - break; - case USART3_BASE: - this->id = 3; - initPins(tx, 7, rx, 7); - irqn = USART3_IRQn; - break; - case UART4_BASE: - this->id = 4; - initPins(tx, 8, rx, 8); - irqn = UART4_IRQn; - break; - case UART5_BASE: - this->id = 5; - initPins(tx, 8, rx, 8); - irqn = UART5_IRQn; - break; - case USART6_BASE: - this->id = 6; - initPins(tx, 8, rx, 8); - irqn = USART6_IRQn; - break; -#ifdef STM32F429xx - case UART7_BASE: - this->id = 7; - initPins(tx, 8, rx, 8); - irqn = UART7_IRQn; - break; - case UART8_BASE: - this->id = 8; - initPins(tx, 8, rx, 8); - irqn = UART8_IRQn; - break; -#endif // STM32F429xx - } - - commonConstructor(usart, baudrate); -} - -void USART::commonConstructor(USARTType *usart, Baudrate baudrate) -{ this->usart = usart; - // Enabling the peripehral on the right APB + // Enabling the peripheral on the right APB ClockUtils::enablePeripheralClock(usart); RCC_SYNC(); @@ -440,25 +350,23 @@ void USART::commonConstructor(USARTType *usart, Baudrate baudrate) USART::~USART() { - { - miosix::FastInterruptDisableLock dLock; + miosix::FastInterruptDisableLock dLock; - // Take out the usart object we are going to destruct - USART::ports[this->id - 1] = nullptr; + // Take out the usart object we are going to destruct + USART::ports[this->id - 1] = nullptr; - // Disabling the usart - usart->CR1 &= ~(USART_CR1_UE | USART_CR1_TE | USART_CR1_RE); + // Disabling the usart + usart->CR1 &= ~(USART_CR1_UE | USART_CR1_TE | USART_CR1_RE); - // Disabling the interrupt of the serial port - NVIC_DisableIRQ(irqn); - } + // Disabling the interrupt of the serial port + NVIC_DisableIRQ(irqn); } bool USART::init() { - if (id < 1 || id > MAX_SERIAL_PORTS || !pinInitialized) + if (id < 1 || id > MAX_SERIAL_PORTS) { - TRACE("Not supported USART id or pins not initialized\n"); + TRACE("Not supported USART id\n"); return false; } @@ -761,6 +669,27 @@ bool STM32SerialWrapper::serialCommSetup() return true; } +bool STM32SerialWrapper::initPins(miosix::GpioPin tx, int nAFtx, + miosix::GpioPin rx, int nAFrx) +{ + if (pinInitialized) + return false; + + miosix::FastInterruptDisableLock dLock; + + this->tx = tx; + this->rx = rx; + + tx.mode(miosix::Mode::ALTERNATE); + tx.alternateFunction(nAFtx); + + rx.mode(miosix::Mode::ALTERNATE); + rx.alternateFunction(nAFrx); + + pinInitialized = true; + return true; +} + int STM32SerialWrapper::writeString(const char *data) { // strlen + 1 in order to send the '/0' terminated string diff --git a/src/shared/drivers/usart/USART.h b/src/shared/drivers/usart/USART.h index 05cee3a1662984393fc8790c31dab329eb1f201c..14faf77c87f7739259d45a2fa28931168a026117 100644 --- a/src/shared/drivers/usart/USART.h +++ b/src/shared/drivers/usart/USART.h @@ -101,6 +101,7 @@ typedef miosix::Gpio<GPIOE_BASE, 0> u8rx; namespace Boardcore { + /** * @brief Abstract class that implements the interface for the USART/UART serial * communication. @@ -155,24 +156,11 @@ public: int getId() { return id; }; protected: - /** - * @brief Initializes the pins with the appropriate alternate functions. - * - * @param tx Tranmission pin. - * @param nAFtx Tranmission pin alternate function. - * @param rx Reception pin. - * @param nAFrx Reception pin alternate function. - */ - bool initPins(miosix::GpioPin tx, int nAFtx, miosix::GpioPin rx, int nAFrx); - - ///< True if initPins() already called successfully, false otherwise - bool pinInitialized = false; - miosix::GpioPin tx{GPIOA_BASE, 0}; miosix::GpioPin rx{GPIOA_BASE, 0}; USARTType *usart; - int id = 1; ///< Can be 1, 2, 3, 4, 5, 6, 7, 8 + int id = -1; ///< Can be from 1 to 8, -1 is invalid bool initialized = false; Baudrate baudrate; ///< Baudrate of the serial communication }; @@ -214,15 +202,7 @@ public: * * Sets the default values for all the parameters (1 stop bit, 8 bit data, * no control flow and no oversampling). - * Initializes the serial port using the default pins, which are: - * - USART1: tx=PA9 rx=PA10 - * - USART2: tx=PA2 rx=PA3 - * - USART3: tx=PB10 rx=PB11 - * - UART4: tx=PA0 rx=PA1 - * - UART5: tx=PC12 rx=PD2 - * - USART6: tx=PC6 rx=PC7 - * - UART7: tx=PE8 rx=PE7 - * - UART8: tx=PE1 rx=PE0 + * Requires that the gpios are configured for the choosen uart. * * @param usart structure that represents the usart peripheral [accepted * are: USART1, USART2, USART3, UART4, UART5, USART6, UART7, UART8]. @@ -232,30 +212,12 @@ public: USART(USARTType *usart, Baudrate baudrate, unsigned int queueLen = usart_queue_default_capacity); - /** - * @brief Automatically enables the peripheral and timer peripheral clock. - * - * Sets the default values for all the parameters (1 stop bit, 8 bit data, - * no control flow and no oversampling). - * Initializes the serial port using custom pins. - * - * @param usart Structure that represents the usart peripheral [accepted - * are: USART1, USART2, USART3, UART4, UART5, USART6, UART7, UART8]. - * @param baudrate Member of the enum Baudrate that represents the baudrate - * with which the communication will take place. - * @param tx Tranmission pin. - * @param rx Reception pin. - */ - USART(USARTType *usart, Baudrate baudrate, miosix::GpioPin tx, - miosix::GpioPin rx, - unsigned int queueLen = usart_queue_default_capacity); - /** * @brief Disables the flags for the generation of the interrupts, the IRQ * from the NVIC, the peripheral and removes his pointer from the ports * list. */ - ~USART(); + ~USART() override; /** * @brief Initializes the peripheral enabling his interrupts, the interrupts @@ -265,23 +227,23 @@ public: * All the setup phase must be done before the initialization of the * peripheral. The pins must be initialized before calling this function. */ - bool init(); + bool init() override; /** * @brief Blocking read operation to read nBytes or till the data transfer * is complete. */ - int read(void *buffer, size_t nBytes); + int read(void *buffer, size_t nBytes) override; /** * @brief Blocking write operation. */ - int write(void *buf, size_t nChars); + int write(void *buf, size_t nChars) override; /** * @brief Write a string to the serial, comprising the '\0' character. */ - int writeString(const char *buffer); + int writeString(const char *buffer) override; /** * @brief Set the length of the word to 8 or to 9. @@ -326,8 +288,6 @@ public: void clearQueue(); private: - void commonConstructor(USARTType *usart, Baudrate baudrate); - IRQn_Type irqn; miosix::FastMutex rxMutex; ///< mutex for receiving on serial miosix::FastMutex txMutex; ///< mutex for transmitting on serial @@ -408,12 +368,25 @@ public: int writeString(const char *buffer); private: + /** + * @brief Initializes the pins with the appropriate alternate functions. + * + * @param tx Tranmission pin. + * @param nAFtx Tranmission pin alternate function. + * @param rx Reception pin. + * @param nAFrx Reception pin alternate function. + */ + bool initPins(miosix::GpioPin tx, int nAFtx, miosix::GpioPin rx, int nAFrx); + /** * @brief Creates a device that represents the serial port, adds it to the * file system and opens the file that represents the device. */ bool serialCommSetup(); + ///< True if initPins() already called successfully, false otherwise + bool pinInitialized = false; + miosix::STM32Serial *serial; ///< Pointer to the serial object //< Port name of the port that has to be created for the communication diff --git a/src/tests/drivers/usart/test-usart.cpp b/src/tests/drivers/usart/test-usart.cpp index ce99d3d5a5a764b696598f8b0bf2c1ef49eccd7f..48bff73590492c88cbabd8909079fb8d471741d4 100644 --- a/src/tests/drivers/usart/test-usart.cpp +++ b/src/tests/drivers/usart/test-usart.cpp @@ -136,6 +136,16 @@ bool testCommunicationSequential(USARTInterface *src, USARTInterface *dst) */ int main() { + // Init serial port pins + u1rx2::getPin().mode(miosix::Mode::ALTERNATE); + u1rx2::getPin().alternateFunction(7); + u1tx1::getPin().mode(miosix::Mode::ALTERNATE); + u1tx1::getPin().alternateFunction(7); + u4rx1::getPin().mode(miosix::Mode::ALTERNATE); + u4rx1::getPin().alternateFunction(8); + u4tx1::getPin().mode(miosix::Mode::ALTERNATE); + u4tx1::getPin().alternateFunction(8); + bool testPassed = true; printf("*** SERIAL 3 WORKING!\n"); for (unsigned int iBaud = 0; @@ -145,12 +155,10 @@ int main() printf("\n\n########################### %d\n", (int)baudrate); // declaring the usart peripherals - STM32SerialWrapper usartx(USART1, baudrate, u1rx2::getPin(), - u1tx1::getPin()); + STM32SerialWrapper usartx(USART1, baudrate); usartx.init(); USART usarty(UART4, baudrate); - // usarty.initPins(u5tx::getPin(), 8, u5rx::getPin(), 8); // usarty.setOversampling(false); // usarty.setStopBits(1); // usarty.setWordLength(USART::WordLength::BIT8);