Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2743
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

Управление DMA

263

9.2.8. Разнообразные функции модулей HAL_DMA и HAL_DMA_Ex

Модуль HAL_DMA предоставляет другие функции, которые помогают использовать контроллер DMA. Давайте вкратце рассмотрим их.

HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma);

Эта функция отключает поток/канал DMA. Если поток отключается во время передачи данных, текущие данные будут переданы, и поток будет эффективно отключен только после завершения передачи этого одиночного пакета данных.

Некоторые микроконтроллеры STM32 могут выполнять многобуферные передачи DMA, которые позволяют использовать два отдельных буфера во время процесса передачи: DMA автоматически «перепрыгнет» из первого буфера (с именем memory0) во второй (с именем memory1) по достижении конца первым. Это особенно полезно, когда DMA работает в циклическом режиме. Функция:

HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart(DMA_HandleTypeDef *hdma, uint32_t SrcAdd\ ress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength);

используется для конфигурации многобуферной передачи DMA. Доступна только в HAL F2/F4/F7. Также доступна соответствующая HAL_DMAEx_MultiBufferStart_IT(), которая также заботится о разрешении прерываний DMA.

Функция

HAL_StatusTypeDef HAL_DMAEx_ChangeMemory(DMA_HandleTypeDef *hdma, uint32_t Address, HAL_DMA_MemoryTypeDef memory);

изменяет адрес memory0 или memory1 на лету в многобуферной транзакции через DMA.

Различия между модулями HAL_PPP и HAL_PPP_Ex

До этого мы сталкивались с несколькими модулями HAL, каждый из которых охватывает одну функцию конкретной периферии или функцию ядра. Каждый модуль HAL содержится в файле с именем stm32XXxx_hal_ppp.{c,h}, где «XX» означает семейство STM32, а «ppp» – тип периферии. Например, файл stm32f4xx_hal_dma.c содержит все определения общих функций для модуля HAL_DMA, посвященного DMA.

Тем не менее, некоторые периферийные функции специфичны для конкретного семейства и не могут быть обобщены в общем виде, характерном для всего ассортимента STM32. В этом случае HAL предоставляет модуль расширения с именем HAL_PPP_EX и реализуется в файле с именем stm32XXxx_hal_ppp_ex.{c,h}. Например,

предыдущая функция HAL_DMAEx_MultiBufferStart() определена в модуле HAL_DMA_Ex,

реализованном в файле stm32f4xx_hal_dma_ex.c.

Реализация API-интерфейса в модуле расширения является специфической для соответствующей серии STM32 или даже для конкретного номера устройства по каталогу (part number, P/N) в этой серии, и использование данных API приводит к менее переносимому коду между несколькими микроконтроллерами STM32.