Skip to content

Commit c0f497f

Browse files
YannLocatelliAermanioSamHadjes
committed
✨ (dac): Add CoreSTM32HalBasicTimer
Co-Authored-By: Maxime Blanc <[email protected]> Co-Authored-By: SamHadjes <[email protected]>
1 parent 9da3fb3 commit c0f497f

File tree

13 files changed

+326
-1
lines changed

13 files changed

+326
-1
lines changed

config/mbed_app.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
"USE_HAL_JPEG_REGISTER_CALLBACKS": {
55
"macro_name": "USE_HAL_JPEG_REGISTER_CALLBACKS",
66
"value": "1U"
7+
},
8+
"USE_HAL_TIM_REGISTER_CALLBACKS": {
9+
"macro_name": "USE_HAL_TIM_REGISTER_CALLBACKS",
10+
"value": "1U"
711
}
812
},
913
"target_overrides": {

drivers/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
add_subdirectory(${DRIVERS_DIR}/CoreBufferedSerial)
77
add_subdirectory(${DRIVERS_DIR}/CoreEventFlags)
88
add_subdirectory(${DRIVERS_DIR}/CoreEventQueue)
9+
add_subdirectory(${DRIVERS_DIR}/CoreDAC)
910
add_subdirectory(${DRIVERS_DIR}/CoreI2C)
1011
add_subdirectory(${DRIVERS_DIR}/CoreInterruptIn)
1112
add_subdirectory(${DRIVERS_DIR}/CoreLL)

drivers/CoreDAC/CMakeLists.txt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Leka - LekaOS
2+
# Copyright 2024 APF France handicap
3+
# SPDX-License-Identifier: Apache-2.0
4+
5+
add_library(CoreDAC STATIC)
6+
7+
target_include_directories(CoreDAC
8+
PUBLIC
9+
include
10+
)
11+
12+
target_sources(CoreDAC
13+
PRIVATE
14+
source/CoreSTM32HalBasicTimer.cpp
15+
)
16+
17+
if(NOT(${CMAKE_PROJECT_NAME} STREQUAL "LekaOSUnitTests"))
18+
target_sources(CoreDAC
19+
PUBLIC
20+
source/HAL_IRQHandlers.cpp
21+
)
22+
endif()
23+
24+
target_link_libraries(CoreDAC
25+
mbed-os
26+
CoreSTM32Hal
27+
)
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Leka - LekaOS
2+
// Copyright 2024 APF France handicap
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
#pragma once
6+
7+
#include <functional>
8+
9+
#include "interface/drivers/STM32HalBasicTimer.h"
10+
11+
namespace leka {
12+
13+
class CoreSTM32HalBasicTimer : public interface::STM32HalBasicTimer
14+
{
15+
static constexpr float DEFAULT_AUDIO_FILE_SAMPLE_RATE = 44'100;
16+
17+
public:
18+
CoreSTM32HalBasicTimer(interface::STM32Hal &hal);
19+
20+
[[nodiscard]] auto getHandle() -> TIM_HandleTypeDef & final;
21+
22+
void registerCallback(std::function<void()> const &callback);
23+
void linkDACTimer(DAC_ChannelConfTypeDef *config) final;
24+
25+
void initialize(float frequency = DEFAULT_AUDIO_FILE_SAMPLE_RATE) final;
26+
void terminate() final;
27+
28+
void start() final;
29+
void stop() final;
30+
31+
private:
32+
void _registerMspCallbacks();
33+
34+
interface::STM32Hal &_hal;
35+
36+
TIM_HandleTypeDef _htim {};
37+
38+
std::function<void()> _callback {};
39+
};
40+
41+
} // namespace leka
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
// Leka - LekaOS
2+
// Copyright 2024 APF France handicap
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
#include "CoreSTM32HalBasicTimer.h"
6+
#include <cmath>
7+
8+
using namespace leka;
9+
10+
CoreSTM32HalBasicTimer::CoreSTM32HalBasicTimer(interface::STM32Hal &hal) : _hal(hal)
11+
{
12+
_htim.Instance = TIM6;
13+
}
14+
15+
auto CoreSTM32HalBasicTimer::getHandle() -> TIM_HandleTypeDef &
16+
{
17+
return _htim;
18+
}
19+
20+
void CoreSTM32HalBasicTimer::registerCallback(std::function<void()> const &callback)
21+
{
22+
_callback = callback;
23+
}
24+
25+
void CoreSTM32HalBasicTimer::initialize(float frequency)
26+
{
27+
_registerMspCallbacks();
28+
29+
// CK_Timer = CK_INT / ((Prescaler + 1) * (Period + 1))
30+
const auto CK_INT = float {108'000'000.0};
31+
auto divider = static_cast<int>(std::round(CK_INT / frequency));
32+
33+
_htim.Init.Prescaler = 0;
34+
_htim.Init.Period = divider - 1; // ? min 1
35+
_htim.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
36+
_hal.HAL_TIM_Base_Init(&_htim);
37+
38+
auto timerMasterConfig = TIM_MasterConfigTypeDef {};
39+
timerMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
40+
_hal.HAL_TIMEx_MasterConfigSynchronization(&_htim, &timerMasterConfig);
41+
42+
static const auto &self = *this;
43+
_hal.HAL_TIM_RegisterCallback(&_htim, HAL_TIM_PERIOD_ELAPSED_CB_ID, []([[maybe_unused]] TIM_HandleTypeDef *htim) {
44+
if (self._callback != nullptr) {
45+
self._callback();
46+
}
47+
});
48+
}
49+
50+
void CoreSTM32HalBasicTimer::_registerMspCallbacks()
51+
{
52+
static const auto &self = *this;
53+
54+
_hal.HAL_TIM_RegisterCallback(&_htim, HAL_TIM_BASE_MSPINIT_CB_ID, []([[maybe_unused]] TIM_HandleTypeDef *htim) {
55+
self._hal.HAL_RCC_TIM6_CLK_ENABLE();
56+
57+
self._hal.HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 0x00, 0x00);
58+
self._hal.HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
59+
});
60+
61+
_hal.HAL_TIM_RegisterCallback(&_htim, HAL_TIM_BASE_MSPDEINIT_CB_ID, []([[maybe_unused]] TIM_HandleTypeDef *htim) {
62+
self._hal.HAL_RCC_TIM6_CLK_DISABLE();
63+
});
64+
}
65+
66+
void CoreSTM32HalBasicTimer::linkDACTimer(DAC_ChannelConfTypeDef *config)
67+
{
68+
if (config != nullptr) {
69+
config->DAC_Trigger = DAC_TRIGGER_T6_TRGO;
70+
}
71+
}
72+
73+
void CoreSTM32HalBasicTimer::terminate()
74+
{
75+
_hal.HAL_TIM_Base_DeInit(&_htim);
76+
}
77+
78+
void CoreSTM32HalBasicTimer::start()
79+
{
80+
_hal.HAL_TIM_Base_Start_IT(&_htim);
81+
}
82+
83+
void CoreSTM32HalBasicTimer::stop()
84+
{
85+
_hal.HAL_TIM_Base_Stop_IT(&_htim);
86+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#include "CoreSTM32HalBasicTimer.h"
2+
3+
extern "C" {
4+
5+
namespace audio::internal {
6+
extern leka::CoreSTM32HalBasicTimer hal_timer;
7+
}
8+
9+
void TIM6_DAC_IRQHandler()
10+
{
11+
HAL_TIM_IRQHandler(&audio::internal::hal_timer.getHandle());
12+
}
13+
14+
void TIM7_DAC_IRQHandler()
15+
{
16+
HAL_TIM_IRQHandler(&audio::internal::hal_timer.getHandle());
17+
}
18+
19+
} // extern "C"

drivers/CoreSTM32Hal/include/CoreSTM32Hal.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ class CoreSTM32Hal : public interface::STM32Hal
2222
void HAL_RCC_GPIOI_CLK_ENABLE() final;
2323
void HAL_RCC_GPIOJ_CLK_ENABLE() final;
2424

25+
void HAL_RCC_TIM6_CLK_ENABLE() final;
26+
void HAL_RCC_TIM6_CLK_DISABLE() final;
27+
void HAL_RCC_TIM7_CLK_ENABLE() final;
28+
void HAL_RCC_TIM7_CLK_DISABLE() final;
29+
2530
void HAL_RCC_FMC_CLK_ENABLE() final;
2631

2732
void HAL_RCC_DMA2_CLK_ENABLE() final;
@@ -104,6 +109,15 @@ class CoreSTM32Hal : public interface::STM32Hal
104109

105110
auto HAL_JPEG_Pause(JPEG_HandleTypeDef *hjpeg, uint32_t XferSelection) -> HAL_StatusTypeDef final;
106111
auto HAL_JPEG_Resume(JPEG_HandleTypeDef *hjpeg, uint32_t XferSelection) -> HAL_StatusTypeDef final;
112+
113+
auto HAL_TIM_Base_Init(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef final;
114+
auto HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, TIM_MasterConfigTypeDef *sMasterConfig)
115+
-> HAL_StatusTypeDef final;
116+
auto HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID,
117+
pTIM_CallbackTypeDef pCallback) -> HAL_StatusTypeDef final;
118+
auto HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef final;
119+
auto HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef final;
120+
auto HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef final;
107121
};
108122

109123
} // namespace leka

drivers/CoreSTM32Hal/source/CoreSTM32Hal.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,26 @@ void CoreSTM32Hal::HAL_RCC_GPIOJ_CLK_ENABLE()
4141
__HAL_RCC_GPIOJ_CLK_ENABLE(); // NOLINT
4242
}
4343

44+
void CoreSTM32Hal::HAL_RCC_TIM6_CLK_ENABLE()
45+
{
46+
__HAL_RCC_TIM6_CLK_ENABLE(); // NOLINT
47+
}
48+
49+
void CoreSTM32Hal::HAL_RCC_TIM6_CLK_DISABLE()
50+
{
51+
__HAL_RCC_TIM6_CLK_DISABLE(); // NOLINT
52+
}
53+
54+
void CoreSTM32Hal::HAL_RCC_TIM7_CLK_ENABLE()
55+
{
56+
__HAL_RCC_TIM7_CLK_ENABLE(); // NOLINT
57+
}
58+
59+
void CoreSTM32Hal::HAL_RCC_TIM7_CLK_DISABLE()
60+
{
61+
__HAL_RCC_TIM7_CLK_DISABLE(); // NOLINT
62+
}
63+
4464
void CoreSTM32Hal::HAL_RCC_FMC_CLK_ENABLE()
4565
{
4666
__HAL_RCC_FMC_CLK_ENABLE(); // NOLINT
@@ -311,4 +331,36 @@ auto CoreSTM32Hal::HAL_JPEG_Resume(JPEG_HandleTypeDef *hjpeg, uint32_t XferSelec
311331
return ::HAL_JPEG_Resume(hjpeg, XferSelection);
312332
}
313333

334+
auto CoreSTM32Hal::HAL_TIM_Base_Init(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef
335+
{
336+
return ::HAL_TIM_Base_Init(htim);
337+
}
338+
339+
auto CoreSTM32Hal::HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim,
340+
TIM_MasterConfigTypeDef *sMasterConfig) -> HAL_StatusTypeDef
341+
{
342+
return ::HAL_TIMEx_MasterConfigSynchronization(htim, sMasterConfig);
343+
}
344+
345+
auto CoreSTM32Hal::HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID,
346+
pTIM_CallbackTypeDef pCallback) -> HAL_StatusTypeDef
347+
{
348+
return ::HAL_TIM_RegisterCallback(htim, CallbackID, pCallback);
349+
}
350+
351+
auto CoreSTM32Hal::HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef
352+
{
353+
return ::HAL_TIM_Base_Start_IT(htim);
354+
}
355+
356+
auto CoreSTM32Hal::HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef
357+
{
358+
return ::HAL_TIM_Base_Stop_IT(htim);
359+
}
360+
361+
auto CoreSTM32Hal::HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef
362+
{
363+
return ::HAL_TIM_Base_DeInit(htim);
364+
}
365+
314366
} // namespace leka

include/interface/drivers/STM32Hal.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ class STM32Hal
2121
virtual void HAL_RCC_GPIOI_CLK_ENABLE() = 0;
2222
virtual void HAL_RCC_GPIOJ_CLK_ENABLE() = 0;
2323

24+
virtual void HAL_RCC_TIM6_CLK_ENABLE() = 0;
25+
virtual void HAL_RCC_TIM6_CLK_DISABLE() = 0;
26+
27+
virtual void HAL_RCC_TIM7_CLK_ENABLE() = 0;
28+
virtual void HAL_RCC_TIM7_CLK_DISABLE() = 0;
29+
2430
virtual void HAL_RCC_FMC_CLK_ENABLE() = 0;
2531

2632
virtual void HAL_RCC_DMA2_CLK_ENABLE() = 0;
@@ -106,6 +112,15 @@ class STM32Hal
106112

107113
virtual auto HAL_JPEG_Pause(JPEG_HandleTypeDef *hjpeg, uint32_t XferSelection) -> HAL_StatusTypeDef = 0;
108114
virtual auto HAL_JPEG_Resume(JPEG_HandleTypeDef *hjpeg, uint32_t XferSelection) -> HAL_StatusTypeDef = 0;
115+
116+
virtual auto HAL_TIM_Base_Init(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef = 0;
117+
virtual auto HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, TIM_MasterConfigTypeDef *sMasterConfig)
118+
-> HAL_StatusTypeDef = 0;
119+
virtual auto HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID,
120+
pTIM_CallbackTypeDef pCallback) -> HAL_StatusTypeDef = 0;
121+
virtual auto HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef = 0;
122+
virtual auto HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef = 0;
123+
virtual auto HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef = 0;
109124
};
110125

111126
} // namespace leka::interface
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Leka - LekaOS
2+
// Copyright 2024 APF France handicap
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
#pragma once
6+
7+
#include "interface/drivers/STM32Hal.h"
8+
9+
namespace leka::interface {
10+
11+
class STM32HalBasicTimer
12+
{
13+
public:
14+
virtual ~STM32HalBasicTimer() = default;
15+
16+
[[nodiscard]] virtual auto getHandle() -> TIM_HandleTypeDef & = 0;
17+
18+
virtual void linkDACTimer(DAC_ChannelConfTypeDef *config) = 0;
19+
20+
virtual void initialize(float frequency) = 0;
21+
virtual void terminate() = 0;
22+
23+
virtual void start() = 0;
24+
virtual void stop() = 0;
25+
};
26+
27+
} // namespace leka::interface

tests/unit/headers/mbed/mbed_config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@
288288
#define SMP_DB_MAX_DEVICES 3 // set by library:cordio
289289
#define TARGET_LSE_DRIVE_LOAD_LEVEL RCC_LSEDRIVE_LOW // set by target:MCU_STM32F7
290290
#define USE_HAL_JPEG_REGISTER_CALLBACKS 1U // set by application
291+
#define USE_HAL_TIM_REGISTER_CALLBACKS 1U // set by application
291292
// Macros
292293
#define WSF_MS_PER_TICK 1 // defined by library:cordio
293294
#define _RTE_ // defined by library:rtos

tests/unit/mocks/mocks/leka/CoreSTM32Hal.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ class CoreSTM32Hal : public interface::STM32Hal
1919
MOCK_METHOD(void, HAL_RCC_GPIOH_CLK_ENABLE, (), (override));
2020
MOCK_METHOD(void, HAL_RCC_GPIOI_CLK_ENABLE, (), (override));
2121
MOCK_METHOD(void, HAL_RCC_GPIOJ_CLK_ENABLE, (), (override));
22-
22+
MOCK_METHOD(void, HAL_RCC_TIM6_CLK_ENABLE, (), (override));
23+
MOCK_METHOD(void, HAL_RCC_TIM6_CLK_DISABLE, (), (override));
24+
MOCK_METHOD(void, HAL_RCC_TIM7_CLK_ENABLE, (), (override));
25+
MOCK_METHOD(void, HAL_RCC_TIM7_CLK_DISABLE, (), (override));
2326
MOCK_METHOD(void, HAL_RCC_FMC_CLK_ENABLE, (), (override));
2427
MOCK_METHOD(void, HAL_RCC_DMA2_CLK_ENABLE, (), (override));
2528
MOCK_METHOD(void, HAL_RCC_JPEG_CLK_ENABLE, (), (override));
@@ -113,6 +116,15 @@ class CoreSTM32Hal : public interface::STM32Hal
113116

114117
MOCK_METHOD(HAL_StatusTypeDef, HAL_JPEG_Pause, (JPEG_HandleTypeDef *, uint32_t), (override));
115118
MOCK_METHOD(HAL_StatusTypeDef, HAL_JPEG_Resume, (JPEG_HandleTypeDef *, uint32_t), (override));
119+
MOCK_METHOD(HAL_StatusTypeDef, HAL_TIM_Base_Init, (TIM_HandleTypeDef * htim), (override));
120+
MOCK_METHOD(HAL_StatusTypeDef, HAL_TIMEx_MasterConfigSynchronization,
121+
(TIM_HandleTypeDef * htim, TIM_MasterConfigTypeDef *sMasterConfig), (override));
122+
MOCK_METHOD(HAL_StatusTypeDef, HAL_TIM_RegisterCallback,
123+
(TIM_HandleTypeDef * htim, HAL_TIM_CallbackIDTypeDef CallbackID, pTIM_CallbackTypeDef pCallback),
124+
(override));
125+
MOCK_METHOD(HAL_StatusTypeDef, HAL_TIM_Base_Start_IT, (TIM_HandleTypeDef * htim), (override));
126+
MOCK_METHOD(HAL_StatusTypeDef, HAL_TIM_Base_Stop_IT, (TIM_HandleTypeDef * htim), (override));
127+
MOCK_METHOD(HAL_StatusTypeDef, HAL_TIM_Base_DeInit, (TIM_HandleTypeDef * htim), (override));
116128
};
117129

118130
} // namespace leka::mock

0 commit comments

Comments
 (0)