f1ll introduction
This commit is contained in:
parent
09263346a5
commit
7672e157a0
27 changed files with 3761 additions and 91 deletions
42
components/f1ll/consolehandler.cpp
Normal file
42
components/f1ll/consolehandler.cpp
Normal file
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* ll_consolehandler.cpp
|
||||
*
|
||||
* Created on: Nov 7, 2019
|
||||
* Author: abody
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include "f1ll/consolehandler.h"
|
||||
|
||||
namespace f1ll {
|
||||
|
||||
ConsoleHandler::ConsoleHandler(USART_TypeDef *usart, DMA_TypeDef *dma, uint32_t channelRx, uint32_t channelTx)
|
||||
: UsartCore(usart, dma, channelRx, channelTx)
|
||||
{
|
||||
}
|
||||
|
||||
void ConsoleHandler::ReceiverIdle(void) {}
|
||||
void ConsoleHandler::TransmissionComplete(void) {}
|
||||
void ConsoleHandler::FramingError(void) {}
|
||||
void ConsoleHandler::Overrun(void) {}
|
||||
void ConsoleHandler::RxDmaTransferComplete(void) {}
|
||||
void ConsoleHandler::RxDmaHalfTransfer(void) {}
|
||||
void ConsoleHandler::RxDmaError(void) {}
|
||||
void ConsoleHandler::TxDmaTransferComplete(void)
|
||||
{
|
||||
LL_USART_EnableIT_TC(m_usart);
|
||||
LL_DMA_DisableChannel(m_txDma.GetDma(), m_txDma.GetChannel());
|
||||
}
|
||||
void ConsoleHandler::TxDmaHalfTransfer(void) {}
|
||||
void ConsoleHandler::TxDmaError(void) {}
|
||||
|
||||
void ConsoleHandler::Print(char const *s)
|
||||
{
|
||||
size_t len = strlen(s);
|
||||
strncpy(m_buffer, s, sizeof( m_buffer));
|
||||
SetupTransmit(m_buffer, len > sizeof(m_buffer) ? sizeof(m_buffer) : len);
|
||||
}
|
||||
|
||||
|
||||
} /* namespace f4ll */
|
||||
|
45
components/f1ll/consolehandler.h
Normal file
45
components/f1ll/consolehandler.h
Normal file
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
* ll_consolehandler.h
|
||||
*
|
||||
* Created on: Nov 7, 2019
|
||||
* Author: abody
|
||||
*/
|
||||
|
||||
#ifndef LL_CONSOLEHANDLER_H_
|
||||
#define LL_CONSOLEHANDLER_H_
|
||||
|
||||
#include "f1ll/usartcore.h"
|
||||
#include "singleton.h"
|
||||
|
||||
|
||||
namespace f1ll {
|
||||
|
||||
class ConsoleHandler: public UsartCore, public Singleton<ConsoleHandler>
|
||||
{
|
||||
friend class Singleton<ConsoleHandler>;
|
||||
|
||||
public:
|
||||
void Print(char const *s);
|
||||
|
||||
private:
|
||||
ConsoleHandler(USART_TypeDef *usart, DMA_TypeDef *dma, uint32_t channelRx, uint32_t channelTx);
|
||||
|
||||
// LL_UsartCore pure virtual function implementations
|
||||
virtual void ReceiverIdle(void);
|
||||
virtual void TransmissionComplete(void);
|
||||
virtual void FramingError(void);
|
||||
virtual void Overrun(void);
|
||||
virtual void RxDmaTransferComplete(void);
|
||||
virtual void RxDmaHalfTransfer(void);
|
||||
virtual void RxDmaError(void);
|
||||
virtual void TxDmaTransferComplete(void);
|
||||
virtual void TxDmaHalfTransfer(void);
|
||||
virtual void TxDmaError(void);
|
||||
|
||||
char m_buffer[128];
|
||||
uint16_t m_used = 0;
|
||||
};
|
||||
|
||||
} /* namespace f4ll */
|
||||
|
||||
#endif /* LL_CONSOLEHANDLER_H_ */
|
30
components/f1ll/dmahelper.cpp
Normal file
30
components/f1ll/dmahelper.cpp
Normal file
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
q * ll_dmahelper.cpp
|
||||
*
|
||||
* Created on: Oct 25, 2019
|
||||
* Author: abody
|
||||
*/
|
||||
|
||||
#include "f1ll/dmahelper.h"
|
||||
|
||||
namespace f1ll {
|
||||
|
||||
const uint32_t DmaHelper::m_TEMasks[7] = {DMA_ISR_TEIF1, DMA_ISR_TEIF2, DMA_ISR_TEIF3, DMA_ISR_TEIF4, DMA_ISR_TEIF5, DMA_ISR_TEIF6, DMA_ISR_TEIF7};
|
||||
const uint32_t DmaHelper::m_HTMasks[7] = {DMA_ISR_HTIF1, DMA_ISR_HTIF2, DMA_ISR_HTIF3, DMA_ISR_HTIF4, DMA_ISR_HTIF5, DMA_ISR_HTIF6, DMA_ISR_HTIF7};
|
||||
const uint32_t DmaHelper::m_TCMasks[7] = {DMA_ISR_TCIF1, DMA_ISR_TCIF2, DMA_ISR_TCIF3, DMA_ISR_TCIF4, DMA_ISR_TCIF5, DMA_ISR_TCIF6, DMA_ISR_TCIF7};
|
||||
const uint32_t DmaHelper::m_GIMasks[7] = {DMA_ISR_GIF1, DMA_ISR_GIF2, DMA_ISR_GIF3, DMA_ISR_GIF4, DMA_ISR_GIF5, DMA_ISR_GIF6, DMA_ISR_GIF7};
|
||||
|
||||
DmaHelper::DmaHelper(DMA_TypeDef *dma, uint32_t channel)
|
||||
: m_dma(dma)
|
||||
, m_channel(channel)
|
||||
#ifdef DMA2
|
||||
, m_isReg(dma == DMA1 ? &DMA1->ISR : &DMA2->ISR)
|
||||
, m_ifcReg(dma == DMA1 ? &DMA1->IFCR : &DMA2->IFCR)
|
||||
#else
|
||||
, m_isReg(&DMA1->ISR)
|
||||
, m_ifcReg(&DMA1->IFCR)
|
||||
#endif
|
||||
{
|
||||
}
|
||||
|
||||
} /* namespace f4ll */
|
49
components/f1ll/dmahelper.h
Normal file
49
components/f1ll/dmahelper.h
Normal file
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
* ll_dmahelper.h
|
||||
*
|
||||
* Created on: Oct 25, 2019
|
||||
* Author: abody
|
||||
*/
|
||||
|
||||
#ifndef LL_DMAHELPER_H_
|
||||
#define LL_DMAHELPER_H_
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <platform/dma_ll.h>
|
||||
|
||||
namespace f1ll {
|
||||
|
||||
class DmaHelper {
|
||||
public:
|
||||
DmaHelper(DMA_TypeDef *dma, uint32_t channel);
|
||||
DmaHelper(DmaHelper const &base) = default;
|
||||
|
||||
inline DMA_TypeDef* GetDma() const { return m_dma; }
|
||||
inline uint32_t GetChannel() const { return m_channel; }
|
||||
inline volatile uint32_t* GetIsReg() const { return m_isReg; }
|
||||
inline volatile uint32_t* GetIfcReg() const { return m_ifcReg; }
|
||||
inline uint32_t GetTeMask() const { return m_TEMasks[m_channel - 1]; }
|
||||
inline uint32_t GetHtMask() const { return m_HTMasks[m_channel - 1]; }
|
||||
inline uint32_t GetTcMask() const { return m_TCMasks[m_channel - 1]; }
|
||||
inline uint32_t GetGiMask() const { return m_GIMasks[m_channel - 1]; }
|
||||
|
||||
|
||||
inline bool IsEnabledIt_TE() { return LL_DMA_IsEnabledIT_TE(m_dma, m_channel) != 0; }
|
||||
inline bool IsEnabledIt_HT() { return LL_DMA_IsEnabledIT_HT(m_dma, m_channel) != 0; }
|
||||
inline bool IsEnabledIt_TC() { return LL_DMA_IsEnabledIT_TC(m_dma, m_channel) != 0; }
|
||||
|
||||
private:
|
||||
DMA_TypeDef *m_dma;
|
||||
uint32_t m_channel;
|
||||
volatile uint32_t *m_isReg;
|
||||
volatile uint32_t *m_ifcReg;
|
||||
|
||||
static const uint32_t m_TEMasks[7];
|
||||
static const uint32_t m_HTMasks[7];
|
||||
static const uint32_t m_TCMasks[7];
|
||||
static const uint32_t m_GIMasks[7];
|
||||
};
|
||||
|
||||
} /* namespace f4ll */
|
||||
|
||||
#endif /* LL_DMAHELPER_H_ */
|
26
components/f1ll/singleton.h
Normal file
26
components/f1ll/singleton.h
Normal file
|
@ -0,0 +1,26 @@
|
|||
#ifndef SINGLETON_H_
|
||||
#define SINGLETON_H_
|
||||
|
||||
#include <utility>
|
||||
|
||||
template<typename T> class Singleton {
|
||||
public:
|
||||
static T &Instance() { return *m_instance; }
|
||||
template<typename ... Args>
|
||||
static T &Init(Args &&... args)
|
||||
{
|
||||
static T instance{ std::forward<Args>(args)... };
|
||||
m_instance = &instance;
|
||||
return instance;
|
||||
}
|
||||
|
||||
protected:
|
||||
Singleton() = default;
|
||||
Singleton(const Singleton &) = delete;
|
||||
Singleton &operator=(const Singleton &) = delete;
|
||||
static T *m_instance;
|
||||
};
|
||||
|
||||
template<typename T> T* Singleton<T>::m_instance = nullptr;
|
||||
|
||||
#endif /* SINGLETON_H_ */
|
110
components/f1ll/strutil.cpp
Normal file
110
components/f1ll/strutil.cpp
Normal file
|
@ -0,0 +1,110 @@
|
|||
#include <stdint.h>
|
||||
#include "f1ll/strutil.h"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
size_t strcpy_ex(char *dst, char const *src)
|
||||
{
|
||||
size_t ret = 0;
|
||||
do {
|
||||
*dst++ = *src;
|
||||
++ret;
|
||||
} while(*src++);
|
||||
return ret - 1;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
void strrev(char *first, char *last)
|
||||
{
|
||||
char tmp;
|
||||
while(last > first) {
|
||||
tmp = *first;
|
||||
*first++ = *last;
|
||||
*last-- = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
char tochr(const uint8_t in, const uint8_t upper)
|
||||
{
|
||||
return in + ((in < 10) ? '0' : (upper ? 'A' : 'a') - 10);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
size_t uitodec(char* buffer, uint32_t data)
|
||||
{
|
||||
char *b2 = buffer;
|
||||
if(!data) {
|
||||
*b2++ = '0';
|
||||
*b2 = '\0';
|
||||
return 1;
|
||||
}
|
||||
|
||||
while(data) {
|
||||
*b2++ = (data % 10) + '0';
|
||||
data /= 10;
|
||||
}
|
||||
size_t ret = b2 - buffer;
|
||||
|
||||
*b2-- = 0;
|
||||
|
||||
strrev(buffer, b2);
|
||||
return ret;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
size_t uitohex(char* buffer, uint32_t data, uint8_t chars)
|
||||
{
|
||||
char *b2 = buffer;
|
||||
size_t ret = 0;
|
||||
|
||||
if(chars == 0xff || !chars)
|
||||
{
|
||||
if(!data) {
|
||||
*b2++ = '0';
|
||||
*b2 = '\0';
|
||||
return 1;
|
||||
}
|
||||
|
||||
while(data) {
|
||||
uint8_t curval = data & 0x0f;
|
||||
*b2++ = tochr(curval, 1);
|
||||
data >>= 4;
|
||||
}
|
||||
ret = b2 - buffer;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = chars;
|
||||
for(uint8_t pos = 0; pos < (uint8_t)ret; ++pos) {
|
||||
*b2++ = tochr(data & 0x0f, 1);
|
||||
data >>= 4;
|
||||
}
|
||||
|
||||
}
|
||||
*b2-- = 0;
|
||||
strrev(buffer, b2);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
size_t itodec(char* buffer, int data)
|
||||
{
|
||||
if(data < 0) {
|
||||
*buffer++ = '-';
|
||||
return uitodec(buffer, -data) + 1;
|
||||
}
|
||||
|
||||
return uitodec(buffer, data);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
size_t itohex(char* buffer, int data)
|
||||
{
|
||||
if(data < 0) {
|
||||
*buffer++ = '-';
|
||||
return uitohex(buffer, -data, 0) + 1;
|
||||
}
|
||||
return uitohex(buffer, data, 0);
|
||||
}
|
31
components/f1ll/strutil.h
Normal file
31
components/f1ll/strutil.h
Normal file
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* strutil.h
|
||||
*
|
||||
* Created on: Feb 11, 2017
|
||||
* Author: compi
|
||||
*/
|
||||
|
||||
#ifndef _STM32PLUS_STRUTIL_H_
|
||||
#define _STM32PLUS_STRUTIL_H_
|
||||
|
||||
#include <stddef.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
size_t strcpy_ex(char *dst, char const *src);
|
||||
size_t uitodec(char* buffer, uint32_t data);
|
||||
size_t uitohex(char* buffer, uint32_t data, uint8_t chars);
|
||||
size_t itodec(char* buffer, int data);
|
||||
size_t itohex(char* buffer, int data);
|
||||
void strrev(char *first, char *last);
|
||||
char tochr(const uint8_t in, const uint8_t upper);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _STM32PLUS_STRUTIL_H_ */
|
120
components/f1ll/usartcore.cpp
Normal file
120
components/f1ll/usartcore.cpp
Normal file
|
@ -0,0 +1,120 @@
|
|||
/*
|
||||
* ll_dmadrivenusartcore.cpp
|
||||
*
|
||||
* Created on: Nov 4, 2019
|
||||
* Author: abody
|
||||
*/
|
||||
|
||||
#include "f1ll/usartcore.h"
|
||||
|
||||
namespace f1ll {
|
||||
|
||||
UsartCore::UsartCore(USART_TypeDef *usart, DMA_TypeDef *dma, uint32_t channelRx, uint32_t channelTx)
|
||||
: m_usart(usart)
|
||||
, m_rxDma(dma, channelRx)
|
||||
, m_txDma(dma, channelTx)
|
||||
{
|
||||
uint32_t status = usart->SR;
|
||||
volatile uint32_t tmpreg = usart->DR; // clearing some of the error/status bits in the USART
|
||||
(void) tmpreg;
|
||||
(void) status;
|
||||
|
||||
*m_txDma.GetIfcReg() =
|
||||
m_txDma.GetGiMask();
|
||||
*m_rxDma.GetIfcReg() =
|
||||
m_rxDma.GetGiMask();
|
||||
|
||||
LL_DMA_EnableIT_HT(dma, channelRx);
|
||||
LL_DMA_EnableIT_TC(dma, channelRx);
|
||||
LL_DMA_EnableIT_TE(dma, channelRx);
|
||||
LL_DMA_EnableIT_HT(dma, channelTx);
|
||||
LL_DMA_EnableIT_TC(dma, channelTx);
|
||||
LL_DMA_EnableIT_TE(dma, channelTx);
|
||||
}
|
||||
|
||||
|
||||
void UsartCore::UsartIsr()
|
||||
{
|
||||
uint32_t status = m_usart->SR;
|
||||
volatile uint32_t tmpreg = m_usart->DR; // clearing some of the error/status bits in the HW
|
||||
(void) tmpreg;
|
||||
|
||||
if(LL_USART_IsEnabledIT_TC(m_usart) && LL_USART_IsActiveFlag_TC(m_usart)) { // transmission complete
|
||||
LL_USART_DisableIT_TC(m_usart);
|
||||
TransmissionComplete();
|
||||
}
|
||||
if(LL_USART_IsEnabledIT_IDLE(m_usart) && (status & USART_SR_IDLE)) {
|
||||
ReceiverIdle();
|
||||
}
|
||||
if(LL_USART_IsEnabledIT_ERROR(m_usart)) {
|
||||
if(status & USART_SR_FE) {
|
||||
FramingError();
|
||||
}
|
||||
if(status & USART_SR_ORE) {
|
||||
Overrun();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void UsartCore::RxDmaIsr()
|
||||
{
|
||||
if(*m_rxDma.GetIsReg() & m_rxDma.GetTcMask()) {
|
||||
*m_rxDma.GetIfcReg() = m_rxDma.GetTcMask();
|
||||
if(m_rxDma.IsEnabledIt_TC())
|
||||
RxDmaTransferComplete();
|
||||
}
|
||||
if(*m_rxDma.GetIsReg() & m_rxDma.GetHtMask()) {
|
||||
*m_rxDma.GetIfcReg() = m_rxDma.GetHtMask();
|
||||
if(m_rxDma.IsEnabledIt_HT())
|
||||
RxDmaHalfTransfer();
|
||||
}
|
||||
if(*m_rxDma.GetIsReg() & m_rxDma.GetTeMask()) {
|
||||
*m_rxDma.GetIfcReg() = m_rxDma.GetTeMask();
|
||||
if(m_rxDma.IsEnabledIt_TE())
|
||||
RxDmaError();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void UsartCore::TxDmaIsr()
|
||||
{
|
||||
if(*m_txDma.GetIsReg() & m_txDma.GetTcMask()) { // DMA transfer complete
|
||||
*m_txDma.GetIfcReg() = m_txDma.GetTcMask();
|
||||
if(m_txDma.IsEnabledIt_TC())
|
||||
TxDmaTransferComplete();
|
||||
}
|
||||
if(*m_txDma.GetIsReg() & m_txDma.GetHtMask()) {
|
||||
*m_txDma.GetIfcReg() = m_txDma.GetHtMask();
|
||||
if(m_txDma.IsEnabledIt_HT())
|
||||
TxDmaHalfTransfer();
|
||||
}
|
||||
if(*m_txDma.GetIsReg() & m_txDma.GetTeMask()) {
|
||||
*m_txDma.GetIfcReg() = m_txDma.GetTeMask();
|
||||
if(m_txDma.IsEnabledIt_TE())
|
||||
TxDmaError();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void UsartCore::SetupTransmit(void const *buffer, uint16_t length)
|
||||
{
|
||||
LL_DMA_ConfigAddresses(m_txDma.GetDma(), m_txDma.GetChannel(), reinterpret_cast<uint32_t>(buffer),
|
||||
LL_USART_DMA_GetRegAddr(m_usart), LL_DMA_DIRECTION_MEMORY_TO_PERIPH);
|
||||
LL_DMA_SetDataLength(m_txDma.GetDma(), m_txDma.GetChannel(), length);
|
||||
LL_USART_EnableDMAReq_TX(m_usart);
|
||||
LL_DMA_EnableChannel(m_txDma.GetDma(), m_txDma.GetChannel());
|
||||
}
|
||||
|
||||
|
||||
void UsartCore::SetupReceive(void *buffer, uint16_t length)
|
||||
{
|
||||
LL_DMA_ConfigAddresses(m_rxDma.GetDma(), m_rxDma.GetChannel(), LL_USART_DMA_GetRegAddr(m_usart),
|
||||
reinterpret_cast<uint32_t>(buffer), LL_DMA_DIRECTION_PERIPH_TO_MEMORY);
|
||||
LL_DMA_SetDataLength(m_rxDma.GetDma(), m_rxDma.GetChannel(), length);
|
||||
LL_USART_EnableDMAReq_RX(m_usart);
|
||||
LL_USART_ClearFlag_ORE(m_usart);
|
||||
LL_DMA_EnableChannel(m_rxDma.GetDma(), m_rxDma.GetChannel());
|
||||
}
|
||||
|
||||
} /* namespace f4ll */
|
55
components/f1ll/usartcore.h
Normal file
55
components/f1ll/usartcore.h
Normal file
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
* ll_dmadrivenusartcore.h
|
||||
*
|
||||
* Created on: Nov 4, 2019
|
||||
* Author: abody
|
||||
*/
|
||||
|
||||
#ifndef LL_USARTCORE_H_
|
||||
#define LL_USARTCORE_H_
|
||||
#include <platform/usart_ll.h>
|
||||
|
||||
#include "f1ll/dmahelper.h"
|
||||
|
||||
namespace f1ll {
|
||||
|
||||
class UsartCore
|
||||
{
|
||||
public:
|
||||
static inline void HandleUsartIrq(UsartCore *_this) { _this->UsartIsr(); }
|
||||
static inline void HandleRxDmaIrq(UsartCore *_this) { _this->RxDmaIsr(); }
|
||||
static inline void HandleTxDmaIrq(UsartCore *_this) { _this->TxDmaIsr(); }
|
||||
|
||||
void SetupTransmit(void const *buffer, uint16_t length);
|
||||
void SetupReceive(void *buffer, uint16_t length);
|
||||
|
||||
protected:
|
||||
UsartCore(USART_TypeDef *usart, DMA_TypeDef *dma, uint32_t channelRx, uint32_t streamTx);
|
||||
|
||||
USART_TypeDef *m_usart;
|
||||
DmaHelper m_rxDma;
|
||||
DmaHelper m_txDma;
|
||||
|
||||
private:
|
||||
virtual void ReceiverIdle(void) = 0;
|
||||
virtual void TransmissionComplete(void) = 0;
|
||||
virtual void FramingError(void) = 0;
|
||||
virtual void Overrun(void) = 0;
|
||||
|
||||
virtual void RxDmaTransferComplete(void) = 0;
|
||||
virtual void RxDmaHalfTransfer(void) = 0;
|
||||
virtual void RxDmaError(void) = 0;
|
||||
|
||||
virtual void TxDmaTransferComplete(void) = 0;
|
||||
virtual void TxDmaHalfTransfer(void) = 0;
|
||||
virtual void TxDmaError(void) = 0;
|
||||
|
||||
void UsartIsr();
|
||||
void RxDmaIsr();
|
||||
void TxDmaIsr();
|
||||
|
||||
};
|
||||
|
||||
} /* namespace f4ll */
|
||||
|
||||
#endif /* LL_USARTCORE_H_ */
|
Loading…
Add table
Add a link
Reference in a new issue