Программирование ARM STM32F4xx: цифро-аналоговый преобразователь (ЦАП) Thu, March 28 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

STM32F4xx: цифро-аналоговый преобразователь (ЦАП) Печать
Добавил(а) microsin   

Модуль DAC это 12-разрядный цифро-аналоговый преобразователь, ЦАП (digital-to-analog converter, DAC). DAC можно сконфигурировать в 8- или 12-битном режиме, и совместно с контроллером DMA. В 12-битном режима данные могут быть выровнены влево или вправо. У DAC есть два выходных канала, у каждого свой собственный преобразователь. В двухканальном режиме преобразования могут быть независимые или одновременные, когда оба канала группируются друг с другом для операций синхронного обновления. Доступен вход опорного напряжения VREF+ (используется совместно с ADC), что может использоваться для получения повышенной разрешающей способности.

Примечание: приведенная здесь информация относится к микроконтроллерам STM32F4xx, если специально не указано что-то другое (перевод раздела 14 "Digital-to-analog converter" документации [1]).

Основные возможности DAC:

• 2 выходных канала
• В 12-битном режиме данные могут быть выровнены влево или вправо
• Возможность синхронного обновления
• Генерация сигнала шума
• Генерация треугольного сигнала
• 2 канала DAC, могут работать независимо или одновременно
• Возможность DMA для каждого канала
• Детектирование ошибки недогрузки DMA (DMA underrun)
• Внешние триггеры для запуска преобразования
• Вход опорного напряжения VREF+

Рис. 64 показывает блок-схему канала DAC, и в таблице 74 приведено описание выводов.

STM32F4xx DAC channel block diagram fig64

Рис. 64. Блок схема канала DAC.

Таблица 74. Ножки DAC.

Имя Тип сигнала Примечание
VREF+ Вход, аналоговое положительное опорное напряжение. Положительное опорное напряжение DAC, определяющее самое высокое аналоговое выходное напряжение преобразования. Пределы напряжения 1.8V ≤ VREF+ ≤ VDDA.
VDDA Вход, плюс аналогового питания.  
VSSA Вход, аналоговая земля и минус питания.  
DAC_OUTx Аналоговый выходной сигнал. Выход канала x DAC (x = 1 или 2).

Примечание: как только канал x DAC разрешен, соответствующая ножка GPIO (PA4 или PA5) автоматически подключается к выходу аналогового преобразователя (DAC_OUTx, x = 1 или 2). Чтобы избежать паразитного потребления, сначала вывод PA4 или PA5 должен быть сконфигурирован на аналоговую функцию (AIN).

[Функциональное описание DAC]

Разрешение канала. На каждый канал DAC может быть подано питание установкой соответствующего бита ENx в регистре DAC_CR. После этого канал DAC будет разрешен по истечении задержки времени запуска (startup time tWAKEUP).

Примечание: бит ENx разрешает только макроячейку analog DAC канала x. Сам цифровой интерфейс канала x DAC разрешается, даже если бит ENx сброшен.

Разрешение выходного буфера. В DAC интегрировано 2 выходных буфера, которые могут использоваться для уменьшения выходного сопротивления и управления внешней нагрузкой напрямую, без добавления внешнего операционного усилителя. Каждый выходной буфер канала DAC может быть разрешен или запрещен с помощью соответствующего бита BOFFx в регистре DAC_CR.

Формат данных. В зависимости от выбранного режима, данные для преобразования записываются в регистр, как описано ниже.

• С одним каналом x (x = 1 или 2) DAC есть три возможности:

   – 8-битное выравнивание вправо: программа должна загружать данные в биты DAC_DHR8Rx [7:0] (сохраняются в биты DHRx[11:4]).
   – 12-битное выравнивание влево: программа должна загружать данные в биты DAC_DHR12Lx [15:4] (сохраняются в биты DHRx[11:0]).
   – 12-битное выравнивание враво: программа должна загружать данные в биты DAC_DHR12Rx [11:0] (сохраняются в биты DHRx[11:0]).

В зависимости от загруженного регистра DAC_DHRyyyx, данные, записанные пользователем, сдвигаются и сохраняются в соответствующем DHRx (data holding register x, регистре хранения данных). Эти DHRx являются внутренними, не отображаемыми на адресное пространство регистрами. Затем регистр DHRx загружается в регистр DORx либо автоматически, либо программным триггером, либо по событию внешнего триггера.

STM32F4xx DAC Data registers in single DAC channel mode fig65

Рис. 65. Регистры данных в одноканальном режиме DAC.

• С двумя каналами DAC есть три возможности:

   – 8-битное выравнивание вправо: данные для канала 1 DAC загружаются в биты DAC_DHR8RD [7:0] (сохраняются в битах DHR1[11:4]), и данные канала 2 DAC загружаются в DAC_DHR8RD [15:8] (сохраняются в битах DHR2[11:4]).
   – 12-битное выравнивание влево: данные для канала 1 DAC загружаются в биты DAC_DHR12LD [15:4] (сохраняются в битах DHR1[11:0]) и данные для канала 2 DAC загружаются в биты DAC_DHR12LD [31:20] (сохраняются в битах DHR2[11:0]).
   – 12-битное выравнивание вправо: данные для канала 1 DAC загружаются в биты DAC_DHR12RD [11:0] (сохраняются в битах DHR1[11:0]) и данные для канала 2 DAC загружаются в биты DAC_DHR12LD [27:16] (сохраняются в битах DHR2[11:0]).

В зависимости от загруженного регистра DAC_DHRyyyD, данные, записанные пользователем, сдвигаются и сохраняются в DHR1 и DHR2 (data holding registers, регистры хранения данных). Эти регистры являются внутренними, не отображаемыми на адресное пространство регистрами. Регистры DHR1 и DHR2 затем загружаются соответственно в регистры DOR1 и DOR2, либо автоматически, либо программным триггером, либо по событию внешнего триггера.

STM32F4xx DAC Data registers in dual DAC channel mode fig66

Рис. 66. Регистры данных в двухканальном режиме DAC.

Преобразование DAC. DAC_DORx не могут быть записаны напрямую, и любая передача данных в канал x DAC должна выполняться загрузкой регистра DAC_DHRx (запись в DAC_DHR8Rx, DAC_DHR12Lx, DAC_DHR12Rx, DAC_DHR8RD, DAC_DHR12LD или DAC_DHR12LD).

Данные, сохраненные в регистр DAC_DHRx, автоматически передаются в регистр DAC_DORx после одного такта APB1, если не был выбран аппаратный триггер (сброшен бит TENx в регистре DAC_CR). Однако когда выбран аппаратный триггер (установлен бит TENx в регистре DAC_CR), и он сработал, передача выполняется на 3 такта APB1 позже.

Когда DAC_DORx загружен содержимым DAC_DHRx, аналоговое напряжение появляется на выходе после времени tSETTLING, которое зависит от напряжения источника питания и нагрузки аналогового выхода.

STM32F4xx DAC timing for conversion trigger disabledTEN 0 fig67

Рис. 67. Диаграмма времени для преобразования с запрещенным триггером, TENx = 0.

Выходное напряжение DAC. Цифровые входные данные преобразуются в выходные напряжения линейно, с уровнями между 0 и VREF+. Аналоговые выходные напряжения на каждой ножке канала DAC определяется следующим выражением:

                    DOR
DACoutput = VREF x ------
                    4096

Выбор триггера DAC. Если бит управления TENx установлен, преобразование может запуститься внешним триггером (от счетчика таймера, внешней линии прерывания). Биты управления TSELx[2:0] определяют, какое из 8 возможных событий вызовет преобразование, что показано в таблице 75.

Таблица 75. Внешние триггеры.

Источник Тип TSEL[2:0]
Timer 6 TRGO event Внутренний сигнал от встроенных таймеров. 000
Timer 8 TRGO event 001
Timer 7 TRGO event 010
Timer 5 TRGO event 011
Timer 2 TRGO event 100
Timer 4 TRGO event 101
EXTI line9 Внешний сигнал, подаваемый на ножку корпуса. 110
SWTRIG Бит, управляемый программой (программный триггер SW). 111

Каждый раз, когда интерфейс DAC детектирует фронт нарастания уровня на выходе TRGO выбранного таймера, или на выбранной линии внешнего прерывания 9, последние сохраненные данные в регистре DAC_DHRx передаются в регистр DAC_DORx. Регистр DAC_DORx обновляется на 3 такта APB1 позже события триггера.

Если выбран программный триггер (SW), то преобразование запускается, как только был установлен бит SWTRIG. Бит SWTRIG сбросится аппаратно, как только регистр DAC_DORx обновится содержимым регистра DAC_DHRx.

Примечание: биты TSELx[2:0] не могут быть изменены, когда установлен бит ENx. Когда выбран программный триггер, передача данных из регистра DAC_DHRx в регистр DAC_DORx происходит только после одного такта APB1.

[Запрос DMA]

У каждого канала DAC есть возможность использовать DMA. Два канала DMA используются для обслуживания запросов DMA каналов DAC.

Запрос DAC DMA генерируется, когда произойдет внешний триггер (но не программный триггер), если установлен бит DMAENx.Тогда значение регистра DAC_DHRx передается в регистр DAC_DORx.

В двухканальном режиме, если установлены оба бита DMAENx, генерируются два запроса DMA. Если нужен только один запрос DMA, пользователь должен установить только соответствующий бит DMAENx. Таким методом приложение может обслуживать оба канала DAC в двухканальном режиме, используя один запрос DMA и уникальный канал DMA.

DMA underrun. При недогрузке DMA запрос DAC DMA не ставится в очередь: если поступил второй внешний триггер до того, как было получено подтверждение от первого внешнего триггера (подтверждение первого запроса), то не выдается новый запрос, и установится флаг DMAUDRx недогрузки DMA канала x в регистре DAC_SR, сигнализируя о событии ошибки. Тогда передача данных DMA запрещается, и будущий запрос DMA не обрабатывается. Канал x DAC продолжает преобразовывать старые данные.

Программа должна очистить флаг DMAUDRx записью лог. 1, очистить бит DMAEN используемого потока DMA и заново инициализировать и DMA, и канал x DAC, чтобы корректно перезапустить передачу данных. Программа должна изменить частоту срабатывания триггера преобразования DAC, или облегчить рабочую нагрузку DMA, чтобы избежать новой недогрузки DMA. И наконец, преобразование DAC должно быть возобновлено разрешением и передачи данных DMA, и разрешением триггера преобразования.

Для каждого канала x DAC также генерируется прерывание, если разрешен соответствующий бит DMAUDRIEx в регистре DAC_CR.

Для генерации псевдослучайного шума с изменяющейся амплитудой доступен регистр LFSR (linear feedback shift register). Генерация шума DAC выбирается установкой бит WAVEx[1:0] в состояние 01. Для LFSR используется предварительно загружаемое значение 0xAAA. Этот регистр обновляется через 3 такта APB1 после каждого события триггера, новые данные для регистра определяются по специальному вычислительному алгоритму.

STM32F4xx DAC LFSR calculation algorithm fig68

Рис. 68. Алгоритм обновления данных в регистре DAC LFSR.

Значение LFSR, которое может маскироваться частично или полностью битами MAMPx[3:0] в регистре DAC_CR, добавляется к содержимому DAC_DHRx без переполнения, и это значение затем передается в регистр DAC_DORx.

Если LFSR получит значение 0x0000, то в него инжектируется 1 (механизм antilock-up). Можно сбросить генерацию сигнала LFSR сбросом бит WAVEx[1:0].

STM32F4xx DAC conversion SW trigger enabled LFSR fig69

Рис. 69. Преобразование DAC (разрешен программный триггер SW) с генерацией сигнала LFSR.

Примечание: триггер DAC должен быть разрешен для генерации шума путем установки бита TENx в регистре DAC_CR.

Можно добавить треугольный сигнал малой амплитуды к постоянному выходному уровню DAC, или генерировать медленно меняющийся треугольный сигнал. Генерация треугольника выбирается установкой бит WAVEx[1:0] в состояние 10. Амплитуда генерируемого сигнала конфигурируется битами MAMPx[3:0] в регистре DAC_CR. Внутренний счетчик треугольника инкрементируется на 3 такта APB1 позже каждого события триггера. Затем это значение добавляется без переполнения к регистру DAC_DHRx и полученная сумма передается в регистр DAC_DORx. Счетчик треугольника инкрементируется до тех пор, пока он меньше максимальной амплитуды, определенной битами MAMPx[3:0]. Как только была достигнута максимальная амплитуда, счетчик начинает декрементироваться вниз до 0, после чего начнет снова инкрементироваться, и так далее.

STM32F4xx DAC triangle wave generation fig70

Рис. 70. Генерация треугольного сигнала DAC.

Можно сбросить генерацию треугольного сигнала сбросом бит WAVEx[1:0].

STM32F4xx DAC conversion SW trigger enabled triangle wave generation fig71

Рис. 71. Преобразование DAC (разрешен программный триггер SW) с генерацией треугольного сигнала.

Примечание: должен быть разрешен триггер DAC для генерации шума, путем установки бита TENx в регистре DAC_CR. Биты MAMPx[3:0] должны быть сконфигурированы перед разрешением DAC, иначе их нельзя будет изменить.

Для эффективного использования полосы пропускания шины в приложениях, где одновременно нужны 2 канала DAC, реализованы 3 двойных регистра: DHR8RD, DHR12RD и DHR12LD. Тогда требуется уникальный доступ к регистрам, чтобы управлять обоими каналами DAC одновременно.

С этими двойными регистрами и двумя каналами DAC доступны 11 возможных режимов преобразования. Тем не менее, все режимы преобразования при необходимости могут быть выполнены с использованием отдельных регистров DHRx.

Независимый триггер. Чтобы сконфигурировать DAC в этом режиме преобразования, требуется выполнить следующую последовательность действий:

• Установка бит TEN1 и TEN2 разрешения двух триггеров каналов DAC.
• Конфигурирование разных источников триггера установкой разных значений в битах TSEL1[2:0] и TSEL2[2:0].
• Загрузка двухканальных данных в желаемый регистр DHR (DAC_DHR12RD, DAC_DHR12LD или DAC_DHR8RD).

Когда сработает триггер канала 1 DAC, содержимое регистра DHR1 передается в регистр DAC_DOR1 (с задержкой 3 такта APB1). Когда сработает триггер канала 2 DAC, содержимое регистра DHR2 передается в регистр DAC_DOR2 (с задержкой 3 такта APB1).

Независимый триггер с одним LFSR. Чтобы сконфигурировать DAC в этом режиме преобразования, требуется выполнить следующую последовательность действий:

• Установка бит TEN1 и TEN2 разрешения двух триггеров каналов DAC.
• Конфигурирование разных источников триггера установкой разных значений в битах TSEL1[2:0] и TSEL2[2:0].
• Конфигурирование двух каналов DAC битами WAVEx[1:0], установкой их в 01, и установка одинакового значения маски LFSR в битах MAMPx[3:0].
• Загрузка данных двух каналов DAC в желаемый регистр DHR (DHR12RD, DHR12LD или DHR8RD).

Когда сработает триггер канала 1 DAC, счетчик LFSR1, с одинаковой маской, добавится к регистру DHR1, и сумма передается в DAC_DOR1 (с задержкой 3 такта APB1). Затем обновится счетчик LFSR1. Когда сработает триггер канала 2 DAC, счетчик LFSR2, с одинаковой маской, добавится к регистру DHR2, и сумма передается в DAC_DOR2 (с задержкой 3 такта APB1). Затем обновится счетчик LFSR2.

Независимый триггер с разными LFSR. Чтобы сконфигурировать DAC в этом режиме преобразования, требуется выполнить следующую последовательность действий:

• Установка бит TEN1 и TEN2 разрешения двух триггеров каналов DAC.
• Конфигурирование разных источников триггера установкой разных значений в битах TSEL1[2:0] и TSEL2[2:0].
• Конфигурирование двух каналов DAC битами WAVEx[1:0], установкой их в 01, и установка разных значений маски LFSR в битах MAMP1[3:0] и MAMP2[3:0].
• Загрузка данных двух каналов DAC в желаемый регистр DHR (DAC_DHR12RD, DAC_DHR12LD или DAC_DHR8RD).

Когда сработает триггер канала 1 DAC, счетчик LFSR1, с маской, сконфигурированной в MAMP1[3:0], добавится к регистру DHR1, и сумма передается в DAC_DOR1 (с задержкой 3 такта APB1). Затем обновится счетчик LFSR1. Когда сработает триггер канала 2 DAC, счетчик LFSR2, с маской, сконфигурированной в MAMP2[3:0], добавится к регистру DHR2, и сумма передается в DAC_DOR2 (с задержкой 3 такта APB1). Затем обновится счетчик LFSR2.

Независимый триггер с одним треугольником. Чтобы сконфигурировать DAC в этом режиме преобразования, требуется выполнить следующую последовательность действий:

• Установка бит TEN1 и TEN2 разрешения двух триггеров каналов DAC.
• Конфигурирование разных источников триггера установкой разных значений в битах TSEL1[2:0] и TSEL2[2:0].
• Конфигурирование двух каналов DAC битами WAVEx[1:0], в которые записывается значение 1x, с одинаковым максимальным значением амплитуды в битах MAMPx[3:0].
• Загрузка данных двух каналов DAC в желаемый регистр DHR (DAC_DHR12RD, DAC_DHR12LD или DAC_DHR8RD).

Когда сработает триггер канала 1 DAC, счетчик треугольника канала 1 DAC, с одинаковой амплитудой треугольника, добавится к регистру DHR1, и сумма передается в DAC_DOR1 (с задержкой 3 такта APB1). Затем обновится счетчик треугольника канала 1 DAC. Когда сработает триггер канала 2 DAC, счетчик треугольника канала 2 DAC, с одинаковой амплитудой треугольника, добавится к регистру DHR2, и сумма передается в DAC_DOR2 (с задержкой 3 такта APB1). Затем обновится счетчик треугольника канала 2 DAC.

Независимый триггер с двумя треугольниками. Чтобы сконфигурировать DAC в этом режиме преобразования, требуется выполнить следующую последовательность действий:

• Установка бит TEN1 и TEN2 разрешения двух триггеров каналов DAC.
• Конфигурирование разных источников триггера установкой разных значений в битах TSEL1[2:0] и TSEL2[2:0].
• Конфигурирование двух каналов DAC битами WAVEx[1:0], в которые записывается значение 1x, с разными максимальными значениями амплитуды в битах MAMP1[3:0] и MAMP2[3:0].
• Загрузка данных двух каналов DAC в желаемый регистр DHR (DAC_DHR12RD, DAC_DHR12LD или DAC_DHR8RD).

Когда сработает триггер канала 1 DAC, счетчик треугольника канала 1 DAC, с амплитудой треугольника, сконфигурированной битами MAMP1[3:0], добавится к регистру DHR1, и сумма передается в DAC_DOR1 (с задержкой 3 такта APB1). Когда сработает триггер канала 2 DAC, счетчик треугольника канала 2 DAC, с амплитудой треугольника, сконфигурированной битами MAMP2[3:0], добавится к регистру DHR2, и сумма передается в DAC_DOR2 (с задержкой 3 такта APB1).

Одновременный программный старт. Чтобы сконфигурировать DAC в этом режиме преобразования, требуется выполнить следующую последовательность действий:

• Загрузка данных двух каналов DAC в желаемый регистр DHR (DAC_DHR12RD, DAC_DHR12LD или DAC_DHR8RD).

В этой конфигурации с задержкой 1 такт APB1 регистры DHR1 и DHR2 передаются соответственно в регистры DAC_DOR1 и DAC_DOR2.

Одновременный триггер. Чтобы сконфигурировать DAC в этом режиме преобразования, требуется выполнить следующую последовательность действий:

• Установка бит TEN1 и TEN2 разрешения двух триггеров каналов DAC.
• Конфигурирование одинакового источника триггера для обоих каналов DAC путем установки одинакового значения в битах TSEL1[2:0] и TSEL2[2:0].
• Загрузка данных двух каналов DAC в желаемый регистр DHR (DAC_DHR12RD, DAC_DHR12LD или DAC_DHR8RD).

Когда сработает триггер, регистры DHR1 и DHR2 передаются соответственно в регистры DAC_DOR1 и DAC_DOR2 (с задержкой 3 такта APB1).

Одновременный триггер с одним LFSR. Чтобы сконфигурировать DAC в этом режиме преобразования, требуется выполнить следующую последовательность действий:

• Установка бит TEN1 и TEN2 разрешения двух триггеров каналов DAC.
• Конфигурирование одинакового источника триггера для обоих каналов DAC путем установки одинакового значения в битах TSEL1[2:0] и TSEL2[2:0].
• Конфигурирование двух каналов DAC битами WAVEx[1:0], установкой их в 01, и установка одинакового значения маски LFSR в битах MAMPx[3:0].
• Загрузка двух каналов данных DAC в желаемый регистр DHR (DHR12RD, DHR12LD или DHR8RD).

Когда сработает триггер, счетчик LFSR1, с одинаковой маской, добавится к регистру DHR1, и сумма передается в DAC_DOR1 (с задержкой 3 такта APB1). Затем обновится счетчик LFSR1. Одновременно произойдет то же самое и с каналом 2: счетчик LFSR2, с одинаковой маской, добавится к регистру DHR2, и сумма будет передана в DAC_DOR2 (с задержкой 3 такта APB1). Затем обновится счетчик LFSR2.

Одновременный триггер с разными LFSR. Чтобы сконфигурировать DAC в этом режиме преобразования, требуется выполнить следующую последовательность действий:

• Установка бит TEN1 и TEN2 разрешения двух триггеров каналов DAC.
• Конфигурирование одинакового источника триггера для обоих каналов DAC путем установки одинакового значения в битах TSEL1[2:0] и TSEL2[2:0].
• Конфигурирование двух каналов DAC битами WAVEx[1:0], установкой их в 01, и установка разных значений маски LFSR в битах MAMP1[3:0] и MAMP2[3:0].
• Загрузка двух каналов данных DAC в желаемый регистр DHR (DHR12RD, DHR12LD или DHR8RD).

Когда сработает триггер, счетчик LFSR1, с маской, сконфигурированной битами MAMP1[3:0], добавится к регистру DHR1, и сумма передается в DAC_DOR1 (с задержкой 3 такта APB1). Затем обновится счетчик LFSR1. Одновременно то же самое произойдет и с каналом 2: счетчик LFSR2, с маской, сконфигурированной битами MAMP2[3:0], добавится к регистру DHR2, и сумма будет передана в DAC_DOR2 (с задержкой 3 такта APB1). Затем обновится счетчик LFSR2.

Одновременный триггер с одним треугольником. Чтобы сконфигурировать DAC в этом режиме преобразования, требуется выполнить следующую последовательность действий:

• Установка бит TEN1 и TEN2 разрешения двух триггеров каналов DAC.
• Конфигурирование одинакового источника триггера для обоих каналов DAC путем установки одинакового значения в битах TSEL1[2:0] и TSEL2[2:0].
• Конфигурирование двух каналов DAC битами WAVEx[1:0], установкой их в 1x, и установка одинакового значения амплитуды битами MAMPx[3:0].
• Загрузка двух каналов данных DAC в желаемый регистр DHR (DHR12RD, DHR12LD или DHR8RD).

Когда сработает триггер, счетчик треугольника канала 1, с одинаковой амплитудой, добавится к регистру DHR1, и сумма передается в DAC_DOR1 (с задержкой 3 такта APB1). Затем обновится счетчик треугольника канала 1. Одновременно произойдет то же самое и с каналом 2: счетчик треугольника канала 2, с одинаковой амплитудой, добавится к регистру DHR2, и сумма будет передана в DAC_DOR2 (с задержкой 3 такта APB1). Затем обновится счетчик треугольника канала 2.

Одновременный триггер с разными треугольниками. Чтобы сконфигурировать DAC в этом режиме преобразования, требуется выполнить следующую последовательность действий:

• Установка бит TEN1 и TEN2 разрешения двух триггеров каналов DAC.
• Конфигурирование одинакового источника триггера для обоих каналов DAC путем установки одинакового значения в битах TSEL1[2:0] и TSEL2[2:0].
• Конфигурирование двух каналов DAC битами WAVEx[1:0], установкой их в 1x, и установка одинакового значения амплитуды битами MAMPx[3:0].
• Загрузка двух каналов данных DAC в желаемый регистр DHR (DHR12RD, DHR12LD или DHR8RD).

Когда сработает триггер, счетчик треугольника канала 1, с одинаковой амплитудой, добавится к регистру DHR1, и сумма передается в DAC_DOR1 (с задержкой 3 такта APB1). Затем обновится счетчик треугольника канала 1. Одновременно произойдет то же самое и с каналом 2: счетчик треугольника канала 2, с одинаковой амплитудой, добавится к регистру DHR2, и сумма будет передана в DAC_DOR2 (с задержкой 3 такта APB1). Затем обновится счетчик треугольника канала 2.

[Регистры DAC]

К регистрам периферийного устройства DAC нужно обращаться как к словам (32-битный доступ). Смещение адреса указано относительно базового адреса DAC_BASE (см. файл stm32f429xx.h). Для адресного пространства DAC зарезервированы адреса 0x0x40007400 .. 0x400077FF (базовый адрес 0x40007400).

Значение сброса бит у всех регистров нулевые (0x00000000).

STM32F4xx DAC register map tbl76

В описании функций регистров используются следующие сокращения:

read/write (rw) Программа может читать и записывать эти биты.

read-only (r) Программа может только читать эти биты.

write-only (w) Программа может только записывать в этот бит. Чтение бита вернет значение сброса.

read/clear (rc_w1) Программа может прочитать бит, а также сбросить его путем записью 1. Запись 0 не дает никакого эффекта.

read/clear (rc_w0) Программа может прочитать бит, а также сбросить его путем записью 0. Запись 1 не дает никакого эффекта.

read/clear by read (rc_r) Программа может прочитать этот бит. Чтение этого бита автоматически сбросит его в 0. Запись 0 в бит не дает никакого эффекта.

read/set (rs) Программа может прочитать, а также установить этот бит. Запись 0 в бит не дает никакого эффекта.

read-only write trigger (rt_w) Программа может прочитать этот бит. Запись 0 или 1 вызовет появление события (триггер), но не окажет никакого влияния на значение бита.

toggle (t) Программа может только переключить этот бит записью 1. Запись 0 не дает никакого эффекта.

Reserved (Res.) Зарезервированный бит, его значение должно сохраняться на значении сброса.

Смещение адреса: 0x00
Значение сброса: 0x00000000

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
DMAUDRIE2
rw
DMAEN2
rw
MAMP2[3:0]
rw
WAVE2[1:0]
rw
TSEL2[2:0]
rw
TEN2
rw
BOFF2
rw
EN2
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано
DMAUDRIE1
rw
DMAEN1
rw
MAMP1[3:0]
rw
WAVE1[1:0]
rw
TSEL1[2:0]
rw
TEN1
rw
BOFF1
rw
EN1
rw

Биты 31:30 зарезервированы, и должны удерживаться в состоянии сброса (все нули).

DMAUDRIE2 (бит 29): DAC channel2 DMA underrun interrupt enable, бит разрешает прерывание недогрузки DMA для канала 2 DAC. Этот бит устанавливается и очищается программой.

0: прерывание запрещено (по умолчанию).
1: прерывание разрешено.

DMAEN2 (бит 28): DAC channel2 DMA enable, разрешение DMA для канала 2 DAC. Этот бит устанавливается и очищается программой.

0: режим DMA для канала 2 DAC запрещен.
1: режим DMA для канала 2 DAC разрешен.

MAMP2[3:0] (биты 27:24): выбор маски/амплитуды канала 2 DAC. Эти биты записываются программой, чтобы выбрать маску в режиме генерации сигнала шума, или амплитуды в режиме генерации треугольника.

0000: демаскирование бита 0 LFSR / амплитуда треугольника равна 1
0001: демаскирование бит [1:0] LFSR / амплитуда треугольника равна 3
0010: демаскирование бит [2:0] LFSR / амплитуда треугольника равна 7
0011: демаскирование бит [3:0] LFSR / амплитуда треугольника равна 15
0100: демаскирование бит [4:0] LFSR / амплитуда треугольника равна 31
0101: демаскирование бит [5:0] LFSR / амплитуда треугольника равна 63
0110: демаскирование бит [6:0] LFSR / амплитуда треугольника равна 127
0111: демаскирование бит [7:0] LFSR / амплитуда треугольника равна 255
1000: демаскирование бит [8:0] LFSR / амплитуда треугольника равна 511
1001: демаскирование бит [9:0] LFSR / амплитуда треугольника равна 1023
1010: демаскирование бит [10:0] LFSR / амплитуда треугольника равна 2047
>= 1011: демаскирование бит [11:0] LFSR / амплитуда треугольника равна 4095

WAVE2[1:0] (биты 23:22): разрешение режима генерации шума или треугольника канала 2 DAC. Эти биты устанавливаются и очищаются программой.

00: генерация сигнала запрещена
01: разрешена генерация шума
1x: разрешена генерация треугольника

Примечание: используется только если бит TEN2 = 1 (разрешен триггер канала 2 DAC).

TSEL2[2:0] (биты 21:19): DAC channel2 trigger selection, выбор триггера канала 2 DAC. Эти биты выбирают внешнее событие (триггер), используемое для канала 2 DAC.

000: Timer 6 TRGO event
001: Timer 8 TRGO event
010: Timer 7 TRGO event
011: Timer 5 TRGO event
100: Timer 2 TRGO event
101: Timer 4 TRGO event
110: External line9
111: Software trigger

Примечание: используется только если бит TEN2 = 1 (разрешен триггер канала 2 DAC).

TEN2 (бит 18): DAC channel2 trigger enable, разрешение триггера канала 2 DAC. Этот бит устанавливается и очищается программой, чтобы разрешить/запретить триггер канала 2 DAC.

0: триггер канала 2 DAC запрещен, и записанные в регистр DAC_DHRx данные передаются в регистр DAC_DOR2 с задержкой в 1 такт APB1.
1: триггер канала 2 DAC разрешен, и записанные в регистр DAC_DHRx данные передаются в регистр DAC_DOR2 с задержкой в 3 такта APB1.

Примечание: когда выбран программный триггер, передача данных из регистра DAC_DHRx в регистр DAC_DOR2 занимает только 1 такт APB1.

BOFF2 (бит 17): DAC channel2 output buffer disable, запрет выходного буфера канала 2 DAC. Этот бит очищается и устанавливается программой, чтобы разрешить/запретить выходной буфер канала 2 DAC.

0: выходной буфер канала 2 DAC разрешен (по умолчанию).
1: выходной буфер канала 2 DAC запрещен.

EN2 (бит 16): разрешение канала 2 DAC. Этот бит устанавливается и очищается программой, чтобы разрешить/запретить канал 2 DAC.

0: канал 2 DAC запрещен.
1: канал 2 DAC разрешен.

Биты 15:14 зарезервированы, и должны удерживаться в состоянии сброса (все нули).

DMAUDRIE1 (бит 13): DAC channel1 DMA underrun interrupt enable, бит разрешает прерывание недогрузки DMA для канала 1 DAC. Этот бит устанавливается и очищается программой.

0: прерывание запрещено (по умолчанию).
1: прерывание разрешено.

DMAEN1 (бит 12): DAC channel1 DMA enable, разрешение DMA для канала 1 DAC. Этот бит устанавливается и очищается программой.

0: режим DMA для канала 1 DAC запрещен.
1: режим DMA для канала 1 DAC разрешен.

MAMP1[3:0] (биты 11:8): выбор маски/амплитуды канала 1 DAC. Эти биты записываются программой, чтобы выбрать маску в режиме генерации сигнала шума, или амплитуды в режиме генерации треугольника.

0000: демаскирование бита 0 LFSR / амплитуда треугольника равна 1
0001: демаскирование бит [1:0] LFSR / амплитуда треугольника равна 3
0010: демаскирование бит [2:0] LFSR / амплитуда треугольника равна 7
0011: демаскирование бит [3:0] LFSR / амплитуда треугольника равна 15
0100: демаскирование бит [4:0] LFSR / амплитуда треугольника равна 31
0101: демаскирование бит [5:0] LFSR / амплитуда треугольника равна 63
0110: демаскирование бит [6:0] LFSR / амплитуда треугольника равна 127
0111: демаскирование бит [7:0] LFSR / амплитуда треугольника равна 255
1000: демаскирование бит [8:0] LFSR / амплитуда треугольника равна 511
1001: демаскирование бит [9:0] LFSR / амплитуда треугольника равна 1023
1010: демаскирование бит [10:0] LFSR / амплитуда треугольника равна 2047
>= 1011: демаскирование бит [11:0] LFSR / амплитуда треугольника равна 4095

WAVE1[1:0] (биты 7:6): разрешение режима генерации шума или треугольника канала 1 DAC. Эти биты устанавливаются и очищаются программой.

00: генерация сигнала запрещена
01: разрешена генерация шума
1x: разрешена генерация треугольника

Примечание: используется только если бит TEN1 = 1 (разрешен триггер канала 1 DAC).

TSEL1[2:0] (биты 5:3): DAC channel1 trigger selection, выбор триггера канала 1 DAC. Эти биты выбирают внешнее событие (триггер), используемое для канала 1 DAC.

000: Timer 6 TRGO event
001: Timer 8 TRGO event
010: Timer 7 TRGO event
011: Timer 5 TRGO event
100: Timer 2 TRGO event
101: Timer 4 TRGO event
110: External line9
111: Software trigger

Примечание: используется только если бит TEN1 = 1 (разрешен триггер канала 1 DAC).

TEN1 (бит 2): DAC channel1 trigger enable, разрешение триггера канала 1 DAC. Этот бит устанавливается и очищается программой, чтобы разрешить/запретить триггер канала 1 DAC.

0: триггер канала 1 DAC запрещен, и записанные в регистр DAC_DHRx данные передаются в регистр DAC_DOR1 с задержкой в 1 такт APB1.
1: триггер канала 1 DAC разрешен, и записанные в регистр DAC_DHRx данные передаются в регистр DAC_DOR1 с задержкой в 3 такта APB1.

Примечание: когда выбран программный триггер, передача данных из регистра DAC_DHRx в регистр DAC_DOR1 занимает только 1 такт APB1.

BOFF1 (бит 1): DAC channel1 output buffer disable, запрет выходного буфера канала 1 DAC. Этот бит очищается и устанавливается программой, чтобы разрешить/запретить выходной буфер канала 1 DAC.

0: выходной буфер канала 1 DAC разрешен (по умолчанию).
1: выходной буфер канала 1 DAC запрещен.

EN1 (бит 0): разрешение канала 1 DAC. Этот бит устанавливается и очищается программой, чтобы разрешить/запретить канал 1 DAC.

0: канал 1 DAC запрещен.
1: канал 1 DAC разрешен.

Смещение адреса: 0x04
Значение сброса: 0x00000000

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано SWTRIG2
w
SWTRIG1
w

Биты 31:2 зарезервированы, и должны удерживаться в состоянии сброса (все нули).

SWTRIG2 (бит 1): DAC channel2 software trigger, программный триггер канала 2 DAC. Этот бит устанавливается и очищается программой, чтобы разрешить/запретить программный триггер.

0: программный триггер (SW) запрещен (по умолчанию).
1: программный триггер (SW) разрешен.

Примечание: этот бит очистится аппаратно (с задержкой в 1 такт APB1), как только значение регистра DAC_DHR2 было загружено в регистр DAC_DOR2.

SWTRIG1 (бит 0): DAC channel1 software trigger, программный триггер канала 1 DAC. Этот бит устанавливается и очищается программой, чтобы разрешить/запретить программный триггер.

0: программный триггер (SW) запрещен (по умолчанию).
1: программный триггер (SW) разрешен.

Примечание: этот бит очистится аппаратно (с задержкой в 1 такт APB1), как только значение регистра DAC_DHR1 было загружено в регистр DAC_DOR1.

Смещение адреса: 0x08
Значение сброса: 0x00000000

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано
DACC1DHR[11:0]
rw

Биты 31:12 зарезервированы, и должны удерживаться в состоянии сброса (все нули).

DACC1DHR[11:0] (биты 11:0): выровненные вправо 12-битные данные для канала 1 DAC.

Смещение адреса: 0x0C
Значение сброса: 0x00000000

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
DACC1DHR[11:0]
rw
зарезервировано

Биты 31:16 зарезервированы, и должны удерживаться в состоянии сброса (все нули).

DACC1DHR[11:0] (биты 14:4): выровненные влево 12-битные данные для канала 1 DAC.

Биты 3:0 зарезервированы, и должны удерживаться в состоянии сброса (все нули).

Смещение адреса: 0x10
Значение сброса: 0x00000000

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано
DACC1DHR[7:0]
rw

Биты 31:8 зарезервированы, и должны удерживаться в состоянии сброса (все нули).

DACC1DHR[7:0] (биты 7:0): выровненные вправо 8-битные данные канала 1 DAC.

Смещение адреса: 0x14
Значение сброса: 0x00000000

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано
DACC2DHR[11:0]
rw

Биты 31:12 зарезервированы, и должны удерживаться в состоянии сброса (все нули).

DACC2DHR[11:0] (биты 11:0): выровненные вправо 12-битные данные для канала 2 DAC.

Смещение адреса: 0x18
Значение сброса: 0x00000000

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
DACC2DHR[11:0]
rw
зарезервировано

Биты 31:16 зарезервированы, и должны удерживаться в состоянии сброса (все нули).

DACC2DHR[11:0] (биты 14:4): выровненные влево 12-битные данные для канала 2 DAC.

Биты 3:0 зарезервированы, и должны удерживаться в состоянии сброса (все нули).

Смещение адреса: 0x1C
Значение сброса: 0x00000000

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано
DACC2DHR[7:0]
rw

Биты 31:8 зарезервированы, и должны удерживаться в состоянии сброса (все нули).

DACC2DHR[7:0] (биты 7:0): выровненные вправо 8-битные данные канала 2 DAC.

Смещение адреса: 0x20
Значение сброса: 0x00000000

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
DACC2DHR[11:0]
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано
DACC1DHR[11:0]
rw

Биты 31:28 зарезервированы, и должны удерживаться в состоянии сброса (все нули).

DACC2DHR[11:0] (биты 27:16): DAC channel2 12-bit right-aligned data, выравненные вправо 12-битные данные для канала 2 DAC.

Биты 15:12 зарезервированы, и должны удерживаться в состоянии сброса (все нули).

DACC1DHR[11:0] (биты 11:0): DAC channel1 12-bit right-aligned data, выравненные вправо 12-битные данные для канала 1 DAC.

Смещение адреса: 0x24
Значение сброса: 0x00000000

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
DACC2DHR[11:0]
rw

зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
DACC1DHR[11:0]
rw
зарезервировано

DACC2DHR[11:0] (биты 31:20): DAC channel2 12-bit left-aligned data, выровненные влево 12-битные данные для канала 2 DAC.

Биты 19:16 зарезервированы, и должны удерживаться в состоянии сброса (все нули).

DACC1DHR[11:0] (биты 15:4): DAC channel1 12-bit left-aligned data, выровненные влево 12-битные данные для канала 1 DAC.

Биты 3:0 зарезервированы, и должны удерживаться в состоянии сброса (все нули).

Смещение адреса: 0x28
Значение сброса: 0x00000000

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
DACC2DHR[7:0]
rw

DACC1DHR[7:0]
rw

Биты 31:16 зарезервированы, и должны удерживаться в состоянии сброса (все нули).

DACC2DHR[7:0] (биты 15:8): DAC channel2 8-bit right-aligned data, выровненные вправо 8-битные данные канала 2 DAC.

DACC1DHR[7:0] (биты 7:0): DAC channel1 8-bit right-aligned data, выровненные вправо 8-битные данные канала 1 DAC.

Смещение адреса: 0x2C
Значение сброса: 0x00000000

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано
DACC1DOR[11:0]
r

Биты 31:12 зарезервированы, и должны удерживаться в состоянии сброса (все нули).

DACC1DOR[11:0] (биты 11:0): выходные данные канала 1 DAC. Эти биты предназначены только для чтения.

Смещение адреса: 0x30
Значение сброса: 0x00000000

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано
DACC2DOR[11:0]
r

Биты 31:12 зарезервированы, и должны удерживаться в состоянии сброса (все нули).

DACC2DOR[11:0] (биты 11:0): выходные данные канала 2 DAC. Эти биты предназначены только для чтения.

Смещение адреса: 0x34
Значение сброса: 0x00000000

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
DMAUDR2
rc_w1
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано

DMAUDR1
rc_w1
зарезервировано

Биты 31:30 зарезервированы, и должны удерживаться в состоянии сброса (все нули).

DMAUDR2 (бит 29): DAC channel2 DMA underrun flag, флаг недогрузки DMA канала 2 DAC. Этот бит устанавливается аппаратно, и очищается программой (путем записи в него 1).

0: не было события недогрузки DMA на канале 2 DAC.
1: было событие недогрузки DMA на канале 2 DAC. Выбранный в настоящий момент триггер, управляющий преобразованием на канале 2 DAC, срабатывает со слишком высокой частотой, большей чем DMA может обслужить.

Биты 28:14 зарезервированы, и должны удерживаться в состоянии сброса (все нули).

DMAUDR1 (бит 13): DAC channel1 DMA underrun flag, флаг недогрузки DMA канала 1 DAC. Этот бит устанавливается аппаратно, и очищается программой (путем записи в него 1).

0: не было события недогрузки DMA на канале 1 DAC.
1: было событие недогрузки DMA на канале 1 DAC. Выбранный в настоящий момент триггер, управляющий преобразованием на канале 1 DAC, срабатывает со слишком высокой частотой, большей чем DMA может обслужить.

[Примеры]

DAC_SignalAny - проект, основа которого сгенерирована в STM32CubeMX с использованием FreeRTOS. Процессор работает на частоте 168 МГц, TIM2 используется для генерации системных тиков 1 мс, TIM6 настроен на частоту срабатывания прерываний 44100 Гц (см. макрос DAC_SAMPLE_RATE). Для DAC используется программный триггер запуска преобразования. В обработчике прерывания инкрементируется счетчик фазы, и по таблице синуса берется новое значение для записи в DAC (см. код обработчика прерывания TIM6_DAC_IRQHandler). Каждую секунду в задаче StartDefaultTask запускается генерация новой частоты, частоты меняются циклически от 500 Гц до 20000 Гц с шагом 500 Гц.

DAC_SignalsGeneration - проект из примеров библиотеки STM32Cube_FW_F4_V1.24.0. Здесь DAC может работать в двух режимах (режим переключается нажатием кнопки Tamper/Key) - либо генерация треугольного сигнала, либо лестничного. Генерацией лестничного сигнала управляет DMA, без участия программы. DMA посылает в DAC 6 фиксированных значений из массива aEscalator8bit[6], смена значений происходит по триггеру таймера TIM6.

Примеры можно скачать в архиве [2], они компилировались и тестировались под управлением IAR 8.30.

[Ссылки]

1. RM0090 Reference manual STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 advanced Arm®-based 32-bit MCUs site:st.com.
2200312STM32F429-DAC-examples.zip - примеры использования DAC.

 

Добавить комментарий


Защитный код
Обновить

Top of Page