2 / 2 / 3
Регистрация: 20.12.2015
Сообщений: 339

Stm32f4 adc+dma+tim1

06.12.2018, 18:26. Показов 2367. Ответов 7

Студворк — интернет-сервис помощи студентам
Есть исходная прошивка устройства, там один канал в ADC_TripleMode_Interl необходимо заменить этот режим на два обычных каналов (медленных). В случай замене адреса #define CDR_ADDRESS ((uint32_t)0x40012308) в результате ничего не выдает.
Вот исходник
Кликните здесь для просмотра всего текста

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
void initialization_ADC(void) {
 
GPIO_InitTypeDef        GPIO_InitStructure;
ADC_InitTypeDef         ADC_InitStructure;
ADC_CommonInitTypeDef   ADC_CommonInitStructure;
DMA_InitTypeDef         DMA_InitStructure;
 
    ADC_StructInit(&ADC_InitStructure);
    ADC_CommonStructInit(&ADC_CommonInitStructure);
    DMA_StructInit(&DMA_InitStructure);
 
    /* Configure PB11, PB15 in pushpull mode */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    //  ...
    /* Configure PB1, PB8 in output mode */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    // ..
#ifdef __ILX_751B
    GPIOB->BSRRH = GPIO_Pin_1;  // Set High ROG
    GPIOB->BSRRH = GPIO_Pin_8;  // Set High SHUT
#endif
#ifdef __ILX_1412S
    GPIOB->BSRRL = GPIO_Pin_1;  // Set Low HOLD
    GPIOB->BSRRL = GPIO_Pin_8;  // Set Low SI1
#endif
 
/******************************************************************************/
/*               ADCs interface clock and pin configuration                   */
/******************************************************************************/
// === DMA =====================================================================
#define CDR_ADDRESS         ((uint32_t)0x40012308)   
 
    /* Enable peripheral clocks */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2 | RCC_APB2Periph_ADC3, ENABLE);
    /* Enable peripheral clocks *************************************************/
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 , ENABLE);
 
    /* Configure ADC Channel N pin as analog input *****************************/ 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
 
    /* DMA2 Stream0 channel0 configuration **************************************/
    DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    DMA_InitStructure.DMA_PeripheralBaseAddr = CDR_ADDRESS;
    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&t_data_0.e.data[0];
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
    DMA_InitStructure.DMA_BufferSize = 0;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;               
    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    DMA_Init(DMA2_Stream0, &DMA_InitStructure);
 
    NVIC_SetPriority(DMA2_Stream0_IRQn, 1);
    NVIC_EnableIRQ(DMA2_Stream0_IRQn);
 
    /* ADC Common configuration *************************************************/
    ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles;
    ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_2;    
    ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div8;                 // ADC_clk = 30 000 000 (Triple sample = 30 000 000 / 5 = 6 000 000 [Hz])
    ADC_CommonInit(&ADC_CommonInitStructure);
 
    /* ADC1 regular channel N configuration ************************************/
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
#ifdef __ILX_751B
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
#endif
#ifdef __ILX_1412S
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
#endif
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC2;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfConversion = 1;
 
    ADC_Init(ADC1, &ADC_InitStructure);
    /* ADC1 regular channel configuration */
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_3Cycles);
 
    ADC_Init(ADC2, &ADC_InitStructure);
    /* ADC2 regular channel configuration */
    ADC_RegularChannelConfig(ADC2, ADC_Channel_0, 1, ADC_SampleTime_3Cycles);
 
    ADC_Init(ADC3, &ADC_InitStructure); 
    /* ADC3 regular channel configuration */
    ADC_RegularChannelConfig(ADC3, ADC_Channel_2, 1, ADC_SampleTime_3Cycles);
 
    /* Enable ADC1 DMA */
    ADC_DMACmd(ADC1, ENABLE);
 
    /* Enable DMA request after last transfer (multi-ADC mode) ******************/
    ADC_MultiModeDMARequestAfterLastTransferCmd(ENABLE);
 
    /* Clear DMA2 Stream 0 flags */
    DMA2->LIFCR |= (uint32_t)(DMA_FLAG_HTIF0 | DMA_FLAG_TCIF0);
 
    /* Enable DMA Stream Transfer Complete interrupt */
    DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE);
 
/******************************************************************************/
/*               PWM interface clock and pin configuration                   */
/******************************************************************************/
#define __Timer_F_Freq          6000000                                         // Hz
#define __Period_F_Mid          ((SystemCoreClock) / __Timer_F_Freq)            // 1 / Hz
 
TIM_TimeBaseInitTypeDef     TIM_TimeBaseStructure;
TIM_OCInitTypeDef           TIM_OCInitStructure;
 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    /* GPIOB Configuration: Channel 2N as alternate function push-pull */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_TIM1); 
 
    // TIM1 Configuration ------------------CLK-----------------------------------
    /* TIM_1clock enable */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
 
    uint16_t Timer_F_period = __Period_F_Mid & ~0x01;
    /* Time Base configuration */
    TIM_TimeBaseStructure.TIM_Period = Timer_F_period - 1;
    TIM_TimeBaseStructure.TIM_Prescaler = 0;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
 
    /* Channel 2N Configuration in TIM_OCMode_PWM mode */
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
    TIM_OCInitStructure.TIM_Pulse = (uint16_t) (Timer_F_period >> 1);
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Set;
    TIM_OC2Init(TIM1, &TIM_OCInitStructure);
 
    TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
 
    /* TIM1 Main Output Enable */
    TIM_CtrlPWMOutputs(TIM1, ENABLE);
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.12.2018, 18:26
Ответы с готовыми решениями:

stm32f4 + ADC + DMA
Доброго времени суток. Вопрос такой... Сделал АЦП на плате ф4дискавери, и получается что когда ножка висит ни на что не нагруженая -...

STM32F4 + ADC + TIMER + DMA
void TIM8_Config() { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); ...

Таймер, ADC и DMA на STM32F4 (Discovery)
Привет всем. Надо запускать ADC1 по таймеру. По мотивам доки и форумов написал следующее - вложение. В main пишу: ...

7
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
07.12.2018, 14:06
Umar Egamberdie,
Ваш исходник вообще работает?

Цепочка действий:
1) Определиться на каких регулярных каналах будут висеть ваши входы АЦП и проинициализировать их
2) Определить на котором АЦП эти ноги висят, и какой DMA поток к нему относится.
3) Настроить DMA на адрес регистра DR этого АЦП
4) Определить какой таймер и с каким эвентом триггерит данный АЦП
5) Инициализировать этот таймер.
6) Инициализировать АЦП с разрешением DMA, триггера, настройкой данных каналов в повторяющемся режиме.
Профит. Проще заново написать)

Добавлено через 9 минут
Есть стойкие убеждения что исходник то у вас нерабочий

Добавлено через 5 минут

Не по теме:

Я надеюсь это не тестовое задание при устройстве на работу, а то я видел уже такие, где специально ошибок наляпали)

0
5 / 5 / 0
Регистрация: 17.09.2018
Сообщений: 43
07.12.2018, 14:16
Цитата Сообщение от Umar Egamberdie Посмотреть сообщение
#define CDR_ADDRESS ((uint32_t)0x40012308)
А что находится по этому адресу ? А то даташит на АЦП заканчивается адресом 0x40012304 (ADC_CCR). И второе
Цитата Сообщение от Umar Egamberdie Посмотреть сообщение
DMA_InitStructure.DMA_BufferSize = 0;
судя по даташиту "If the value of this register is zero, no transaction can be served even if the stream is enabled." ничего пересылать и не должно
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
07.12.2018, 14:26
Void1509,
Цитата Сообщение от Void1509 Посмотреть сообщение
судя по даташиту "If the value of this register is zero, no transaction can be served even if the stream is enabled." ничего пересылать и не должно
ну мало ли это в какой нибудь другой части программы настраивается на ходу, на количество необходимых отсчетов.
Судя по тому что ни таймер ни дма ни АЦП не включены вообще в этой функции они либо включаются где то снаружи либо не работают вообще.
Цитата Сообщение от Void1509 Посмотреть сообщение
А что находится по этому адресу ? А то даташит на АЦП заканчивается адресом 0x40012304 (ADC_CCR)
По адресу (uint32_t)0x40012308 согласно находится регистр ADC_CDR. Так как ТС точную модель камня не указал, взял 405 ибо там точно есть Triple mode. И это как раз регистр куда АЦП в этом режиме данные сваливает.

Umar Egamberdie,
а АЦП вообще в независимый режим настроен, а не в трипл мод.
C++
1
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
соответственно данные от каждого АЦП лежат в своем DR регистре, а не в CDR
0
5 / 5 / 0
Регистрация: 17.09.2018
Сообщений: 43
07.12.2018, 14:45
Цитата Сообщение от _SayHello Посмотреть сообщение
ну мало ли это в какой нибудь другой части программы настраивается на ходу, на количество необходимых отсчетов.
- то есть, читать даташит все равно не буду, даже не уговаривайте ! Ладно, я вам немного процитирую - "This register can be written only when the stream is disabled. When the stream is enabled, this register is read-only, indicating the remaining data items to be transmitted. This register decrements after each DMA transfer."
Это про тот же регистр.

Да, я смотрел 401, в 405 есть CDR, но пересылки все равно не будет, так как количество пересылок равно 0.
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
07.12.2018, 14:48
Void1509,
Цитата Сообщение от Void1509 Посмотреть сообщение
- то есть, читать даташит все равно не буду, даже не уговаривайте ! Ладно, я вам немного процитирую - "This register can be written only when the stream is disabled. When the stream is enabled, this register is read-only, indicating the remaining data items to be transmitted. This register decrements after each DMA transfer."
Если вы в коде ТСа найдете то место где поток DMA становится в состояние Enabled, то я с вами соглашусь. RM я читать умею и как с DMA работать знаю.
0
5 / 5 / 0
Регистрация: 17.09.2018
Сообщений: 43
07.12.2018, 15:01
Да, действительно в приведенном куске нет запуска канала. Но учитывая что он для инициализации использует SPL структуру, вряд ли он в последующем ее переинициализирует.
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
07.12.2018, 15:04
Void1509, а для запуска и изменения количества пересылок в SPL и не нужна эта структура. там это делается через
функции
C
1
void DMA_Cmd(DMA_Stream_TypeDef* DMAy_Streamx, FunctionalState NewState);
C
1
void DMA_SetCurrDataCounter(DMA_Stream_TypeDef* DMAy_Streamx, uint16_t Counter);
либо напрямую через регистры.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.12.2018, 15:04
Помогаю со студенческими работами здесь

STM32F4 ADC + DMA при передачи 1 байта входит в прерывания через 1 бит
Доброго времени - столкнулся с проблемкой Синий луч - данные Желтый луч - строб Красный луч - GPIOC (PC0) для контроля...

STM32F4Discovery - ADC DMA и FSMC DMA
Привет всем. Вынужден опять обратиться за Вашей помощью :) Ситуация такая. 1. Дисплей работает через FSMC. Написал драйвер...

stm32f407+ADC+DMA. Проблема с DMA
Доброго дня! Новичок в stm, первый проект, начальные наброски, не понимаю,почему не работает эта связка(в заголовке). Есть несколько...

ADC->DMA->SDIO (или NAND через FSMC) без остановки в обработчике прерываний DMA на STM32F407VG, реально или нет?
Добрый день. Столкнулся с необходимостью писать большой объём данных АЦП с высокой скоростью. Каналов 8. Частота АЦП максимальная. ...

TIMx_DIER (TIM1 DMA interrupt enable register)
здравсвтуйте уважаемые форумчане. Помогите пожалуйста разобраться, какую роль в разрешениии прерывания играет DMA. Насколько я понял, это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

Новые блоги и статьи
И решил я переделать этот ноут в машину для распределенных вычислений
Programma_Boinc 09.11.2025
И решил я переделать этот ноут в машину для распределенных вычислений Всем привет. А вот мой компьютер, переделанный из ноутбука. Был у меня ноут асус 2011 года. Со временем корпус превратился. . .
Мысли в слух
kumehtar 07.11.2025
Заметил среди людей, что по-настоящему верная дружба бывает между теми, с кем нечего делить.
Новая зверюга
volvo 07.11.2025
Подарок на Хеллоуин, и теперь у нас кроме Tuxedo Cat есть еще и щенок далматинца: Хочу еще Симбу взять, очень нравится. . .
Инференс ML моделей в Java: TensorFlow, DL4J и DJL
Javaican 05.11.2025
Python захватил мир машинного обучения - это факт. Но когда дело доходит до продакшена, ситуация не так однозначна. Помню проект в крупном банке три года назад: команда data science натренировала. . .
Mapped types (отображённые типы) в TypeScript
Reangularity 03.11.2025
Mapped types работают как конвейер - берут существующую структуру и производят новую по заданным правилам. Меняют модификаторы свойств, трансформируют значения, фильтруют ключи. Один раз описал. . .
Адаптивная случайность в Unity: динамические вероятности для улучшения игрового дизайна
GameUnited 02.11.2025
Мой знакомый геймдизайнер потерял двадцать процентов активной аудитории за неделю. А виновником оказался обычный генератор псевдослучайных чисел. Казалось бы - добавил в карточную игру случайное. . .
Протоколы в Python
py-thonny 31.10.2025
Традиционная утиная типизация работает просто: попробовал вызвать метод, получилось - отлично, не получилось - упал с ошибкой в рантайме. Протоколы добавляют сюда проверку на этапе статического. . .
C++26: Read-copy-update (RCU)
bytestream 30.10.2025
Прошло почти двадцать лет с тех пор, как производители процессоров отказались от гонки мегагерц и перешли на многоядерность. И знаете что? Мы до сих пор спотыкаемся о те же грабли. Каждый раз, когда. . .
Изображения webp на старых x32 ОС Windows XP и Windows 7
Argus19 30.10.2025
Изображения webp на старых x32 ОС Windows XP и Windows 7 Чтобы решить задачу, использовал интернет: поисковики Google и Yandex, а также подсказки Deep Seek. Как оказалось, чтобы создать. . .
Passkey в ASP.NET Core identity
stackOverflow 29.10.2025
Пароли мертвы. Нет, серьезно - я повторяю это уже лет пять, но теперь впервые за это время чувствую, что это не просто красивые слова. В . NET 10 команда Microsoft внедрила поддержку Passkey прямо в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru