Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Микроконтроллеры с ядром Cortex-M3 в системах управления и автоматики. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
В качестве опорного напряжения преобразования могут выступать:
– питание АЦП с выводов AUCC и AGND;
– внешние сигналы с выводов ADC0_REF+ и ADC_REF-.
Контроллер АЦП позволяет:
– оцифровать один из 16 внешних каналов;
– оцифровать значение встроенного датчика температуры;
– оцифровать значение внутреннего источника опорного напряжения;
– осуществить автоматический опрос заданных каналов;
– выработать прерывание при выходе оцифрованного значения за заданные пределы;
– запускать два АЦП синхронно для увеличения скорости выборки.
Для осуществления преобразования требуется не менее 28 тактов синхронизации
CLK. В качестве синхросигнала может выступать частота процессора CPU_CLK, либо
частота ADC_CLK, формируемая в блоке «Сигналы тактовой частоты». Выбор частоты
осуществляется с помощью бита Cfg_REG_CLKS. Частота CPU_CLK формируется
из частоты процессорного ядра делением на коэффициент Cfg_REG_DIVCLK [3:0].
Максимальная частота CLK не может превышать 14 МГц.
Разрядность 12 бит позволяет выдавать 212 = 4096 значений оцифрованного входного
сигнала. Время преобразования определяется текущей тактовой частотой работы АЦП.
Минимальное время измерения каждого АЦП микроконтроллеров типа 1986ВЕ92х составляет 1,95 мкс, что соответствует 512 820 измерениям в секунду.
В конструкцию микроконтроллеров типа 1986ВЕ92х включен аналоговый
мультиплексор, позволяющий независимо подавать на входы ADC1 и ADC2 сигнал с линий ввода-вывода, интегрированных в микроконтроллер датчика температуры и датчика
внутреннего опорного напряжения. Выбор канала и начало измерения производятся
программно. Результат измерения попадает в 32-битовые регистры ADC1_RESULT и ADC2_RESULT для ADC1 и ADC2 соответственно. Признаком того, что АЦП закончил
преобразования, является генерируемое им аппаратное прерывание и появление
специального флага FLG_REG_EOCIF в регистрах состояния АЦП ADC1_STATUS и ADC2_ STATUS соответственно.
Любой из двух АЦП микроконтроллеров типа 1986ВЕ92х может функционировать
в одном из четырех режимов: одиночного или многократного преобразования с опросом бита
окончания или выработкой прерывания для одиночного преобразования, а также
с возможностью прямого доступа к памяти для многократного преобразования. Допускается
синхронное применение ADC1 и ADC2.
Для начала работы с АЦП его необходимо настроить. Необходимые параметры для
этой процедуры описаны в структурных типах ADC_InitTypeDef и ADCx_InitTypeDef. Первый тип позволяет выполнять общее конфигурирование ADC1 и ADC2, а второй — выполнять конфигурирование каждого конкретного АЦП. Покажем работу с АЦП
на примере ADC1 в режимах одиночного преобразования по одному каналу с опросом бита
окончания и выработкой прерывания. Определим структуры для работы:
31
– ADC_InitTypeDef ADCIStruct;
– ADCx_InitTypeDef ADCxIStruct.
В качестве входной линии используем линию PD2 (PORT_Pin_2) порта ввода-вывода D (PORTD). Для работы с АЦП нужно разрешить тактировании порта D и АЦП, а также объявить линию PD2 как аналоговую:
RST_CLK_PCLKcmd(RST_CLK_PCLK_ADC | RST_CLK_PCLK_PORTD, ENABLE);
POTR_StructInit(&PtIStruct);
PtIStruct.PORT_Pin = PORT_Pin_2;
PtIStruct.PORT_MODE = PORT_MODE_ANALOG;
PORT_Init(MDR_PORTD, &PtIStruct);
Также необходимо определить значения полей структуры ADCIStruct:
ADCIStruct.ADC_SynchronousMode = ADC_SyncMode_Independent;
ADCIStruct.ADC_StartDelay = 0;
ADCIStruct.ADC_TempSensor = ADC_TEMP_SENSOR_Disable;
ADCIStruct.ADC_TempSensorAmplifier = ADC_TEMP_SENSOR_AMPLIFIER_Disable;
ADCIStruct.ADC_TempSensorConversion = ADC_TEMP_SENSOR_CONVERSION_Disable;
ADCIStruct.ADC_IntVRefConversion = ADC_VREF_CONVERSION_Disable;
ADCIStruct.ADC_IntVRefTrimming = 0;
ADCInit(&ADCIStruct).
Поле ADC_SynchronousMode отвечает за характер применения АЦП ADC1 и ADC2: синхронный или независимый. Поле ADC_StartDelay в случае синхронного
функционирования двух АЦП позволяет определить задержку запуска ADC1 и ADC2. Поля
ADC_TempSensor, ADC_TempSensorAmplifier, ADC_TempSensorConversion определяют
режим использования встроенного датчика температуры. Использование в значениях
параметров этих полей описателя Disable говорит, что датчик будет отключен. Поля ADC_IntVRefConversion и ADC_IntVRefTrimming задают характеристики датчика опорного напряжения. Значение ADC_VREF_CONVERSION_Enable делает датчик опорного напряжения доступным через порт 30, а значение ADC_VREF_CONVERSION_Disable отключает его. Поле ADC_IntVRefTrimming может принимать значения от 0 до 7, используемые для подстройки напряжения датчика.
Поля структуры ADCxIStruct заполняются в следующем виде [7, 8, 12, 14]:
ADCx_StructInit(&ADCxIStruct);
ADCxIStruct.ADC_ClockSource = ADC_CLOCK_SOURCE_CPU;
ADCxIStruct.ADC_Prescaler = ADC_CLK_div_512;
ADCxIStruct.ADC_SamplingMode = ADC_SAMPLING_MODE_SINGLE_CONV;
32
ADCxIStruct.ADC_ChannelSwitching = ADC_CH_SWITCHING_Disable;
ADCxIStruct.ADC_ChannelNumber = ADC_CH_ADC2;
ADCxIStruct.ADC_Channels = 0;
ADCxIStruct.ADC_DelayGo = 0;
ADCxIStruct.ADC_LevelControl = ADC_LEVEL_CONTROL_Disable;
ADCxIStruct.ADC_LowLevel = 0;
ADCxIStruct.ADC_HighLevel = 0;
ADCxIStruct.ADC_VRefSource = ADC_VREF_SOURCE_INTERNAL;
ADCxIStruct.ADC_IntVRefSource = ADC_INT_VREF_SOURCE_INEXACT;
ADC1_Init(&ADCxIStruct).
Поле ADC_ClockSource определяет способ тактирования и может принимать значения ADC_CLOCK_SOURCE_CPU (частота ядра микроконтроллера) или ADC_CLOCK_SOURCE_ADC (другая частота).
Поле ADC_Prescaler задает параметры предделителя для АЦП. Нужно отметить, что не рекомендуется выбирать частоту тактирования выше 14 МГц из-за потери точности в преобразованиях. Значение предделителя может задаваться константой ADC_CLK_div_None или ADC_CLK_div_x, где x = 2k (k может принимать значения от 1 до 12).
Поле ADC_SamplingMode может принимать значения
ADC_SAMPLING_MODE_SINGLE_CONV (одиночное преобразование) или ADC_SAMPLING_MODE_CICLIC_CONV (последовательное преобразование). Первый
режим отличается однократностью преобразования после запуска АЦП.
Поле ADC_ChannelSwitching включает (ADC_CH_SWITCHING_ Enable) или выключает (ADC_CH_SWITCHING_Disable) автоматическое переключение каналов. В случае отключения автоматического переключения каналов в поле ADC_ChannelNumber нужно задать номер канала. В качестве альтернативы номера канала допускаются значения
ADC_CH_INT_VREF (датчик опорного напряжения, применяется с ADC1) или
ADC_CH_TEMP_SENSOR (датчик температуры, применяется с ADC1).
Если выбирается режим с автоматическим переключением каналов, то в поле
ADC_Channels указываются номера выбранных для работы каналов. В противном случае задается 0. Также для этого режима в поле ADC_DelayGo нужно задать длительность задержки между преобразованиями в тактах работы микроконтроллера (значения от 0 до 7).
Микроконтроллеры типа 1986ВЕ9х способны функционировать с контролем уровня
входного сигнала. В этом режиме работы АЦП происходит контроль выхода входного напряжения за границы программно заданного интервала [U
min
, U
]. В случае отклонения
max
напряжения входа от заданного диапазона в регистре ADCx_STATUS устанавливается флаг
Flg_REG_AWOIFEN. Диапазон допустимого изменения напряжения входного сигнала
определяется с помощью полей ADC_LowLevel и ADC_HighLevel. Включение данного
33
режима задается полем ADC_LevelControl. Значение ADC_LEVEL_CONTROL_Enable требует задействовать режим, а значение ADC_LEVEL_CONTROL_Disable говорит о том, что режим не используется. Если режим не задействован, границы диапазона обнуляются.
Особенностью работы АЦП микроконтроллеров семейства 1986ВЕ9х является
возможность выбора источника опорного напряжения. В качестве такового может выступать
как внутренний, так и внешний источник. Во втором варианте напряжение подается от внешней схемы на специальные выводы микроконтроллера ADC0_REF+ и ADC1_REF-, что позволяет производить особо точные измерения напряжения входного сигнала. Выбор источника опорного напряжения производится заданием значения полю ADC_VRefSource.
Использование внутреннего источника задается константой
ADC_VREF_SOURCE_INTERNAL, а внешнего — ADC_VREF_SOURCE_EXTERNAL. Содержимое поля ADC_IntVRefSource позволяет выбрать вид источника с температурной компенсацией (ADC_INT_VREF_SOURCE_EXACT) или без таковой (ADC_INT_VREF_SOURCE_INEXACT). Во втором случае измерения будут менее точными.
Последним действием, предваряющим использование АЦП с выбранными
характеристиками рабочего режима, является вызов функции ADC1_Cmd или ADC2_Cmd, приводящей соответствующий АЦП в готовность к работе, например: ADC1_Cmd(ENABLE).
Использование АЦП проиллюстрируем на примере режима одиночного
преобразования по одному каналу. Окончание преобразования может отслеживаться либо
опросом бита окончания, либо выработкой прерывания. Измерения в данном режиме
разделяются на следующую последовательность операций: начало преобразования,
ожидание появления признака окончания преобразования, получение результата,
интерпретация результата.
Рассмотрим работу с АЦП на примере ADC1. Начало преобразований обозначается
вызовом функции ADC1_Start().Эта функция заносит в бит ADC1_CFG_REG_GO регистра ADC1_CFG значение 1, что обозначает для АЦП необходимость начать измерения состояния
входного сигнала. Окончание преобразований в случае опроса бита окончания
преобразования осуществляется вызовом функции ADC1_GetStatus(), которая считывает в регистре ADC1_STATUS значение бита окончания преобразований. Вызов данной
функции необходимо осуществлять в цикле. В случае ожидания окончания преобразований
по прерыванию вместо функции ADC1_GetStatus() нужно вызвать функцию os_evt_wait_or
(EVENT_ADC_EOC, 0xFFFF).
Функция ожидает сигнал EVENT_ADC_EOC об окончании преобразования,
устанавливаемого обработчиком аппаратных прерываний АЦП. После окончания
преобразования необходимо вызвать функцию ADC1_GetResult, возвращающую 32-битовое значение результата измерений. Следует напомнить, что АЦП в микроконтроллерах семейства 1986ВЕ9х имеет разрядность 12 бит, из-за чего вызов функции нужно делать в формате, очищающем старшую часть результата:
uint32_t UResult;
UResult = ADC1GetResult() & 0x0000FFFF.
34
Полученные значения необходимо калибровать. Для этого необходимы два значения:
измеренное эталонным прибором напряжение (U_Et) и показания АЦП при измерениях этого же напряжения (U_ADC). Окончательное значение преобразований АЦП можно получить по формуле UResult * U_Et / U_ADC.
Еще одним режимом работы с АЦП микроконтроллеров семейства 1986ВЕ9х является
использование прямого доступа к памяти (DMA) при работе с одним каналом или при
использовании автоматического переключения нескольких каналов. В этом режиме
периферийные устройства могут работать с оперативной памятью не загружая ядро
микроконтроллера запросами, что способствует повышению общей производительности
системы.
Для общих настроек DMA и настойки канала DMA используются структуры
приведенных далее типов:
DMA_CtrlDataInitTypeDef DMAIStruct;
DMA_ChannelInitTypeDef DMACIStruct.
Обе структуры рекомендуется определить глобально, так как они задействованы в модуле аппаратных прерываний. Далее нужно разрешить тактирование DMA и интерфейсов SP1 и SP2, запретить все прерывания, сбросить настройки DMA вызовом функции DMA_DeInit и задать значения полям объявленных структур:
RST_CLK_PCLKcmd (RST_CLK_PCLK_DMA | RST_CLK_PCLK_SSP1 | RST_CLK_PCLK_SSP2, ENABLE);
NVIC->ICPR[0] = 0xFFFFFFFF;
NVIC->ICER[0] = 0xFFFFFFFF;
DMA_DeInit();
DMA_StructInit(&DMACIStruct);
DMA_IStruct.DMA_SourceBaseAddr = (uint32_t)(&(MDR_ADC->ADC1_RESULT));
DMA_IStruct.DMA_DestBaseAddr = (uint32_t) &ADC_Buffer;
DMA_IStruct.DMA_CycleSize = 256;
DMA_IStruct.DMA_SourceIncSize = DMA_SourceIncNo;
DMA_IStruct.DMA_DestIncSize = DMA_DestIncHalfWord;
DMA_IStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_IStruct.DMA_NumContinuous = DMA_Transfers_1;
DMA_IStruct.DMA_SourceProtCtrl = DMA_SourcePrivileged;
DMA_IStruct.DMA_DestProtCtrl = DMA_DestPrivileged;
DMA_IStruct.DMA_Mode = DMA_Mode_Basic;
Поле DMA_SourceBaseAddr определяет адрес источника данных. В приведенном примере в качестве него используется регистр ADC1_RESULT.
35
В поле DMA_DestBaseAddr необходимо записать адрес для сохранения результатов преобразований. В нашем случае в его качестве выступает буфер ADC_Buffer, который должен быть определен отдельно. Поле DMA_CycleSize используется для задания количества измерений, которое соответствует размеру буфера.
Поле DMA_SourceIncSize разрешает или запрещает автоматически увеличивать адрес
источника. В приведенном примере для инициализации использована константа
DMA_SourceIncNo, обозначающая запрет, так как работа производится с одним регистром ADC1_RESULT.
Далее необходимо определить способ обработки адреса приемника результатов
измерения. Для этого используется поле DMA_DestIncSize. В нашем случае адрес разрешено
автоматически увеличивать на два байта (половина машинного слова), что определяет
константа DMA_DestIncHalfWord. Размер шага в четыре байта определяется константой
DMA_DestIncWord.
Поле DMA_MemoryDataSize определяет размер в байтах передаваемой за один такт информации. В приведенном примере размер порции данных определен как два байта —
DMA_MemoryDataSize_HalfWord.
В поле DMA_NumContinuous количество циклов передачи данных, размер которых определен полем DMA_CycleSize. Для этого используется константа вида DMA_Transfers_х, где х = 2k (k может принимать значения от 0 до 10).
Поля DMA_SourceProtCtrl и DMA_DestProtCtrl включают режим защиты источника и приемника. В приведенном примере эти режимы включены. Поле DMA_Mode позволяет включить режим защиты DMA. В примере выбран базовый режим.
После произведенных действий необходимо настроить канал DMA. Для этого
заполняем поля структуры DMACIStruct:
DMACIStruct.DMA_PriCtrlData = &DMA_IStruct;
DMACIStruct.DMA_SelectDataStructure = DMA_CTRL_DATA_PRIMARY;
DMACIStruct.DMA_Priority = DMA_Priority_Default;
DMACIStruct.DMA_UseBurst = DMA_BurstClear.
Поле DMA_PriCtrlData позволяет учесть ранее сделанные настройки DMA, для чего
его инициализируют адресом структуры с настройками DMA. При этом в поле
DMA_SelectDataStructure нужно выбрать тип блока настроек. В нашем случае определен первичный блок.
Поле DMA_Priority определяет приоритет канала DMA (задан приоритет по умолчанию), а поле DMA_UseBurst определяет запрет на одиночные запросы к DMA (запрет снят).
Теперь нужно инициализировать полученной структурой канал DMA:
DMA_Init(DMA_Channel_ADC1, &DMACIStruct);
36
Далее снимаем запрет на запросы к DMA от ADC1, разрешаем работу DMA с ADC1 и задаем приоритет аппаратных прерываний от DMA как 1:
MDR_DMA->CHNL_REQ_MASK_CLR = 1 << DMA_Channel_ADC1;
MDR_DMA->CHNL_USEBURST_CLR = 1 << DMA_Channel_ADC1;
DMA_Cmd(DMA_Channel_ADC1, ENABLE);
NVIC_SetPriority(DMA_IRQn, 1);
Настройки АЦП в данном случае в целом аналогичны режиму одиночного преобразования за исключением поля:
ADCxIStruct.ADC_SamplingMode = ADC_SAMPLING_MODE_CICLIC_CONV.
Перед началом преобразований разрешаем прерывания от DMA:
NVIC_EnableIRQ(DMA_IRQn).
Полезной в работе с АЦП может оказаться организация автоматического переключения измерений по нескольким каналам. Этот режим оказывается необходимым
в случае подключения к микроконтроллеру нескольких аналоговых устройств. При этом
наиболее эффективным вариантом будет сочетание автоматического переключения каналов с использованием DMA.
В отличие от настроек предыдущего режима необходимо задать следующие
параметры работы микроконтроллера:
ADCx_IStruct.ADC_ChannelSwitching = ADC_CH_SWITCHING_Enable;
ADCx_IStruct.ADC_ChannelNumber = 0;
ADCx_IStruc.ADC_Channels = ADC_CH_TEMP_SENSOR_MSK | ADC6.
Эти настройки разрешают автоматическое переключение каналов в процессе работы
(ADC_CH_SWITCHING_Enable), из-за чего номер постоянно работающего канала определен как 0. В качестве рабочих каналов заданы ADC6 и канал датчика температуры.
Начало и ожидание окончания серии преобразований, а также обработчик прерываний
DMA такие же, как и в предыдущих режимах (см. выше). Особенностью является то, что при
работе с DMA можно указать только один буфер для сохранения результатов измерений,
поэтому его организацию рассмотрим подробнее. Следует отметить, что при организации
автоматического переключения каналов заранее неизвестно, с какого канала
микроконтроллер начнет преобразования. Номер канала вместе с результатом измерений по нему заносится в регистр ADC1_RESULT или ADC2_RESULT соответственно: биты
0 ÷ 11 содержат результат преобразования, биты 16 ÷ 20 содержат номер канала.
37
Но поскольку регистры результатов имеют разрядность 32 бита, буфер для сохранения их
DAC
Control
DAC2
Aout
REF
DAC1
Aout
REF
12
12
DAC1_REF
PE9
PE10
Порт E
DAC2_REF
DAC1_OUT
DAC2_OUT
PE0
PE1
значений должен состоять из 32-битовых элементов. При обработке результатов необходимо анализировать содержимое битов 16 ÷ 20 текущего элемента буфера для определения канала, по которому он был получен. В языке С для этого можно использовать операции сдвига, побитовые операции и тип данных «объединение» [7, 8, 12, 13].
2.3. Основы работы с цифро-аналоговым преобразователем
Цифро-аналоговый преобразователь (ЦАП или DAC) является устройством,
способным преобразовывать входной цифровой код в соответствующее напряжение
аналогового выходного сигнала с шагом дискретизации цифрового сигнала.
Микроконтроллеры серии 1986ВЕ9х имеют в своем составе два независимых ЦАП (DAC1 и DAC2) с разрядностью 12 бит каждый, что дает возможность получить на выходе 212 = 4 096 уровней напряжения (рис. 2.4). Необходимыми условиями функционирования ЦАП являются наличие напряжения питания (AUCC), аналогового заземления (AGND) и источник опорного напряжения (UREF). В простейшем случае применения ЦАП существует возможность объединения питания ЦАП и АЦП, что снижает точность
измерений, но дает возможность упростить схему функционирования микроконтроллера.
Для организации более точных измерений ЦАП нуждается в отдельном источнике питания. Помимо этого, питание аналоговой части ЦАП может быть использовано как источник
опорного напряжения. Выбор данных альтернатив для микроконтроллера осуществляется
программно [7, 8, 12, 14].
и DAC2_DATA для DAC1 и DAC2 соответственно. Выходное напряжение DACOUT для DAC2 формируется на выводе микроконтроллера, совпадающего с линией ввода-вывода
Необходимый для функционирования ЦАП код заносится в регистры DAC1_DATA
Рис. 2.4. Структурная схема контроллера ЦАП
38
PE0. Формируемое выходное напряжение для ЦАП можно определить по формуле
DACOUT = UREF*DAC2_DATA/4095 (4 095 является максимально возможным формируемым напряжением в диапазоне 0 ÷ 2
12
- 1) [7, 8, 12, 14]. При этом
из-за дискретности входного сигнала ЦАП формируемое им выходное напряжение будет иметь «ступенчатый» характер с шагом DACSTEP = UREF/4095.
Перед началом работы с ЦАП его нужно настроить и разрешить тактирование. Для DAC2 разрешение тактирования производится вызовом функции:
RST_CLK_PCLKcmd(RST_CLK_PCLK_DAC | RST_CLK_PCLK_PORTE, ENABLE);
Далее нужно сконфигурировать линию PE0 как аналоговую, сбросить предыдущие
настройки DAC2 и инициализировать его:
PORT_InitTypeDef PortIStruct;
PORT_StructInit(&PortIStruct);
PortIStruct.PORT_Pin = PORT_Pin_0;
PortIStruct.PORT_OE = PORT_OE_OUT;
PortIStruct.PORT_MODE = PORT_MODE_ANALOG;
PORT_Init(MDR_PORTE, &PortIStruct);
DAC_DeInit();
DAC2_Init(DAC2_AVCC).
Для функции DAC2_Init константа DAC2_AVCC обозначает использование в качестве источника опорного напряжения AUCC. Альтернативой ей является константа DAC2_REF, обозначающая использование в этом качестве внешнего источника,
соединяемого с линией ввода/вывода PE1. После этого необходимо разрешить работу ЦАП
вызовом функции:
DAC2_Cmd(ENABLE).
В результате линия PE0 будет соединена с выходом DAC2.
Одиночное преобразование выполняется с помощью функций DAC1_SetData и DAC2_SetData для DAC1 и DAC2 соответственно. Аргументом функций является
цифровое значение для преобразования. При этом в микроконтроллерах серии 1986ВЕ9х нет
встроенного элемента, отслеживающего окончание преобразования ЦАП. Это объясняется
необходимостью формирования на выходе ЦАП аналогового сигнала с заранее заданной
формой. Для такого случая одиночное преобразование не имеет смысла. Вместо него
применяется периодическое преобразование с использованием прямого доступа к памяти
(DMA). В режиме использования DMA первым делом необходимо в доступной
микроконтроллеру памяти организовать массив преобразуемой информации. Затем нужно
инициализировать DMA и ЦАП для совместной работы, а также аппаратный таймер с целью
39
отсчета периодов преобразования. После этого становится возможным генерировать сигнал
на выходе ЦАП. Этот процесс выполняется циклически с заданным числом повторений,
не задействую при этом ядро микроконтроллера. Признаком окончания ЦАП выполнения
преобразований является аппаратное прерывание от DMA.
Сигнал для преобразований описывается следующими характеристиками: размер
буфера, используемая частота, постоянная составляющая, амплитуда синусоидального или
пилообразного сигнала. Как уже было указано, ЦАП преобразует код ступенчатым сигналом.
Увеличение размеров буфера увеличивает точность аппроксимации выходной функции,
но снижает возможности передачи требуемой частоты. Поэтому существует рекомендация
задавать размер буфера не более 256 элементов [7, 8, 12, 14].
Для настойки DMA и канала DMA необходимо использовать структуры типов:
DMA_CtrlDataInitTypeDef и DMA_ChannelInitTypeDef:
DMA_CtrlDataInitTypeDef DMAIStruct;
DMA_ChannelInitTypeDef DMACIStruct.
Данные структуры необходимо определить в тексте программы на глобальном уровне [7, 8, 12, 14]. Далее необходимо разрешить тактирование для DMA и интерфейсов SSP, временно запретить аппаратные прерывания и очистить настройки DMA:
RST_CLK_PCLKcmd (RST_CLK_PCLK_DMA | RST_CLK_PCLK_SSP1 | RST_CLK_PCLK_SSP2, ENABLE);
NVIC->ICPR[0] = 0xFFFFFFFF;
NVIC->ICER[0] = 0xFFFFFFFF;
DMA_DeInit();
Производим инициализацию структуры для настройки DMA и определяем значения
ее полей:
DMA_StructInit(&DMACIStruct);
DMAIStruct.DMA_DestBaseAddr = (uint32_t)(&(MDR_DAC->DAC2_DATA));
DMAIStruct.DMA_SourceBaseAddr = (uint32_t) BufSignal;
DMAIStruct.DMA_CycleSize = 32;
DMAIStruct.DMA_DestIncSize = DMA_DestIncNo;
DMAIStruct.DMA_SourceIncSize = DMA_SourceIncHalfword;
DMAIStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMAIStruct.DMA_NumContinuous = 32;
DMAIStruct.DMA_SourceProtCtrl = DMA_SourcePrivileged;
DMAIStruct.DMA_DestProtCtrl = DMA_DestPrivileged;
DMAIStruct.DMA_Mode = DMA_Mode_Basic;
40
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]