Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » Архив » STM32 DMA burst


STM32 DMA burst

Сообщений 1 страница 30 из 59

1

Тут мне кое-кто высказал, что я только в грузчики гожусь и ничерта не понимаю в периферии stm32 и вАААще RM ЧИТАТЬ НЕ УМЕЮ.

Здесь пример использования DMA burst для выхлопа таблицы в 4 канала PWM .
Прошу Pridnya ткнуть носом, он знает кого ...

Код:
uint8_t Duty_Cycle_Table[]={
                             1,2,4,6,
                             1,2,4,6,
                             1,2,4,6,
                             1,2,4,6,
                             1,2,4,6,
                             1,2,4,6,
                             1,2,4,6,
                             1,2,4,6,
                             1,2,4,6,
                             1,2,4,6  };


void init_tim(void)
{
	  RCC->AHBENR|=RCC_AHBENR_DMA1EN|RCC_AHBENR_GPIOAEN;
	  RCC->APB1ENR|=RCC_APB1ENR_TIM2EN;
	

    GPIOA->MODER &=~(GPIO_MODER_MODER0
	                  |GPIO_MODER_MODER1
	                  |GPIO_MODER_MODER2
	                  |GPIO_MODER_MODER3);
	  GPIOA->MODER |=GPIO_MODER_MODER0_1
	                 |GPIO_MODER_MODER1_1
	                 |GPIO_MODER_MODER2_1
	                 |GPIO_MODER_MODER3_1;
	 
    GPIOA->AFR[0] |= (2<<4*0)
	                  |(2<<4*1)
	                  |(2<<4*2)
	                  |(2<<4*3);

	
TIMx->PSC = 47; /* (1) */
TIMx->ARR = 8; /* (2) */
TIMx->CCR1 = 7;
TIMx->CCR2 = 7; /* (3) */
TIMx->CCR3 = 7;
TIMx->CCR4 = 7;
TIMx->CCMR1 |= 
	          TIM_CCMR1_OC1M_2 
	        |  TIM_CCMR1_OC1M_1
          |  TIM_CCMR1_OC1PE
        	|  TIM_CCMR1_OC2M_2 
	        |  TIM_CCMR1_OC2M_1
          |  TIM_CCMR1_OC2PE; /* (4) */
TIMx->CCMR2 |= 
	        TIM_CCMR2_OC3M_2 
	        |  TIM_CCMR2_OC3M_1
          |  TIM_CCMR2_OC3PE
	  | TIM_CCMR2_OC4M_2 
	  |  TIM_CCMR2_OC4M_1
          |  TIM_CCMR2_OC4PE;
TIMx->CCER |= TIM_CCER_CC1E
             | TIM_CCER_CC2E
	     | TIM_CCER_CC3E
	     | TIM_CCER_CC4E; /* (5) */
             
             
             
TIMx->BDTR |= TIM_BDTR_MOE; /* (6) */
//TIMx->CR1 |= TIM_CR1_CMS_0; 
TIMx->CR1 |=  TIM_CR1_CEN; /* (7) */
TIMx->EGR |= TIM_EGR_UG; /* (8) */
	
	
DMA1_Channel2->CPAR = (uint32_t)(&(TIMx->DMAR)); /* (1) */
DMA1_Channel2->CMAR = (uint32_t)(Duty_Cycle_Table); /* (2) */
DMA1_Channel2->CNDTR = 10*4; /* (3) */
DMA1_Channel2->CCR |= 
                    DMA_CCR_CIRC 
      //|  DMA_CCR_MSIZE_0 
        |  DMA_CCR_PSIZE_1
                    |  DMA_CCR_MINC 
        |  DMA_CCR_DIR; /* (4) */
TIMx->DCR = (3 << 8)
 + ((((uint32_t)(&TIMx->CCR1))
 - ((uint32_t)(&TIMx->CR1))) >> 2); /* (5) */

TIMx->DIER |= TIM_DIER_UDE; /* (6) */
TIMx->CR1 |= TIM_CR1_CEN; /* (7) */
DMA1_Channel2->CCR |= DMA_CCR_EN; /* (8) */
	
}


И результат выхлопа

http://s020.radikal.ru/i700/1703/d6/4a047714559f.png

http://s010.radikal.ru/i314/1703/a4/87418a1a464e.png

Позже выложу выхлоп синуса на 4 канала ...

2

dosikus написал(а):

Тут мне кое-кто высказал, что я только в грузчики гожусь и ничерта не понимаю в периферии stm32 и вАААще RM ЧИТАТЬ НЕ УМЕЮ.

Здесь пример использования DMA burst для выхлопа таблицы в 4 канала PWM .
Прошу Pridnya ткнуть носом, он знает кого ...

Алексей, я понял, что вы оба мыслите на разных абстрактных слоях, кто с чем работает, тот о том и пишет. besogon не работает с STM32, поэтому посмотрел в RM и нашел, что пакетная передача данных с помощью DMA burst блокирует доступ к шине AHB на время передачи. Ты же использовал её в частном случае для обновления значений четырех независимых таймеров. Вы оба правы, каждый по-своему.

3

Pridnya,  нет. Речь была именно о предназначение DMA burst , а не о работе частей ее механизма.
И именно пакетная транзакция и есть основное предназначение. А говорить, что это  чушь и предлагать свое видение не прочитав RM - демагогия чистой воды...

Это равносильно диалогу :
    - Вороны летает.
    - Нет это вранье они черные.

Теперь понятно?

4

dosikus написал(а):

Pridnya,  нет. Речь была именно о предназначение DMA burst , а не о работе частей ее механизма.
И именно пакетная транзакция и есть основное предназначение.

Понятно, что пакетная передача предназначена для передачи пакета (неделимого). :)

5

Pridnya
Ты просто издеваешься, да?
Просто транзакция DMA передает на один реквест одну единицу данных .
DMA burst за один реквест заполняет  одной транзакцией  все регистры TIMx, начиная с CR1 заканчивая CCR4 .

Счас доделал пример с генерацией 730 Гц 8ми битного синуса на 4 каналах PWM со сдвигом каналов на 90гр.
К сожалению под рукой нет осцилла с 4мя каналами, пробую сфоткать чередуя по 2 канала.

На фото по порядку 1-2 канал, 1-3 канал, 1-4 канал.

http://s020.radikal.ru/i700/1703/eb/587c87ed631e.jpg

http://i026.radikal.ru/1703/a1/0ff4820c0554.jpg

http://s020.radikal.ru/i701/1703/a1/f61225a442c5.jpg

6

dosikus написал(а):

Pridnya
Ты просто издеваешься, да?
Просто транзакция DMA передает на один реквест одну единицу данных .
DMA burst за один реквест заполняет  одной транзакцией  все регистры TIMx, начиная с CR1 заканчивая CCR4 .

Счас до делал пример с генерацией 730 КГц 8ми битного синуса на 4 каналах PWM со сдвигом каналов на 90гр.
К сожалению под рукой нет осцилла с 4мя каналами, пробую сфоткать чередуя по 2 канала.

Какой мне смысл над тобой издеваться? Ты хороший, порядочный человек. Наверное, что-то не так понимаю, вот и всё.

Мне понятно, что пакетная передача (DMA burst) за один раз передает пакет из нескольких единиц данных,
вопрос в том, чему равны эти единицы данных. Эти данные передаются куда-то конкретно, например, в случае с таймерами
ты передаешь 4 числа однобайтовых (в твоей таблице десять строк 1,2,4,6) числа, получается, что 4 этих числа передадутся
в периферийные регистры одновременно через 32-х разрядную шину AHB. Это ты имеешь ввиду?

PS: Я как-то сразу обратил внимание, что вроде как ШИМ 16-ти битный и в твоем примере ожидал увидеть строки из 16-ти битных значений,
например 256, 512, 1024, 2048, вот в этом случае передача 4*16 = 64 бит через 32-х битную шину AHB одновременно не получится, т.е.
потребуется два раза передать по 32 бита.

PPS: Еще я не понял, для какого STM32 у тебя код? Вставил в свой проект для STM32F407 - компилятор стал ругаться, TIMx нужно менять на TIM1...

PPPS: И еще не понятно, как у тебя из ШИМ получился синус на экране осциллограф? Нужен же интегратор, а ты про него не написал. Или это как раз те две RC-цепочки, что на фотке видны?

Отредактировано Pridnya (2017-03-21 14:25:40)

7

Pridnya
И что? В пЫках вы для подобной реализации вручную заполняете регистры PWM , здесь аппаратно не загружая ядро .
Ты вот этого не видишь?

Писано для F0 - f072 ,

Код:
#define  TIMx TIM2

На выходах каналов интегрирующая цепочка  резистор 1,8 кОм и конденсатор 100nF .

Для F4 надо переделывать, там DMA сложней , у каждого канала -потоки.

8

dosikus написал(а):

Pridnya
И что? В пЫках вы для подобной реализации вручную заполняете регистры PWM , здесь аппаратно не загружая ядро .
Ты вот этого не видишь?

Писано для F0 - f072 ,
Код:

#define  TIMx TIM2

На выходах каналов интегрирующая цепочка  резистор 1,8 кОм и конденсатор 100nF .

Для F4 надо переделывать, там DMA сложней , у каждого канала -потоки.

Этот дефайн я сразу заменил, там еще много чего есть, что отличается, заголовчник разный и имена разные.
А 4*16 бит значения также как и 4*8 бит передать можно? Используя этот же код?
Я пока к стыду своему еще даже не запустил ШИМ на STM32F407 TIM2, вот пробую.

Отредактировано Pridnya (2017-03-21 14:33:27)

9

Pridnya написал(а):

А 4*16 бит значения также как и 4*8 бит передать можно? Используя этот же код?

Для этого надо таблицу сделать uint16_t
и  определить размерность выборок в настройках канала DMA .

Код:
DMA1_Channel2->CCR |= 
     DMA_CCR_CIRC 
    |  DMA_CCR_MSIZE_0 <------   16бит
    |  DMA_CCR_PSIZE_1
    |  DMA_CCR_MINC 
    |  DMA_CCR_DIR; 

Но период таймера ограничен здесь :

Код:
TIMx->ARR = 255; 

Если увеличишь период , естественно частота уменьшиться...

10

Здесь код 4х фазного синуса.

Код:




const uint8_t  sine_wave[256*4] = {
  0x80,  0xFF,  0x80,  0x01,
  0x83,  0xFF,  0x7D,  0x01,
  0x86,  0xFF,  0x7A,  0x01,
  0x89,  0xFF,  0x77,  0x01,
  0x8C,  0xFE,  0x74,  0x02,
  0x90,  0xFE,  0x70,  0x02,
  0x93,  0xFE,  0x6D,  0x02,
  0x96,  0xFD,  0x6A,  0x03,
  0x99,  0xFD,  0x67,  0x03,
  0x9C,  0xFC,  0x64,  0x04,
  0x9F,  0xFB,  0x61,  0x05,
  0xA2,  0xFA,  0x5E,  0x06,
  0xA5,  0xFA,  0x5B,  0x06,
  0xA8,  0xF9,  0x58,  0x07,
  0xAB,  0xF8,  0x55,  0x08,
  0xAE,  0xF6,  0x52,  0x0A,
  0xB1,  0xF5,  0x4F,  0x0B,
  0xB3,  0xF4,  0x4D,  0x0C,
  0xB6,  0xF3,  0x4A,  0x0D,
  0xB9,  0xF1,  0x47,  0x0F,
  0xBC,  0xF0,  0x44,  0x10,
  0xBF,  0xEF,  0x41,  0x11,
  0xC1,  0xED,  0x3F,  0x13,
  0xC4,  0xEB,  0x3C,  0x15,
  0xC7,  0xEA,  0x39,  0x16,
  0xC9,  0xE8,  0x37,  0x18,
  0xCC,  0xE6,  0x34,  0x1A,
  0xCE,  0xE4,  0x32,  0x1C,
  0xD1,  0xE2,  0x2F,  0x1E,
  0xD3,  0xE0,  0x2D,  0x20,
  0xD5,  0xDE,  0x2B,  0x22,
  0xD8,  0xDC,  0x28,  0x24,
  0xDA,  0xDA,  0x26,  0x26,
  0xDC,  0xD8,  0x24,  0x28,
  0xDE,  0xD5,  0x22,  0x2B,
  0xE0,  0xD3,  0x20,  0x2D,
  0xE2,  0xD1,  0x1E,  0x2F,
  0xE4,  0xCE,  0x1C,  0x32,
  0xE6,  0xCC,  0x1A,  0x34,
  0xE8,  0xC9,  0x18,  0x37,
  0xEA,  0xC7,  0x16,  0x39,
  0xEB,  0xC4,  0x15,  0x3C,
  0xED,  0xC1,  0x13,  0x3F,
  0xEF,  0xBF,  0x11,  0x41,
  0xF0,  0xBC,  0x10,  0x44,
  0xF1,  0xB9,  0x0F,  0x47,
  0xF3,  0xB6,  0x0D,  0x4A,
  0xF4,  0xB3,  0x0C,  0x4D,
  0xF5,  0xB1,  0x0B,  0x4F,
  0xF6,  0xAE,  0x0A,  0x52,
  0xF8,  0xAB,  0x08,  0x55,
  0xF9,  0xA8,  0x07,  0x58,
  0xFA,  0xA5,  0x06,  0x5B,
  0xFA,  0xA2,  0x06,  0x5E,
  0xFB,  0x9F,  0x05,  0x61,
  0xFC,  0x9C,  0x04,  0x64,
  0xFD,  0x99,  0x03,  0x67,
  0xFD,  0x96,  0x03,  0x6A,
  0xFE,  0x93,  0x02,  0x6D,
  0xFE,  0x90,  0x02,  0x70,
  0xFE,  0x8C,  0x02,  0x74,
  0xFF,  0x89,  0x01,  0x77,
  0xFF,  0x86,  0x01,  0x7A,
  0xFF,  0x83,  0x01,  0x7D, 
  0xFF,  0x80,  0x01,  0x80,
  0xFF,  0x7D,  0x01,  0x83,
  0xFF,  0x7A,  0x01,  0x86,
  0xFF,  0x77,  0x01,  0x89,
  0xFE,  0x74,  0x02,  0x8C,
  0xFE,  0x70,  0x02,  0x90,
  0xFE,  0x6D,  0x02,  0x93,
  0xFD,  0x6A,  0x03,  0x96,
  0xFD,  0x67,  0x03,  0x99,
  0xFC,  0x64,  0x04,  0x9C,
  0xFB,  0x61,  0x05,  0x9F,
  0xFA,  0x5E,  0x06,  0xA2,
  0xFA,  0x5B,  0x06,  0xA5,
  0xF9,  0x58,  0x07,  0xA8,
  0xF8,  0x55,  0x08,  0xAB,
  0xF6,  0x52,  0x0A,  0xAE,
  0xF5,  0x4F,  0x0B,  0xB1,
  0xF4,  0x4D,  0x0C,  0xB3,
  0xF3,  0x4A,  0x0D,  0xB6,
  0xF1,  0x47,  0x0F,  0xB9,
  0xF0,  0x44,  0x10,  0xBC,
  0xEF,  0x41,  0x11,  0xBF,
  0xED,  0x3F,  0x13,  0xC1,
  0xEB,  0x3C,  0x15,  0xC4,
  0xEA,  0x39,  0x16,  0xC7,
  0xE8,  0x37,  0x18,  0xC9,
  0xE6,  0x34,  0x1A,  0xCC,
  0xE4,  0x32,  0x1C,  0xCE,
  0xE2,  0x2F,  0x1E,  0xD1,
  0xE0,  0x2D,  0x20,  0xD3,
  0xDE,  0x2B,  0x22,  0xD5,
  0xDC,  0x28,  0x24,  0xD8,
  0xDA,  0x26,  0x26,  0xDA,
  0xD8,  0x24,  0x28,  0xDC,
  0xD5,  0x22,  0x2B,  0xDE,
  0xD3,  0x20,  0x2D,  0xE0,
  0xD1,  0x1E,  0x2F,  0xE2,
  0xCE,  0x1C,  0x32,  0xE4,
  0xCC,  0x1A,  0x34,  0xE6,
  0xC9,  0x18,  0x37,  0xE8,
  0xC7,  0x16,  0x39,  0xEA,
  0xC4,  0x15,  0x3C,  0xEB,
  0xC1,  0x13,  0x3F,  0xED,
  0xBF,  0x11,  0x41,  0xEF,
  0xBC,  0x10,  0x44,  0xF0,
  0xB9,  0x0F,  0x47,  0xF1,
  0xB6,  0x0D,  0x4A,  0xF3,
  0xB3,  0x0C,  0x4D,  0xF4,
  0xB1,  0x0B,  0x4F,  0xF5,
  0xAE,  0x0A,  0x52,  0xF6,
  0xAB,  0x08,  0x55,  0xF8,
  0xA8,  0x07,  0x58,  0xF9,
  0xA5,  0x06,  0x5B,  0xFA,
  0xA2,  0x06,  0x5E,  0xFA,
  0x9F,  0x05,  0x61,  0xFB,
  0x9C,  0x04,  0x64,  0xFC,
  0x99,  0x03,  0x67,  0xFD,
  0x96,  0x03,  0x6A,  0xFD,
  0x93,  0x02,  0x6D,  0xFE,
  0x90,  0x02,  0x70,  0xFE,
  0x8C,  0x02,  0x74,  0xFE,
  0x89,  0x01,  0x77,  0xFF,
  0x86,  0x01,  0x7A,  0xFF,
  0x83,  0x01,  0x7D,  0xFF,
  0x80,  0x01,  0x80,  0xFF,
  0x7D,  0x01,  0x83,  0xFF,
  0x7A,  0x01,  0x86,  0xFF,
  0x77,  0x01,  0x89,  0xFF,
  0x74,  0x02,  0x8C,  0xFE,
  0x70,  0x02,  0x90,  0xFE,
  0x6D,  0x02,  0x93,  0xFE,
  0x6A,  0x03,  0x96,  0xFD,
  0x67,  0x03,  0x99,  0xFD,
  0x64,  0x04,  0x9C,  0xFC,
  0x61,  0x05,  0x9F,  0xFB,
  0x5E,  0x06,  0xA2,  0xFA,
  0x5B,  0x06,  0xA5,  0xFA,
  0x58,  0x07,  0xA8,  0xF9,
  0x55,  0x08,  0xAB,  0xF8,
  0x52,  0x0A,  0xAE,  0xF6,
  0x4F,  0x0B,  0xB1,  0xF5,
  0x4D,  0x0C,  0xB3,  0xF4,
  0x4A,  0x0D,  0xB6,  0xF3,
  0x47,  0x0F,  0xB9,  0xF1,
  0x44,  0x10,  0xBC,  0xF0,
  0x41,  0x11,  0xBF,  0xEF,
  0x3F,  0x13,  0xC1,  0xED,
  0x3C,  0x15,  0xC4,  0xEB,
  0x39,  0x16,  0xC7,  0xEA,
  0x37,  0x18,  0xC9,  0xE8,
  0x34,  0x1A,  0xCC,  0xE6,
  0x32,  0x1C,  0xCE,  0xE4,
  0x2F,  0x1E,  0xD1,  0xE2,
  0x2D,  0x20,  0xD3,  0xE0,
  0x2B,  0x22,  0xD5,  0xDE,
  0x28,  0x24,  0xD8,  0xDC,
  0x26,  0x26,  0xDA,  0xDA,
  0x24,  0x28,  0xDC,  0xD8,
  0x22,  0x2B,  0xDE,  0xD5,
  0x20,  0x2D,  0xE0,  0xD3,
  0x1E,  0x2F,  0xE2,  0xD1,
  0x1C,  0x32,  0xE4,  0xCE,
  0x1A,  0x34,  0xE6,  0xCC,
  0x18,  0x37,  0xE8,  0xC9,
  0x16,  0x39,  0xEA,  0xC7,
  0x15,  0x3C,  0xEB,  0xC4,
  0x13,  0x3F,  0xED,  0xC1,
  0x11,  0x41,  0xEF,  0xBF,
  0x10,  0x44,  0xF0,  0xBC,
  0x0F,  0x47,  0xF1,  0xB9,
  0x0D,  0x4A,  0xF3,  0xB6,
  0x0C,  0x4D,  0xF4,  0xB3,
  0x0B,  0x4F,  0xF5,  0xB1,
  0x0A,  0x52,  0xF6,  0xAE,
  0x08,  0x55,  0xF8,  0xAB,
  0x07,  0x58,  0xF9,  0xA8,
  0x06,  0x5B,  0xFA,  0xA5,
  0x06,  0x5E,  0xFA,  0xA2,
  0x05,  0x61,  0xFB,  0x9F,
  0x04,  0x64,  0xFC,  0x9C,
  0x03,  0x67,  0xFD,  0x99,
  0x03,  0x6A,  0xFD,  0x96,
  0x02,  0x6D,  0xFE,  0x93,
  0x02,  0x70,  0xFE,  0x90,
  0x02,  0x74,  0xFE,  0x8C,
  0x01,  0x77,  0xFF,  0x89,
  0x01,  0x7A,  0xFF,  0x86,
  0x01,  0x7D,  0xFF,  0x83,
  0x01,  0x80,  0xFF,  0x80,
  0x01,  0x83,  0xFF,  0x7D,
  0x01,  0x86,  0xFF,  0x7A,
  0x01,  0x89,  0xFF,  0x77,
  0x02,  0x8C,  0xFE,  0x74,
  0x02,  0x90,  0xFE,  0x70,
  0x02,  0x93,  0xFE,  0x6D,
  0x03,  0x96,  0xFD,  0x6A,
  0x03,  0x99,  0xFD,  0x67,
  0x04,  0x9C,  0xFC,  0x64,
  0x05,  0x9F,  0xFB,  0x61,
  0x06,  0xA2,  0xFA,  0x5E,
  0x06,  0xA5,  0xFA,  0x5B,
  0x07,  0xA8,  0xF9,  0x58,
  0x08,  0xAB,  0xF8,  0x55,
  0x0A,  0xAE,  0xF6,  0x52,
  0x0B,  0xB1,  0xF5,  0x4F,
  0x0C,  0xB3,  0xF4,  0x4D,
  0x0D,  0xB6,  0xF3,  0x4A,
  0x0F,  0xB9,  0xF1,  0x47,
  0x10,  0xBC,  0xF0,  0x44,
  0x11,  0xBF,  0xEF,  0x41,
  0x13,  0xC1,  0xED,  0x3F,
  0x15,  0xC4,  0xEB,  0x3C,
  0x16,  0xC7,  0xEA,  0x39,
  0x18,  0xC9,  0xE8,  0x37,
  0x1A,  0xCC,  0xE6,  0x34,
  0x1C,  0xCE,  0xE4,  0x32,
  0x1E,  0xD1,  0xE2,  0x2F,
  0x20,  0xD3,  0xE0,  0x2D,
  0x22,  0xD5,  0xDE,  0x2B,
  0x24,  0xD8,  0xDC,  0x28,
  0x26,  0xDA,  0xDA,  0x26,
  0x28,  0xDC,  0xD8,  0x24,
  0x2B,  0xDE,  0xD5,  0x22,
  0x2D,  0xE0,  0xD3,  0x20,
  0x2F,  0xE2,  0xD1,  0x1E,
  0x32,  0xE4,  0xCE,  0x1C,
  0x34,  0xE6,  0xCC,  0x1A,
  0x37,  0xE8,  0xC9,  0x18,
  0x39,  0xEA,  0xC7,  0x16,
  0x3C,  0xEB,  0xC4,  0x15,
  0x3F,  0xED,  0xC1,  0x13,
  0x41,  0xEF,  0xBF,  0x11,
  0x44,  0xF0,  0xBC,  0x10,
  0x47,  0xF1,  0xB9,  0x0F,
  0x4A,  0xF3,  0xB6,  0x0D,
  0x4D,  0xF4,  0xB3,  0x0C,
  0x4F,  0xF5,  0xB1,  0x0B,
  0x52,  0xF6,  0xAE,  0x0A,
  0x55,  0xF8,  0xAB,  0x08,
  0x58,  0xF9,  0xA8,  0x07,
  0x5B,  0xFA,  0xA5,  0x06,
  0x5E,  0xFA,  0xA2,  0x06,
  0x61,  0xFB,  0x9F,  0x05,
  0x64,  0xFC,  0x9C,  0x04,
  0x67,  0xFD,  0x99,  0x03,
  0x6A,  0xFD,  0x96,  0x03,
  0x6D,  0xFE,  0x93,  0x02,
  0x70,  0xFE,  0x90,  0x02,
  0x74,  0xFE,  0x8C,  0x02,
  0x77,  0xFF,  0x89,  0x01,
  0x7A,  0xFF,  0x86,  0x01,
  0x7D,  0xFF,  0x83,  0x01
};




void init_tim(void)
{
	  
	
	  RCC->AHBENR|=RCC_AHBENR_DMA1EN|RCC_AHBENR_GPIOAEN;
	  RCC->APB1ENR|=RCC_APB1ENR_TIM2EN;
	

    GPIOA->MODER &=~(GPIO_MODER_MODER0
	                  |GPIO_MODER_MODER1
	                  |GPIO_MODER_MODER2
	                  |GPIO_MODER_MODER3);
	  GPIOA->MODER |=GPIO_MODER_MODER0_1
	                 |GPIO_MODER_MODER1_1
	                 |GPIO_MODER_MODER2_1
	                 |GPIO_MODER_MODER3_1;
	 
    GPIOA->AFR[0] |= (2<<4*0)
	                  |(2<<4*1)
	                  |(2<<4*2)
	                  |(2<<4*3);

	
TIMx->PSC = 0; /* (1) */
TIMx->ARR = 255; /* (2) */
TIMx->CCR1 = 7;
TIMx->CCR2 = 7; /* (3) */
TIMx->CCR3 = 7;
TIMx->CCR4 = 7;
TIMx->CCMR1 |= 
	          TIM_CCMR1_OC1M_2 
	        |  TIM_CCMR1_OC1M_1
          |  TIM_CCMR1_OC1PE
        	|  TIM_CCMR1_OC2M_2 
	        |  TIM_CCMR1_OC2M_1
          |  TIM_CCMR1_OC2PE; /* (4) */
TIMx->CCMR2 |= 
	        TIM_CCMR2_OC3M_2 
	        |  TIM_CCMR2_OC3M_1
          |  TIM_CCMR2_OC3PE
        	| TIM_CCMR2_OC4M_2 
	        |  TIM_CCMR2_OC4M_1
          |  TIM_CCMR2_OC4PE;
TIMx->CCER |= TIM_CCER_CC1E
             | TIM_CCER_CC2E
             | TIM_CCER_CC3E
             | TIM_CCER_CC4E; /* (5) */
  

//TIMx->BDTR |= TIM_BDTR_MOE; /* (6) */
TIMx->CR1 |= TIM_CR1_CMS_0; 
TIMx->CR1 |=  TIM_CR1_CEN; /* (7) */
TIMx->EGR |= TIM_EGR_UG; /* (8) */
	
	
DMA1_Channel2->CPAR = (uint32_t)(&(TIMx->DMAR)); /* (1) */
DMA1_Channel2->CMAR = (uint32_t)( sine_wave); /* (2) */
DMA1_Channel2->CNDTR = 256*4; /* (3) */
DMA1_Channel2->CCR |= 
                    DMA_CCR_CIRC 
                    //|  DMA_CCR_MSIZE_0 
                    |  DMA_CCR_PSIZE_1
                    |  DMA_CCR_MINC 
                    |  DMA_CCR_DIR; /* (4) */
TIMx->DCR = (3 << 8)
 + ((((uint32_t)(&TIMx->CCR1))
 - ((uint32_t)(&TIMx->CR1))) >> 2); /* (5) */

TIMx->DIER |= TIM_DIER_UDE; /* (6) */
TIMx->CR1 |= TIM_CR1_CEN; /* (7) */
DMA1_Channel2->CCR |= DMA_CCR_EN; /* (8) */
	
}




11

Разогнал чип до 72МГц ... Пару часов уже работает...

12

dosikus написал(а):

Разогнал чип до 72МГц ... Пару часов уже работает...

Спасибо шпаргалку! И у меня на STM32F407 ШИМ ожил, пока без DMA. :)

13

Пользуйся пока такими шпорами. Писать полноценную статью, времени пока нет. И так урывками занимаюсь...
Кстати с DMA burst можно многое реализовать. Выхлоп 4 синусов это так цветочки, что на поверхности лежало...
Не хочешь ленточками на WS2812x позаниматься? Есть реализация на 16 независимых каналов ...

Ну и с кольцом балуюсь...

14

dosikus написал(а):

Пользуйся пока такими шпорами. Писать полноценную статью, времени пока нет. И так урывками занимаюсь...
Кстати с DMA burst можно многое реализовать. Выхлоп 4 синусов это так цветочки, что на поверхности лежало...
Не хочешь ленточками на WS2812x позаниматься? Есть реализация на 16 независимых каналов ...

Ну и с кольцом балуюсь...

Тут на ШИМ времени сколько нужно. Еще же и силовую часть собрать хочется.
Я так понял, что из TIM2 PWM mode получился 4-х канальный ШИМ, который вроде как годится для какого-то двигателя или полного моста.
В твоем коде два канала синфазны, а два других противофазны им.

15

Это просто пример использования DMA burst, без какого либо продолжения. Синусоиды сдвинуты на 90гр относительно друг друга.
Поправь таблицу и конфиг на 3фазы со сдвигом 120гр, делов-то...

16

http://s010.radikal.ru/i312/1703/e4/53ee922a5aaf.jpg

17

Оёй огромная картинка, убиваешь RSS ленту, поставь превьюшку, плиз
Хотя, всё, уже не убиваешь, этот мой пост теперь в ленте )

Отредактировано vt340 (2017-03-22 09:19:27)

18

vt340
Я спойлер есть в тэгах? Что-то не нашел...  :confused:

19

Что-то не очень понятно, как правильно посчитать частоту ШИМ.
Например для STM32F407 (STM32F4DISCOVERY):

TIM2 APB1 42 MHz с коэффициентом умножения x2, поэтому Tim2clk = 84 MHz.
TIM2->PSC = 0;
TIM2->ARR = 2047;
TIM2->CCRx = 1024; (длительность импульса равной длительности паузы)

Расчетное значение частоты ШИМ: Fpwm = Tim2clk/((PSC+1) * (ARR+1)) = 84000/((0+1) *(2047+1)) =  84000/2048 = 41 кГц.
А частота ШИМ по осциллографу равна 20,50 кГц, т.е. в два раза меньше.

Где ошибка?

PS: Во у вас проблемы. Я даже не знаю, что такое RSS-лента. :)

Отредактировано Pridnya (2017-03-22 09:38:39)

20

Pridnya написал(а):

PS: Во у вас проблемы. Я даже не знаю, что такое RSS-лента. :)

Очень удобная штука, шёлкни по "RSS" в главном меню )

21

Pridnya
Расчет тактовой снова в спл делал? Я для кого старался?
Выведи на MCO ...

И про сие не забываем :

http://s010.radikal.ru/i313/1703/c2/9951e9c9be45.png

22

vt340
Я в хроме вижу это

This XML file does not appear to have any style information associated with it. The document tree is shown below.

Все исправил..

23

dosikus написал(а):

vt340
Я в хроме вижу это

This XML file does not appear to have any style information associated with it. The document tree is shown below.

Хрому нужен плагин - любой rss reader

24

dosikus написал(а):

Pridnya
Расчет тактовой снова в спл делал? Я для кого старался?
Выведи на MCO ...

И про сие не забываем :

У меня проект для STM32F4DISCOVERY без SPL.
Тактовые частоты шин смотрел в ClockConfig.xls (экселевский файл), в нем вроде как для TIM2 частота x2. Вот и рисунок соответствующий.http://sa.uploads.ru/t/uOz3G.png
Вроде все правильно: тактовая частота 168 MHz, APB1 Prescaler =4, частота APB1 42 MHz, поэтому тактовая TIM2 с коэффициентом x2, т.е. 84 MHz и на рисунке так.

Отредактировано Pridnya (2017-03-22 10:13:08)

25

Pridnya написал(а):

в нем вроде как для TIM2 частота x2. Вот и рисунок соответствующий.

Выведи System clock  на MCO и проконтроллируй.

Так'с минут 15 подожди, достал F4 дискавери...

26

dosikus написал(а):

Pridnya написал(а):

    в нем вроде как для TIM2 частота x2. Вот и рисунок соответствующий.

Выведи System clock  на MCO и проконтроллируй.

Так'с минут 15 подожди, достал F4 дискавери...

Код этот

Код:
void Tim2(void)
{	
	// PA0-PA3 - выходы с альтернативной функцией 
	
	RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;    

	GPIOA->MODER &= ~((3U<<0*2) | (3U<<1*2) | (3U<<2*2) | (3U<<3*2)); // Clear.
	GPIOA->MODER |=  ((2U<<0*2) | (2U<<1*2) | (2U<<2*2) | (2U<<3*2)); // PA0, PA1, PA2, PA3 -  Alternate function mode.

	GPIOA->AFR[0]  &= ~((15U << ( 0*4)) | (15U << ( 1*4)) | (15U << ( 2*4)) | (15U << ( 3*4))); // CLEAR pin=6 AFRL.6, 7 AFRL.7.
	GPIOA->AFR[0]  |=  ((1U << ( 0*4)) | (1U << ( 1*4)) | (1U << ( 2*4)) | (1U << ( 3*4)));   // 
	
    /*    
	  GPIOA->MODER &=~(GPIO_MODER_MODER0
	                  |GPIO_MODER_MODER1
	                  |GPIO_MODER_MODER2
	                  |GPIO_MODER_MODER3);
	  GPIOA->MODER |=GPIO_MODER_MODER0_1
	                 |GPIO_MODER_MODER1_1
	                 |GPIO_MODER_MODER2_1
	                 |GPIO_MODER_MODER3_1;
	 
    //GPIOA->AFR[0] |= (2<<4*0)|(2<<4*1)|(2<<4*2)|(2<<4*3); // STM32F072
    GPIOA->AFR[0] |= (1<<4*0)|(1<<4*1)|(1<<4*2)|(1<<4*3); // STM32F407*/

  RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;	// TIM2.
	
// В соответствии с AN4013.
// 1. Configure the output pin:
// a)  Select the output mode by writing CCS bits in CCMRx register.
// b)  Select the polarity by writing the CCxP bit in CCER register.
// 00: CC1 channel is configured as output (СС1 - TIM2_CH1...CC4 - TIM2_CH4).
	TIM2->CCMR1 &= ~( TIM_CCMR1_CC1S | TIM_CCMR1_CC2S | TIM_CCMR2_CC3S | TIM_CCMR2_CC4S); 
	//TIMx capture/compare enable register (TIMx_CCER)
	TIM2->CCER |= 0x1111;	// 0: OC1 active high, 1: On - OC1 signal is output on the corresponding output pin
	
//2.  Select the PWM mode (PWM1 or PWM2) by writing OCxM bits in CCMRx register.
	TIM2->CCMR1 |= (TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC2M_0 | TIM_CCMR2_OC3M_0 | TIM_CCMR2_OC4M_0); 
	
	TIM2->PSC = 0; /* (1) */	
	TIM2->ARR = 2048;	
	TIM2->CCR1 = 1024; // TIM2_CH1. 1/2
  TIM2->CCR2 = 1024;  // TIM2_CH2. 1/2
	TIM2->CCR3 = 1024;  // TIM2_CH3. 1/2
	TIM2->CCR4 = 1024;  // TIM2_CH4. 1/2
	
	// Сейчас каналы 0-1 между собой в фазе, 2-3 между собой в фазе, но по отношению к каналам 0-1 в противофазе. 
TIM2->CCMR1 |= 
	          TIM_CCMR1_OC1M_2 
	        |  TIM_CCMR1_OC1M_1
          |  TIM_CCMR1_OC1PE
        	|  TIM_CCMR1_OC2M_2 
	        |  TIM_CCMR1_OC2M_1
          |  TIM_CCMR1_OC2PE; /* (4) */
TIM2->CCMR2 |= 
	        TIM_CCMR2_OC3M_2 
	        |  TIM_CCMR2_OC3M_1
          |  TIM_CCMR2_OC3PE
        	| TIM_CCMR2_OC4M_2 
	        |  TIM_CCMR2_OC4M_1
          |  TIM_CCMR2_OC4PE;
TIM2->CCER |= TIM_CCER_CC1E
             | TIM_CCER_CC2E
             | TIM_CCER_CC3E
             | TIM_CCER_CC4E; /* (5) */
  

//TIMx->BDTR |= TIM_BDTR_MOE; /* (6) */
TIM2->CR1 |= TIM_CR1_CMS_0; 
TIM2->CR1 |=  TIM_CR1_CEN; /* (7) */
TIM2->EGR |= TIM_EGR_UG; /* (8) */
	}

Вывел сигнал на MCO1 PA8 - частота 16 MHz, а кварц у меня 8 МГц. Что-то не то, наверное, вывел. Нужно поискать, какой сигнал по умолчанию выводится на MCO1.

Код:
// PA8 AF1 MCO1
GPIOA->MODER &= ~(3U<<8*2); // Clear.
GPIOA->MODER |=  (2U<<8*2); // PA8 -  Alternate function mode.
GPIOA->AFR[1]  &= ~(15U << ( 0*4)); // 
GPIOA->AFR[1]  |=  (0U << ( 0*4));   //

Отредактировано Pridnya (2017-03-22 11:07:53)

27

У меня так же получается тактовая TIM2 42MHz , хотя для TIM1 это же работает и тактовая его 168MHz от APB2 ...

28

dosikus написал(а):

У меня так же получается тактовая TIM2 42MHz , хотя для TIM1 это же работает и тактовая его 168MHz от APB2 ...

А ты код мой использовал? Который я привел void Tim2(void);

Почему это у тебя тактовая TIM2 42 MHz, там же если частота предделителя APB не равна 1, то тактовая таймера x2 - должна быть 84 MHz.

Не пойму, в RM ошибка что ли?

Код:
	// PA8 AF1 MCO1
	/* MCO1
  You can output four different clock sources onto the MCO1 pin (PA8) using the configurable prescaler (from 1 to 5):
  – HSI clock
  – LSE clock
  – HSE clock
  – PLL clock */
	GPIOA->MODER &= ~(3U<<8*2); // Clear.
	GPIOA->MODER |=  (2U<<8*2); // P8 -  Alternate function mode.
	GPIOA->AFR[1]  &= ~(15U << ( 0*4)); // 
	GPIOA->AFR[1]  |=  (0U << ( 0*4));   // 
  RCC->CFGR |= 
	((7 << 24) // Bits 24:26 MCO1PRE: MCO1 prescaler =5
	//|(2 << 22) // Bits 22:21 MCO1: MCO1 = HSE.............3.2MHz*5=16MHz
	|(3 << 22) // Bits 22:21 MCO1: MCO1 = PLL...........1.6MHz*5=8MHz
  );

Биты 22-21 равны 2 - частота на MCO1 3.2MHz с учетом предделителя x5 получаем 16 MHz - это частота HSI (а в RM0090 3 соответствует HSE)
Биты 22-21 равны 3 - частота на MCO1 1.6MHz с учетом предделителя x5 получаем 8 MHz - это частота HSE мой кварц 8MHz (а в RM0090 3 соответствует PLL)

Отредактировано Pridnya (2017-03-22 11:25:31)

29

Все , у себя нашел "косяк". :crazyfun:
Отключи Center aligned mode

Код:
//TIM2->CR1 |= TIM_CR1_CMS_0; 

30

dosikus написал(а):

Все , у себя нашел "косяк". :crazyfun:
Ищи у себя, с моей инициализацией тактовой все работает - тактовая TIM2 84MHz...

dosikus написал(а):

Все , у себя нашел "косяк". :crazyfun:
Отключи Center aligned mode
Код:

//TIM2->CR1 |= TIM_CR1_CMS_0;

Ага, это я часть твоего кода бездумно скопировал и даже не представлял, что частота ШИМ может отличаться в 2 раза из-за режима ШИМ.
Ну вот и у меня теперь частота ШИМ 41 кГц, все по формуле. Это хорошо. Спасибо!
Этот вопрос уладили.

А что с MCO1 творится? Какая-то жуть. Уже 13-я ревизия RM0090 Rev.13 вышла и в ней тот же косяк:

Код:
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;    

	// PA8 AF1 MCO1
	/* MCO1
  You can output four different clock sources onto the MCO1 pin (PA8) using the configurable prescaler (from 1 to 5):
  – HSI clock
  – LSE clock
  – HSE clock
  – PLL clock */
	GPIOA->MODER &= ~(3U<<8*2); // Clear.
	GPIOA->MODER |=  (2U<<8*2); // PA8 -  Alternate function mode.
	GPIOA->AFR[1]  &= ~(15U << ( 0*4)); // 
	GPIOA->AFR[1]  |=  (0U << ( 0*4));   // 
  RCC->CFGR |= 
	((7 << 24) // Bits 24:26 MCO1PRE: MCO1 prescaler =5
  //|(2 << 22) // Bits 22:21=10: HSE oscillator clock selected.............3.2MHz*5=16MHz
	|(3 << 22) // Bits 22:21=11: PLL clock selected...........1.6MHz*5=8MHz
  );

В RM указано
1) биты 22-21 =11 выводит PLL, а фактически выводится HSE 8 MHz.
2) биты 22-21 =10 выводит HSE, а фактически выводит HSI 16 MHz.
Безобразие. На STM32F4DISCOVERY кварц 8MHz.

Отредактировано Pridnya (2017-03-22 12:06:13)


Вы здесь » Микроконтроллеры » Архив » STM32 DMA burst