Skip to content

Commit da278ac

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

File tree

13 files changed

+286
-1
lines changed

13 files changed

+286
-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: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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/STM32HalBasicTimer.h"
10+
11+
namespace leka {
12+
13+
class CoreSTM32HalBasicTimer : public interface::STM32HalBasicTimer
14+
{
15+
public:
16+
CoreSTM32HalBasicTimer(interface::STM32Hal &hal);
17+
18+
[[nodiscard]] auto getHandle() -> TIM_HandleTypeDef & final;
19+
20+
void registerCallback(std::function<void()> const &callback);
21+
22+
void initialize(uint32_t frequency) final;
23+
void terminate() final;
24+
25+
void start() final;
26+
void stop() final;
27+
28+
private:
29+
void _registerMspCallbacks();
30+
31+
interface::STM32Hal &_hal;
32+
33+
TIM_HandleTypeDef _htim {};
34+
35+
std::function<void()> _callback = [] {};
36+
};
37+
38+
} // namespace leka
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
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 initialize(uint32_t frequency) = 0;
19+
virtual void terminate() = 0;
20+
21+
virtual void start() = 0;
22+
virtual void stop() = 0;
23+
};
24+
25+
} // namespace leka::interface
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
// Leka - LekaOS
2+
// Copyright 2024 APF France handicap
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
#include "CoreSTM32HalBasicTimer.h"
6+
7+
using namespace leka;
8+
9+
CoreSTM32HalBasicTimer::CoreSTM32HalBasicTimer(interface::STM32Hal &hal) : _hal(hal)
10+
{
11+
_htim.Instance = TIM6; // TIM7 is also possible
12+
}
13+
14+
auto CoreSTM32HalBasicTimer::getHandle() -> TIM_HandleTypeDef &
15+
{
16+
return _htim;
17+
}
18+
19+
void CoreSTM32HalBasicTimer::registerCallback(std::function<void()> const &callback)
20+
{
21+
_callback = callback;
22+
}
23+
24+
void CoreSTM32HalBasicTimer::initialize(uint32_t frequency)
25+
{
26+
_registerMspCallbacks();
27+
28+
// CK_Timer = CK_Int / ((Prescaler + 1) * (Period + 1))
29+
auto divider = 54'000'000 / frequency;
30+
31+
_htim.Init.Prescaler = divider / 100;
32+
_htim.Init.Period = 100; // ? min 1
33+
_htim.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; // Disable shadow write
34+
// _htim.Init.CounterMode; // NOT AVAILABLE for BasicTimer
35+
// _htim.Init.ClockDivision; // NOT AVAILABLE for BasicTimer
36+
// _htim.Init.RepetitionCounter; // NOT AVAILABLE for BasicTimer
37+
_hal.HAL_TIM_Base_Init(&_htim);
38+
39+
auto timerMasterConfig = TIM_MasterConfigTypeDef {};
40+
timerMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; // Use hardware trigger
41+
// timerMasterConfig.MasterSlaveMode; // NOT AVAILABLE for BasicTimer
42+
_hal.HAL_TIMEx_MasterConfigSynchronization(&_htim, &timerMasterConfig);
43+
44+
static auto &self = *this;
45+
_hal.HAL_TIM_RegisterCallback(&_htim, HAL_TIM_PERIOD_ELAPSED_CB_ID,
46+
[](TIM_HandleTypeDef *htim) { self._callback(); });
47+
}
48+
49+
void CoreSTM32HalBasicTimer::_registerMspCallbacks()
50+
{
51+
static auto &self = *this;
52+
53+
_hal.HAL_TIM_RegisterCallback(&_htim, HAL_TIM_BASE_MSPINIT_CB_ID, [](TIM_HandleTypeDef *htim) {
54+
self._hal.HAL_RCC_TIM6_CLK_ENABLE();
55+
56+
self._hal.HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 0x00, 0x00);
57+
self._hal.HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
58+
});
59+
60+
_hal.HAL_TIM_RegisterCallback(&_htim, HAL_TIM_BASE_MSPDEINIT_CB_ID,
61+
[](TIM_HandleTypeDef *htim) { self._hal.HAL_RCC_TIM6_CLK_DISABLE(); });
62+
}
63+
64+
void CoreSTM32HalBasicTimer::terminate()
65+
{
66+
_hal.HAL_TIM_Base_DeInit(&_htim);
67+
}
68+
69+
void CoreSTM32HalBasicTimer::start()
70+
{
71+
_hal.HAL_TIM_Base_Start_IT(&_htim);
72+
}
73+
74+
void CoreSTM32HalBasicTimer::stop()
75+
{
76+
_hal.HAL_TIM_Base_Stop_IT(&_htim);
77+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#include "CoreSTM32HalBasicTimer.h"
2+
3+
extern "C" {
4+
5+
extern leka::CoreSTM32HalBasicTimer hal_timer;
6+
7+
void TIM6_DAC_IRQHandler()
8+
{
9+
HAL_TIM_IRQHandler(&hal_timer.getHandle());
10+
}
11+
12+
} // extern "C"
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Leka - LekaOS
2+
// Copyright 2024 APF France handicap
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
#pragma once
6+
7+
#include "gmock/gmock.h"
8+
#include "interface/STM32HalBasicTimer.h"
9+
10+
namespace leka::mock {
11+
12+
class STM32HalTimer : public interface::STM32HalBasicTimer
13+
{
14+
public:
15+
MOCK_METHOD(TIM_HandleTypeDef &, getHandle, (), (override));
16+
17+
MOCK_METHOD(void, initialize, (uint32_t), (override));
18+
MOCK_METHOD(void, terminate, (), (override));
19+
20+
MOCK_METHOD(void, start, (), (override));
21+
MOCK_METHOD(void, stop, (), (override));
22+
};
23+
24+
} // namespace leka::mock

drivers/CoreSTM32Hal/include/CoreSTM32Hal.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ 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+
2528
void HAL_RCC_FMC_CLK_ENABLE() final;
2629

2730
void HAL_RCC_DMA2_CLK_ENABLE() final;
@@ -104,6 +107,15 @@ class CoreSTM32Hal : public interface::STM32Hal
104107

105108
auto HAL_JPEG_Pause(JPEG_HandleTypeDef *hjpeg, uint32_t XferSelection) -> HAL_StatusTypeDef final;
106109
auto HAL_JPEG_Resume(JPEG_HandleTypeDef *hjpeg, uint32_t XferSelection) -> HAL_StatusTypeDef final;
110+
111+
auto HAL_TIM_Base_Init(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef final;
112+
auto HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, TIM_MasterConfigTypeDef *sMasterConfig)
113+
-> HAL_StatusTypeDef final;
114+
auto HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID,
115+
pTIM_CallbackTypeDef pCallback) -> HAL_StatusTypeDef final;
116+
auto HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef final;
117+
auto HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef final;
118+
auto HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef final;
107119
};
108120

109121
} // namespace leka

drivers/CoreSTM32Hal/source/CoreSTM32Hal.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,16 @@ 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+
4454
void CoreSTM32Hal::HAL_RCC_FMC_CLK_ENABLE()
4555
{
4656
__HAL_RCC_FMC_CLK_ENABLE(); // NOLINT
@@ -311,4 +321,36 @@ auto CoreSTM32Hal::HAL_JPEG_Resume(JPEG_HandleTypeDef *hjpeg, uint32_t XferSelec
311321
return ::HAL_JPEG_Resume(hjpeg, XferSelection);
312322
}
313323

324+
auto CoreSTM32Hal::HAL_TIM_Base_Init(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef
325+
{
326+
return ::HAL_TIM_Base_Init(htim);
327+
}
328+
329+
auto CoreSTM32Hal::HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim,
330+
TIM_MasterConfigTypeDef *sMasterConfig) -> HAL_StatusTypeDef
331+
{
332+
return ::HAL_TIMEx_MasterConfigSynchronization(htim, sMasterConfig);
333+
}
334+
335+
auto CoreSTM32Hal::HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID,
336+
pTIM_CallbackTypeDef pCallback) -> HAL_StatusTypeDef
337+
{
338+
return ::HAL_TIM_RegisterCallback(htim, CallbackID, pCallback);
339+
}
340+
341+
auto CoreSTM32Hal::HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef
342+
{
343+
return ::HAL_TIM_Base_Start_IT(htim);
344+
}
345+
346+
auto CoreSTM32Hal::HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef
347+
{
348+
return ::HAL_TIM_Base_Stop_IT(htim);
349+
}
350+
351+
auto CoreSTM32Hal::HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef
352+
{
353+
return ::HAL_TIM_Base_DeInit(htim);
354+
}
355+
314356
} // namespace leka

include/interface/drivers/STM32Hal.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ 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+
2427
virtual void HAL_RCC_FMC_CLK_ENABLE() = 0;
2528

2629
virtual void HAL_RCC_DMA2_CLK_ENABLE() = 0;
@@ -106,6 +109,15 @@ class STM32Hal
106109

107110
virtual auto HAL_JPEG_Pause(JPEG_HandleTypeDef *hjpeg, uint32_t XferSelection) -> HAL_StatusTypeDef = 0;
108111
virtual auto HAL_JPEG_Resume(JPEG_HandleTypeDef *hjpeg, uint32_t XferSelection) -> HAL_StatusTypeDef = 0;
112+
113+
virtual auto HAL_TIM_Base_Init(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef = 0;
114+
virtual auto HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, TIM_MasterConfigTypeDef *sMasterConfig)
115+
-> HAL_StatusTypeDef = 0;
116+
virtual auto HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID,
117+
pTIM_CallbackTypeDef pCallback) -> HAL_StatusTypeDef = 0;
118+
virtual auto HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef = 0;
119+
virtual auto HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef = 0;
120+
virtual auto HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim) -> HAL_StatusTypeDef = 0;
109121
};
110122

111123
} // 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: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ 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));
2324
MOCK_METHOD(void, HAL_RCC_FMC_CLK_ENABLE, (), (override));
2425
MOCK_METHOD(void, HAL_RCC_DMA2_CLK_ENABLE, (), (override));
2526
MOCK_METHOD(void, HAL_RCC_JPEG_CLK_ENABLE, (), (override));
@@ -113,6 +114,15 @@ class CoreSTM32Hal : public interface::STM32Hal
113114

114115
MOCK_METHOD(HAL_StatusTypeDef, HAL_JPEG_Pause, (JPEG_HandleTypeDef *, uint32_t), (override));
115116
MOCK_METHOD(HAL_StatusTypeDef, HAL_JPEG_Resume, (JPEG_HandleTypeDef *, uint32_t), (override));
117+
MOCK_METHOD(HAL_StatusTypeDef, HAL_TIM_Base_Init, (TIM_HandleTypeDef * htim), (override));
118+
MOCK_METHOD(HAL_StatusTypeDef, HAL_TIMEx_MasterConfigSynchronization,
119+
(TIM_HandleTypeDef * htim, TIM_MasterConfigTypeDef *sMasterConfig), (override));
120+
MOCK_METHOD(HAL_StatusTypeDef, HAL_TIM_RegisterCallback,
121+
(TIM_HandleTypeDef * htim, HAL_TIM_CallbackIDTypeDef CallbackID, pTIM_CallbackTypeDef pCallback),
122+
(override));
123+
MOCK_METHOD(HAL_StatusTypeDef, HAL_TIM_Base_Start_IT, (TIM_HandleTypeDef * htim), (override));
124+
MOCK_METHOD(HAL_StatusTypeDef, HAL_TIM_Base_Stop_IT, (TIM_HandleTypeDef * htim), (override));
125+
MOCK_METHOD(HAL_StatusTypeDef, HAL_TIM_Base_DeInit, (TIM_HandleTypeDef * htim), (override));
116126
};
117127

118128
} // namespace leka::mock

0 commit comments

Comments
 (0)