libxr
Embedded C++ framework for bare-metal, RTOS and Linux
Loading...
Searching...
No Matches
stm32_adc_gpdma.hpp
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5
6#include "main.h"
7
8#if defined(STM32H5) && defined(HAL_ADC_MODULE_ENABLED) && defined(HAL_DMA_MODULE_ENABLED)
9#if !defined(DMA_LINKEDLIST_CIRCULAR) || !defined(DMA_GPDMA_LINEAR_NODE)
10#error "STM32H5 ADC requires the HAL GPDMA linked-list API"
11#endif
12#define LIBXR_STM32_ADC_GPDMA 1
13#endif
14
15#if defined(LIBXR_STM32_ADC_GPDMA) || defined(__DOXYGEN__)
16namespace LibXR
17{
30{
31 public:
32 STM32GpdmaAdcAdapter() = default;
33
43 HAL_StatusTypeDef Start(ADC_HandleTypeDef* adc_handle, uint32_t* buffer,
44 uint32_t sample_count, size_t buffer_size);
45
52 HAL_StatusTypeDef Stop(ADC_HandleTypeDef* adc_handle);
53
54 private:
55 // DMA 读取的节点寄存器按 32 字节对齐,避免跨越链表地址窗口。
56 // Align the DMA node registers to 32 bytes to avoid crossing the list address window.
57 struct alignas(32) StateBlock
58 {
59 DMA_NodeTypeDef node{};
60 DMA_QListTypeDef queue{};
61 DMA_QListTypeDef* original_queue = nullptr;
62 };
63 static_assert(offsetof(StateBlock, node) == 0U);
64
65 void BuildAndAttach(ADC_HandleTypeDef* adc_handle, uint32_t* buffer,
66 uint32_t sample_count, size_t buffer_size);
67 static void FinalizeStopped(DMA_HandleTypeDef* dma_handle);
68 StateBlock state_{};
69};
70} // namespace LibXR
71#endif
STM32 ADC 循环采样的 GPDMA 适配器 / GPDMA adapter for circular STM32 ADC sampling.
HAL_StatusTypeDef Start(ADC_HandleTypeDef *adc_handle, uint32_t *buffer, uint32_t sample_count, size_t buffer_size)
挂接循环链表并启动 ADC DMA / Attach the circular list and start ADC DMA.
HAL_StatusTypeDef Stop(ADC_HandleTypeDef *adc_handle)
停止 ADC DMA 并恢复 BSP 链表 / Stop ADC DMA and restore the BSP list.
LibXR 命名空间 / LibXR namespace.
Definition ch32_can.hpp:14