uart working but fix send char
This commit is contained in:
@@ -15,7 +15,7 @@ SHAL_GPIO::SHAL_GPIO(GPIO_Key key) : m_GPIO_KEY(key) {
|
||||
|
||||
auto GPIORCCEnable = getGPIORCCEnable(key);
|
||||
|
||||
SHAL_set_register_value(GPIORCCEnable.reg,GPIORCCEnable.mask);
|
||||
SHAL_apply_bitmask(GPIORCCEnable.reg,GPIORCCEnable.mask);
|
||||
}
|
||||
|
||||
void SHAL_GPIO::setLow() {
|
||||
|
||||
95
SHAL/Src/STM32H7xx/Peripheral/UART/SHAL_UART.cpp
Normal file
95
SHAL/Src/STM32H7xx/Peripheral/UART/SHAL_UART.cpp
Normal file
@@ -0,0 +1,95 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file SHAL_TIM.h
|
||||
* @author Luca Lizaranzu
|
||||
* @brief Related to USART and SHAL_UART abstractions
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#include "SHAL_UART.h"
|
||||
#include "SHAL_GPIO.h"
|
||||
#include "SHAL_UART_REG.h"
|
||||
|
||||
void SHAL_UART::init(const UART_Pair_Key pair){
|
||||
|
||||
m_key = pair;
|
||||
|
||||
auto uartPair = getUARTPair(pair); //Get the UART_PAIR information to be initialized
|
||||
|
||||
//Get the SHAL_GPIO pins for this SHAL_UART setup
|
||||
const GPIO_Key Tx_Key = uartPair.TxKey; //Tx pin
|
||||
const GPIO_Key Rx_Key = uartPair.RxKey; //Rx pin
|
||||
|
||||
GET_GPIO(Tx_Key).setPinMode(PinMode::ALTERNATE_FUNCTION_MODE);
|
||||
GET_GPIO(Rx_Key).setPinMode(PinMode::ALTERNATE_FUNCTION_MODE);
|
||||
|
||||
GET_GPIO(Tx_Key).setAlternateFunction(uartPair.TxAlternateFunctionMask);
|
||||
GET_GPIO(Rx_Key).setAlternateFunction(uartPair.RxAlternateFunctionMask);
|
||||
|
||||
|
||||
SHAL_UART_Enable_Register pairUARTEnable = getUARTEnableReg(pair); //Register and mask to enable the SHAL_UART channel
|
||||
|
||||
SHAL_apply_bitmask(pairUARTEnable.reg,pairUARTEnable.mask);
|
||||
|
||||
|
||||
}
|
||||
|
||||
void SHAL_UART::begin(uint32_t baudRate, SHAL_USART_Word_Length wordLength) const volatile {
|
||||
|
||||
auto CR = getUARTControlRegister1(m_key);
|
||||
auto BRR = getUARTBaudRateRegister(m_key); // fix this
|
||||
|
||||
SHAL_clear_bitmask(CR.reg, CR.usart_enable_mask);
|
||||
|
||||
SHAL_apply_bitmask(CR.reg, static_cast<uint32_t>(wordLength));
|
||||
SHAL_apply_bitmask(CR.reg, CR.receive_enable_mask);
|
||||
SHAL_apply_bitmask(CR.reg, CR.transmit_enable_mask);
|
||||
|
||||
uint16_t baud = SystemCoreClock / (1 * baudRate);
|
||||
SHAL_set_bits_16(BRR.reg, 16, baud, 0);
|
||||
|
||||
SHAL_apply_bitmask(CR.reg, CR.usart_enable_mask); //Enable
|
||||
}
|
||||
|
||||
void SHAL_UART::sendString(const char *s) volatile {
|
||||
const auto ISR = getUARTISR(m_key);
|
||||
|
||||
while (*s) sendChar(*s++); //Send chars while we haven't reached end of s
|
||||
|
||||
if(!SHAL_WAIT_FOR_CONDITION_US((*ISR.reg & ISR.transmission_complete_mask) != 0, 1000)){
|
||||
assert(false);
|
||||
}
|
||||
}
|
||||
|
||||
void SHAL_UART::sendChar(char c) volatile {
|
||||
|
||||
/* TODO fix old
|
||||
auto ISR = getUARTISR(m_key);
|
||||
|
||||
if(!SHAL_WAIT_FOR_CONDITION_US((*ISR.reg & ISR.transmit_data_register_empty_mask) == 0, 20)){ //TODO check if this is too slow for this? Need to check busy reg
|
||||
assert(false);
|
||||
}
|
||||
|
||||
|
||||
*getUARTTransmitDataRegister(m_key).reg = c; //Send character
|
||||
*/
|
||||
/* Wait until TXE (Transmit Data Register Empty) */
|
||||
while (!(USART3->ISR & USART_ISR_TXE_TXFNF))
|
||||
{
|
||||
/* spin */
|
||||
}
|
||||
USART3->TDR = (uint32_t)(uint8_t)c;
|
||||
}
|
||||
|
||||
|
||||
|
||||
SHAL_UART& UARTManager::get(uint8_t uart) {
|
||||
|
||||
if(uart > NUM_USART_LINES - 1){
|
||||
assert(false);
|
||||
//Memory fault
|
||||
}
|
||||
|
||||
return m_UARTs[uart];
|
||||
}
|
||||
Reference in New Issue
Block a user