Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 15.12.2019
Сообщений: 338

stm32f1 cmsis PWM-ADC-DMA

07.04.2020, 19:51. Показов 3900. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как сделать так чтобы АЦП управляло ШИМом через ДМА.То есть АЦП в ДМА канал ШИМа в ДМА а как же они пересикатся будут?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.04.2020, 19:51
Ответы с готовыми решениями:

stm32f1 cmsis шим
Как настроить шим на таймере дайте алгоритм?

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

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

17
Эксперт по электронике
6822 / 3247 / 337
Регистрация: 28.10.2011
Сообщений: 12,676
Записей в блоге: 7
07.04.2020, 21:50
Настраиваете АЦП источником DMA, а приемником - CCRx регистр таймера.
0
0 / 0 / 0
Регистрация: 15.12.2019
Сообщений: 338
07.04.2020, 22:33  [ТС]
А как управлять через ДМА?
0
0 / 0 / 0
Регистрация: 15.12.2019
Сообщений: 338
12.04.2020, 15:46  [ТС]
Не выходит так напрямую.Может через буфер?
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
12.04.2020, 16:29
Цитата Сообщение от locm Посмотреть сообщение
Настраиваете АЦП источником DMA, а приемником - CCRx регистр таймера.
DMA в кортексах F1 не поддерживает схему peripheral-peripheral. Предполагаемая схема доступна только с использованием двух каналов DMA с буфером в RAMе.
0
0 / 0 / 0
Регистрация: 15.12.2019
Сообщений: 338
12.04.2020, 20:11  [ТС]
Так что нельзя АЦП-ДМА а потом ДМА- ТАЙМЕР.Вот так?
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
12.04.2020, 20:46
Цитата Сообщение от ivan rusev Посмотреть сообщение
ак что нельзя АЦП-ДМА а потом ДМА- ТАЙМЕР
...Дожевывая свою шляпу, скажу, что ошибался. Наверное, можно. Глядя на стр.274 ДШ сказано, что есть "peripheral-2-peripheral".
0
0 / 0 / 0
Регистрация: 15.12.2019
Сообщений: 338
13.04.2020, 04:45  [ТС]
• Peripheral-to-memory and memory-to-peripheral, and peripheral-to-peripheral
transfers да можно но как реализовать это?
0
Эксперт по электронике
6822 / 3247 / 337
Регистрация: 28.10.2011
Сообщений: 12,676
Записей в блоге: 7
13.04.2020, 13:52
Цитата Сообщение от ivan rusev Посмотреть сообщение
как реализовать это?
Хоть что-то пробовали делать?
0
0 / 0 / 0
Регистрация: 15.12.2019
Сообщений: 338
13.04.2020, 14:45  [ТС]
да пока не выходит.
0
Эксперт по электронике
6822 / 3247 / 337
Регистрация: 28.10.2011
Сообщений: 12,676
Записей в блоге: 7
13.04.2020, 16:09
Выкладывайте что что есть.
0
0 / 0 / 0
Регистрация: 15.12.2019
Сообщений: 338
13.04.2020, 22:39  [ТС]
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
void adc1_init(void)
{
 
        RCC->CFGR &=~ RCC_CFGR_ADCPRE;
 
        RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;
        GPIOA->CRL&=~GPIO_CRL_CNF1;
        GPIOA->CRL&=~ GPIO_CRL_MODE1;
        GPIOA->CRL&=~GPIO_CRL_CNF2;
        GPIOA->CRL&=~ GPIO_CRL_MODE2;
        RCC->APB2ENR |=  RCC_APB2ENR_ADC1EN;
        RCC->APB2ENR |=  RCC_APB2ENR_ADC2EN;
 
        //RCC->CFGR |= RCC_CFGR_ADCPRE_DIV2;
 
        //подаем тактирование АЦП
         ADC1->CR2 |= ADC_CR2_RSTCAL;
         while (!(ADC1->CR2 & ADC_CR2_RSTCAL))
         {
         }
 
         ADC1->CR2 |= ADC_CR2_CAL;
        // while (!(ADC1->CR2 & ADC_CR2_CAL));
        // {
        // }
 
         ADC1->CR2 |=ADC_CR2_CONT;//включить АЦП
         ADC1->CR2    |=  ADC_CR2_EXTSEL;
 
         ADC1->CR2  |= ADC_CR2_EXTTRIG;
        // ADC1->CR1&=~ADC_CR1_DUALMOD;
          ADC1->SMPR2&=~ ADC_SMPR2_SMP1_0; //1
              ADC1->SMPR2&=~ADC_SMPR2_SMP1_1; //1
               ADC1->SMPR2 &=~ ADC_SMPR2_SMP1_2; //1
 
                ADC1->SQR3   |= ADC_SQR3_SQ1_0;   //1 IN1
                      ADC1->SQR3   &= ~ ADC_SQR3_SQ1_1;     //0
                      ADC1->SQR3   &= ~ADC_SQR3_SQ1_2;   //0
                      ADC1->SQR3   &=~  ADC_SQR3_SQ1_3;     //0
                      ADC1->SQR3   &= ~ADC_SQR3_SQ1_4;
                      ADC1->CR2 |=  ADC_CR2_ADON;
                     ADC1->CR2 |= ADC_CR2_SWSTART;
//}
//void adc2_init(void)
//{
    //RCC->CFGR &=~ RCC_CFGR_ADCPRE;
    //RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;
    //      GPIOA->CRL&=~GPIO_CRL_CNF2;
        //      GPIOA->CRL&=~ GPIO_CRL_MODE2;
        //      RCC->APB2ENR |=  RCC_APB2ENR_ADC2EN;
                //  RCC->CFGR |= RCC_CFGR_ADCPRE_DIV2;
           // ADC2->CR2 |= ADC_CR2_RSTCAL;
                // while (!(ADC2->CR2 & ADC_CR2_RSTCAL))
                // {
                // }
 
            //   ADC2->CR2 |= ADC_CR2_CAL;
                //ADC2->CR2 |=ADC_CR2_CONT;//включить АЦП
                //ADC2->CR2    |=  ADC_CR2_EXTSEL;
            //  ADC2->CR2  |= ADC_CR2_EXTTRIG;
                //ADC2->SMPR2&=~ ADC_SMPR2_SMP2_0; //1
            //  ADC2->SMPR2&=~ADC_SMPR2_SMP2_1; //1
            //  ADC2->SMPR2 &=~ ADC_SMPR2_SMP2_2; //1
         //     ADC2->SQR3   &=~ ADC_SQR3_SQ1_0;   //1 IN1
           //   ADC2->SQR3   |=  ADC_SQR3_SQ1_1;     //0
          //    ADC2->SQR3   &= ~ADC_SQR3_SQ1_2;   //0
           //   ADC2->SQR3   &=~  ADC_SQR3_SQ1_3;     //0
          //  ADC2->SQR3   &= ~ADC_SQR3_SQ1_4;
          //  ADC2->CR2 |=  ADC_CR2_ADON;
}
void DMA_init(void)
{
    RCC->AHBENR|=RCC_AHBENR_DMA1EN;
    DMA1_Channel1->CPAR=(uint32_t)&ADC1->DR;
    DMA1_Channel1->CMAR=(uint32_t)&TIM4->CCR1;
    DMA1_Channel1->CNDTR=32;
    DMA1_Channel1->CCR&=~DMA_CCR_CIRC;
    DMA1_Channel1->CCR&=~DMA_CCR_PINC ;
    DMA1_Channel1->CCR&=~DMA_CCR_PSIZE ;
    DMA1_Channel1->CCR&=~DMA_CCR_MSIZE;
    DMA1_Channel1->CCR= DMA_CCR_DIR ;
    DMA1_Channel1->CCR=DMA_CCR_MINC;
    ADC1->CR2|=ADC_CR2_DMA;
}
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
14.04.2020, 13:41
ivan rusev,
Цитата Сообщение от ivan rusev Посмотреть сообщение
DMA1_Channel1->CCR= DMA_CCR_DIR ;
    DMA1_Channel1->CCR=DMA_CCR_MINC;
Думаю, что здесь что- то не то. Перезатираете за собой.

Добавлено через 6 минут
Да и вообще странная настройка. Я бы так попробовал
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void DMA_init(void)
{
    RCC->AHBENR|=RCC_AHBENR_DMA1EN;
    DMA1_Channel1->CPAR=(uint32_t)&ADC1->DR;
    DMA1_Channel1->CMAR=(uint32_t)&TIM4->CCR1;
    DMA1_Channel1->CNDTR= 1;  //Одна транзакция
    DMA1_Channel1->CCR |= DMA_CCR_CIRC; //Повтор транзакции
    DMA1_Channel1->CCR &= ~DMA_CCR_PINC ; // без инкремента
    DMA1_Channel1->CCR |= DMA_CCR_PSIZE_0 ; //  размер 16 бит
    DMA1_Channel1->CCR |= DMA_CCR_MSIZE_0; // размер 16 бит
    DMA1_Channel1->CCR &= ~DMA_CCR_DIR; // из периферии
    DMA1_Channel1->CCR &= ~DMA_CCR_MINC; // не инкрементируем пункт назначения
    ADC1->CR2|=ADC_CR2_DMA;
}
0
0 / 0 / 0
Регистрация: 15.12.2019
Сообщений: 338
14.04.2020, 17:05  [ТС]
мне кажется что ещё в настройках ацп бит разрешения сканирования.?

Добавлено через 1 минуту
Видите я недоучка.

Добавлено через 32 минуты
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
void adc1_init(void)
{
 
        RCC->CFGR &=~ RCC_CFGR_ADCPRE;
 
        RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;
        GPIOA->CRL&=~GPIO_CRL_CNF1;
        GPIOA->CRL&=~ GPIO_CRL_MODE1;
        GPIOA->CRL&=~GPIO_CRL_CNF2;
        GPIOA->CRL&=~ GPIO_CRL_MODE2;
        RCC->APB2ENR |=  RCC_APB2ENR_ADC1EN;
        RCC->APB2ENR |=  RCC_APB2ENR_ADC2EN;
 
        //RCC->CFGR |= RCC_CFGR_ADCPRE_DIV2;
 
        //подаем тактирование АЦП
         ADC1->CR2 |= ADC_CR2_RSTCAL;
         while (!(ADC1->CR2 & ADC_CR2_RSTCAL))
         {
         }
 
         ADC1->CR2 |= ADC_CR2_CAL;
        // while (!(ADC1->CR2 & ADC_CR2_CAL));
        // {
        // }
 
         ADC1->CR2 |=ADC_CR2_CONT;//включить АЦП
         ADC1->CR2    |=  ADC_CR2_EXTSEL;
     //    ADC1->CR1|=ADC_CR1_SCAN ;
         ADC1->CR2  |= ADC_CR2_EXTTRIG;
        // ADC1->CR1&=~ADC_CR1_DUALMOD;
          ADC1->SMPR2&=~ ADC_SMPR2_SMP1_0; //1
              ADC1->SMPR2&=~ADC_SMPR2_SMP1_1; //1
               ADC1->SMPR2 &=~ ADC_SMPR2_SMP1_2; //1
 
                ADC1->SQR3   |= ADC_SQR3_SQ1_0;   //1 IN1
                      ADC1->SQR3   &= ~ ADC_SQR3_SQ1_1;     //0
                      ADC1->SQR3   &= ~ADC_SQR3_SQ1_2;   //0
                      ADC1->SQR3   &=~  ADC_SQR3_SQ1_3;     //0
                      ADC1->SQR3   &= ~ADC_SQR3_SQ1_4;
                      ADC1->CR2 |=  ADC_CR2_ADON;
                     ADC1->CR2 |= ADC_CR2_SWSTART;
//}
//void adc2_init(void)
//{
    //RCC->CFGR &=~ RCC_CFGR_ADCPRE;
    //RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;
    //      GPIOA->CRL&=~GPIO_CRL_CNF2;
        //      GPIOA->CRL&=~ GPIO_CRL_MODE2;
        //      RCC->APB2ENR |=  RCC_APB2ENR_ADC2EN;
                //  RCC->CFGR |= RCC_CFGR_ADCPRE_DIV2;
           // ADC2->CR2 |= ADC_CR2_RSTCAL;
                // while (!(ADC2->CR2 & ADC_CR2_RSTCAL))
                // {
                // }
 
            //   ADC2->CR2 |= ADC_CR2_CAL;
                //ADC2->CR2 |=ADC_CR2_CONT;//включить АЦП
                //ADC2->CR2    |=  ADC_CR2_EXTSEL;
            //  ADC2->CR2  |= ADC_CR2_EXTTRIG;
                //ADC2->SMPR2&=~ ADC_SMPR2_SMP2_0; //1
            //  ADC2->SMPR2&=~ADC_SMPR2_SMP2_1; //1
            //  ADC2->SMPR2 &=~ ADC_SMPR2_SMP2_2; //1
         //     ADC2->SQR3   &=~ ADC_SQR3_SQ1_0;   //1 IN1
           //   ADC2->SQR3   |=  ADC_SQR3_SQ1_1;     //0
          //    ADC2->SQR3   &= ~ADC_SQR3_SQ1_2;   //0
           //   ADC2->SQR3   &=~  ADC_SQR3_SQ1_3;     //0
          //  ADC2->SQR3   &= ~ADC_SQR3_SQ1_4;
          //  ADC2->CR2 |=  ADC_CR2_ADON;
}
void DMA_init(void)
{
    RCC->AHBENR|=RCC_AHBENR_DMA1EN;
    DMA1_Channel1->CPAR=(uint32_t)&ADC1->DR;
    DMA1_Channel1->CMAR=(uint32_t)&TIM4->CCR2;
    DMA1_Channel1->CNDTR=1;
    DMA1_Channel1->CCR|=DMA_CCR_CIRC;
    DMA1_Channel1->CCR&=~DMA_CCR_PINC ;
    DMA1_Channel1->CCR&=~DMA_CCR_MINC;
    DMA1_Channel1->CCR|=DMA_CCR_PSIZE_0 ;
    DMA1_Channel1->CCR|=DMA_CCR_MSIZE_0;
    DMA1_Channel1->CCR&=~DMA_CCR_DIR ;
 
    ADC1->CR2|=ADC_CR2_DMA;
}
void init_pwm_timer4(void)
{
 
    RCC->APB2ENR|=RCC_APB2ENR_IOPBEN ;
 
     GPIOB->CRL|=GPIO_CRL_CNF6_1;
     GPIOB->CRL&=~GPIO_CRL_CNF6_0;
   GPIOB->CRL|= GPIO_CRL_MODE6_1;
   GPIOB->CRL|= GPIO_CRL_MODE6_0;
     //--настройка второго канала шим-порт7------//
     GPIOB->CRL|=GPIO_CRL_CNF7_1;
         GPIOB->CRL&=~GPIO_CRL_CNF7_0;
       GPIOB->CRL|= GPIO_CRL_MODE7_1;
         GPIOB->CRL|= GPIO_CRL_MODE7_0;
     RCC->APB2ENR|=RCC_APB2ENR_AFIOEN;
    AFIO->MAPR&=~AFIO_MAPR_TIM4_REMAP;
    RCC->APB1ENR|= RCC_APB1ENR_TIM4EN ;
    TIM4->PSC= 0;
    TIM4->ARR= 65535;
    TIM4->CCMR1&=~TIM_CCMR1_CC1S;//настройка канала 1 на выход.
    TIM4->CCMR1&=~TIM_CCMR1_CC2S;//настройка канала 2 на выход.
    TIM4->CR1&=~TIM_CR1_DIR;
    TIM4->CCMR1|= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1;//|TIM_CCMR1_OC1M_0;//;//
    TIM4->CCMR1|= TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1;//|TIM_CCMR1_OC2M_0;//
 
    TIM4->CCMR1|=TIM_CCMR1_OC1PE;
    TIM4->CCMR1|=TIM_CCMR1_OC2PE;
 
 
 
 
     TIM4->CCER |=TIM_CCER_CC1E;
     TIM4->CCER |=TIM_CCER_CC2E;
     TIM4->CCER &=~TIM_CCER_CC1P;
     TIM4->CCER &=~TIM_CCER_CC2P;
     TIM4->CR1|=TIM_CR1_ARPE;
    TIM4->EGR|= TIM_EGR_UG;
     // TIM4->CCR1=30000;
    TIM4->CR1|=  TIM_CR1_CEN;
}
Так не работает.Может попробовать два канала Дма .Или как то по другому.
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
14.04.2020, 18:03
ivan rusev, A DMA вообще включается?
C
1
DMA1_Channel1->CCR |= DMA_CCR_EN;
0
0 / 0 / 0
Регистрация: 15.12.2019
Сообщений: 338
14.04.2020, 19:18  [ТС]
понял.

Добавлено через 48 минут
заработало.Только одно но DMA1_Channel1->CPAR=(uint32_t)&ADC1->DR*16; Вот так не хочет работать число Ацп от 0-4095.0
А таймера0 65535?Добавлено через 22 минуты
да и ещё у меня чегото канал 1 Шим ярче 2 канала Настроено одинаково?Таймер4
0
Эксперт по электронике
6822 / 3247 / 337
Регистрация: 28.10.2011
Сообщений: 12,676
Записей в блоге: 7
14.04.2020, 19:55
Цитата Сообщение от ivan rusev Посмотреть сообщение
Только одно но DMA1_Channel1->CPAR=(uint32_t)&ADC1->DR*16; Вот так не хочет работать
Вы умножаете указатель на 16.
Нужно ограничить значение таймера на уровне 4095, записав это число в регистр ARR и получите то, что пытаетесь добиться умножая указатель.
0
0 / 0 / 0
Регистрация: 15.12.2019
Сообщений: 338
14.04.2020, 20:20  [ТС]
понял.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.04.2020, 20:20
Помогаю со студенческими работами здесь

Stm32f407 PWM CMSIS
Юзайте шим кому надо, используются 2,3,4 таймер /* TIM2 PA0 CH_1 AF1 PA1 CH_2 AF1 PA2 CH_3 AF1 ...

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

stm32f1 stm32f4 cmsis RCC настройка как проверить работу HSE&
/* * main.c * * Created on: 20 бер. 2020 р. * Author: Ivan */ #include "main.h" #include "stm32f103xb.h" ...

ADC через CMSIS на STM32F4
Всем привет Пытаюсь запустить ADC через CMSIS на STM32F4 и не идут данные с АЦП в чем может быть проблема? {del} Есть у кого пример...

Usart Dma cmsis
Подскажите что не так? уарт нормально работает, пытаюсь подключить дма ничего не получается void init(void) { RCC->AHB1ENR |=...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru