semf
stm32analogoutdma.cpp
Go to the documentation of this file.
1
11
12#if defined(STM32) && defined(HAL_DAC_MODULE_ENABLED)
13namespace semf
14{
15Stm32AnalogOutDma::Stm32AnalogOutDma(DAC_HandleTypeDef& hwHandle, uint32_t channel, Alignment alignment)
16: m_hwHandle(hwHandle),
17 m_channel(channel),
18 m_alignment(alignment)
19{
20 queue()->push(*this);
21}
22
24{
25 SEMF_INFO("start");
26 if (m_data == nullptr || m_size == 0)
27 {
28 SEMF_ERROR("data is nullptr or size is zero");
29 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Start_DataInvalid)));
30 return;
31 }
32 HAL_StatusTypeDef state =
33 HAL_DAC_Start_DMA(&m_hwHandle, m_channel, reinterpret_cast<uint32_t*>(const_cast<uint8_t*>(m_data)), m_size / 4, alignment(m_alignment));
34 if (state != HAL_OK)
35 {
36 if (state == HAL_ERROR)
37 {
38 SEMF_ERROR("start hal error");
39 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Start_HalError)));
40 }
41 else if (state == HAL_BUSY)
42 {
43 SEMF_ERROR("start hal busy");
44 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Start_HalBusy)));
45 }
46 else if (state == HAL_TIMEOUT)
47 {
48 SEMF_ERROR("start hal timeout");
49 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Start_HalTimeout)));
50 }
51 return;
52 }
53}
54
56{
57 SEMF_INFO("stop");
58 HAL_StatusTypeDef state = HAL_DAC_Stop_DMA(&m_hwHandle, m_channel);
59 if (state != HAL_OK)
60 {
61 if (state == HAL_ERROR)
62 {
63 SEMF_ERROR("stop hal error");
64 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Stop_HalError)));
65 }
66 else if (state == HAL_BUSY)
67 {
68 SEMF_ERROR("stop hal busy");
69 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Stop_HalBusy)));
70 }
71 else if (state == HAL_TIMEOUT)
72 {
73 SEMF_ERROR("stop hal timeout");
74 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Stop_HalTimeout)));
75 }
76 return;
77 }
78}
79
80void Stm32AnalogOutDma::setData(const uint8_t data[], size_t dataSize)
81{
82 SEMF_INFO("set data on channel %u", m_channel);
83 m_data = data;
84 m_size = dataSize;
85}
86
88{
90 return &queue;
91}
92
93void Stm32AnalogOutDma::systemIsrError(DAC_HandleTypeDef& dac)
94{
95 for (Stm32AnalogOutDma& i : *(queue()))
96 i.isrError(dac);
97}
98
99void Stm32AnalogOutDma::systemIsr(DAC_HandleTypeDef& dac)
100{
101 for (Stm32AnalogOutDma& i : *(queue()))
102 i.isr(dac);
103}
104
105void Stm32AnalogOutDma::isrError(DAC_HandleTypeDef& dac)
106{
107 if (&dac == &m_hwHandle)
108 {
109 SEMF_ERROR("error");
110 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::IsrError_Isr)));
111 }
112}
113
114void Stm32AnalogOutDma::isr(DAC_HandleTypeDef& dac)
115{
116 if (&dac == &m_hwHandle)
117 {
118 SEMF_INFO("dataAvailable");
119 dataWritten();
120 }
121}
122
123uint32_t Stm32AnalogOutDma::alignment(Alignment setting) const
124{
125 switch (setting)
126 {
128 return DAC_ALIGN_8B_R;
129 break;
131 return DAC_ALIGN_12B_L;
132 break;
134 return DAC_ALIGN_12B_R;
135 break;
136 default:
137 SEMF_ERROR("invalid alignment setting %u", static_cast<uint8_t>(setting));
138 return 0;
139 }
140}
141} /* namespace semf */
142#endif /* STM32 & HAL_DAC_MODULE_ENABLED */
Signal< Error > error
Definition: analogoutdma.h:49
Class for representing errors. Every error should have a unique source code. As a user feel encourage...
Definition: error.h:22
LinkedQueue is an managed single linked queue implementation.
Definition: linkedqueue.h:38
static void systemIsr(DAC_HandleTypeDef &dac)
System-wide interrupt service routine for dac conversion finished.
Stm32AnalogOutDma(DAC_HandleTypeDef &hwHandle, uint32_t channel, Alignment alignment)
Constructor.
void isrError(DAC_HandleTypeDef &dac)
Sending a error signal.
void stop() const override
void setData(const uint8_t data[], size_t dataSize) override
Sets the pointer to the data memory location and its size for starting DAC later by start() function....
void isr(DAC_HandleTypeDef &dac)
Sending a error signal.
void start() const override
Starts the hardware module (DAC) for writing DAC values to the output. Call setValue before.
static LinkedQueue< Stm32AnalogOutDma > * queue()
Get the list with all analog outs.
static void systemIsrError(DAC_HandleTypeDef &dac)
System-wide interrupt service routine for dac error.
#define SEMF_ERROR(...)
Definition: debug.h:39
#define SEMF_INFO(...)
Definition: debug.h:41