Перейти к содержанию
    

Всем привет!Битый час сижу и не могу настроить ШИМ(

Пытаюсь настроить шим на ноге РА2, вроде все сделал как в даташите, но.............

//***********TIM2***************
    RCC->APB1ENR    |=RCC_APB1ENR_TIM2EN;        // тактирование таймера
    GPIOA->MODER    |=0x4;
    TIM2->CR1        |= TIM_CR1_CMS;                // выравнивание по центру
    TIM2->PSC         = 16000-1;
    TIM2->ARR        = 0xFF;                        // счетный регистр (период шима)
    TIM2->CCMR2        |= TIM_CCMR2_OC3CE;            // !
    TIM2->CCMR2        |= TIM_CCMR2_OC3M;            // инвертированный шим
    TIM2->CCER         |= TIM_CCER_CC3E;            // разрешаем таймеру использование ШИМ
    TIM2->CR1         |= TIM_CR1_CEN;                // запуск таймера
    TIM2->CR1         |= TIM_CR1_ARPE;            // разрешаем перезагрузку ARR
    TIM2->CCR3        =0x1F;

Я правильно понимаю?, чтобы запустить шим на ноге РА2(канал СН3) мне нужно работать с регистроми CCMR2, ну и CCR3 !

Изменено пользователем stm32f4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тактирование порта GPIOA разрешено? Счет таймера TIM2 разрешен? GPIOA настраивается на альтернативную функцию, а какая именно альтернативная функция где-нибудь задается?

Изменено пользователем sidy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

угу)

Да ну!

Можете прокомментировать назначение строчки

GPIOA->MODER    |=0x4;

?

По-моему, ни к PA2, ни к выбору альтернативной функции она отношения не имеет...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да ну!

Можете прокомментировать назначение строчки

GPIOA->MODER    |=0x4;

?

По-моему, ни к PA2, ни к выбору альтернативной функции она отношения не имеет...

ну что вы :laughing: я, конечно, совсем новичок, но тактирование порта я включать умею)

RCC->AHB1ENR    |= RCC_AHB1ENR_GPIOAEN;

ну а по поводу регистра MODER я, таким образом, хотел наложить маску, дабы определить ногу PA2 как выход- хотя тут да!!!! протупил xDDD

нужно было наложить 0х10 )Спасибо большое за замечание)

Кстати по поводу регистра MODER, я в даташите не нашел указаний по поводу конфигурации ног порта, т.е ШИМ должен работать при любой конфигурации регистра MODER.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну что вы :laughing: я, конечно, совсем новичок, но тактирование порта я включать умею)

RCC->AHB1ENR    |= RCC_AHB1ENR_GPIOAEN;

ну а по поводу регистра MODER я, таким образом, хотел наложить маску, дабы определить ногу PA2 как выход- хотя тут да!!!! протупил xDDD

нужно было наложить 0х10 )Спасибо большое за замечание)

Кстати по поводу регистра MODER, я в даташите не нашел указаний по поводу конфигурации ног порта, т.е ШИМ должен работать при любой конфигурации регистра MODER.

Вы же аппаратный ШИМ от таймера решили задействовать?

Тогда Вам нужно "Alternate function mode", а это маска (2 << (2 * 2)) == 0x20.

И не забудьте GPIOA->AFRL = (1 << (2 * 4)) == 0x100.

Рекомендую прочитать/посмотреть datasheet (DS) в районе 58 страницы.

И Reference manual (RM) в районе 139 страницы (и ниже).

 

PS. Советую неспеша разобраться с предметной областью самостоятельно, а не заводить "лишние" темы на форуме.

Вопросы лучше задавать конкретные: хочу сделать то-то, делаю так-то, не получаетя.

Проверьте досконально свой код на предмет опечаток, описок, соответствия DS и RM.

 

До ШИМа каких-нить успехов достигли? Ну, там, светодиоды позажигать получилось ли...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы же аппаратный ШИМ от таймера решили задействовать?

Тогда Вам нужно "Alternate function mode", а это маска (2 << (2 * 2)) == 0x20.

И не забудьте GPIOA->AFRL = (1 << (2 * 4)) == 0x100.

Рекомендую прочитать/посмотреть datasheet (DS) в районе 58 страницы.

И Reference manual (RM) в районе 139 страницы (и ниже).

 

PS. Советую неспеша разобраться с предметной областью самостоятельно, а не заводить "лишние" темы на форуме.

Вопросы лучше задавать конкретные: хочу сделать то-то, делаю так-то, не получаетя.

Проверьте досконально свой код на предмет опечаток, описок, соответствия DS и RM.

 

До ШИМа каких-нить успехов достигли? Ну, там, светодиоды позажигать получилось ли...

Спасибо большое за дельные советы)Да я хочу задействовать аппаратный ШИМ. До ШИМ-а я вдоволь наигрался с светодиодами,более менее разобрался с некоторой периферией DAC, ADC, DMA, с некоторыми таймерами и прерываниями! Возвращаясь к настройке шим, я учел все ваши замечания и все равно-ничего(

не могу понять что не так((( этж ШИМ проще некуда.

вот весь листинг моего бреда, может вы найдете чтониб подозрительное!

#include "stm32f4xx.h"

#define Led_Orange_On      (GPIOD->BSRRL = GPIO_BSRR_BS_13)
#define Led_Orange_Off     (GPIOD->BSRRH = GPIO_BSRR_BS_13)
#define Led_Green_On       (GPIOD->BSRRL = GPIO_BSRR_BS_12)
#define Led_Green_Off      (GPIOD->BSRRH = GPIO_BSRR_BS_12)
#define Led_Red_On         (GPIOD->BSRRL = GPIO_BSRR_BS_14)
#define Led_Red_Off        (GPIOD->BSRRH = GPIO_BSRR_BS_14)
#define Led_Blue_On        (GPIOD->BSRRL = GPIO_BSRR_BS_15)
#define Led_Blue_Off       (GPIOD->BSRRH = GPIO_BSRR_BS_15)

static __IO uint32_t TimingDelay;
static __IO uint32_t i;
static __IO uint32_t dac;
static __IO uint32_t dac_i;
static __IO uint32_t value;
//==============================================================================
void SysTick_Handler (void)
{
  if (TimingDelay)
  {
    TimingDelay--;
  }
}

//==============================================================================
void Delay_mS(uint32_t nTime)
{
  TimingDelay = nTime;

  while(TimingDelay);
}
void EXTI0_IRQHandler()
{
GPIOD->ODR^= (GPIO_BSRR_BS_13|GPIO_BSRR_BS_14|GPIO_BSRR_BS_15|GPIO_BSRR_BS_12);
EXTI->PR|=0x01; //Очищаем флаг
dac=dac+0x1F;
DAC->DHR12R1    = dac;                       // загрузка данных в ЦАП1
DAC->SWTRIGR    |= DAC_SWTRIGR_SWTRIG1;     // программное события запуска
}

void TIM7_IRQHandler()
    {
    TIM7->SR&= ~TIM_SR_UIF;         //Сбрасываем флаг UIF
    GPIOD->ODR^=GPIO_BSRR_BS_13; //Инвертируем состояние светодиодов
    }

//=============================================================================
//=============================================================================
int main(void)
{

    SysTick_Config(SystemCoreClock/3000);
    while(1)

    {
//***********GPIOA**************
    RCC->AHB1ENR    |= RCC_AHB1ENR_GPIOAEN;
//    GPIOA->MODER    =0x0;                  //Input (reset state)
    GPIOA->OSPEEDR    =0xFF;                //100 MHz

//***********EXTI***************
    SYSCFG->EXTICR[1] = 0x0;            //перые 4 ноги для прерываний, порта А
    EXTI->IMR        |=(EXTI_IMR_MR0);    //разрешаем прерывание для нулевой ноги EXTI_IMR_MR0=1
    EXTI->RTSR         |=(EXTI_RTSR_TR0);    //прерывания по спаду

//************NVIC**************
//    NVIC->ISER[0]    |=(1<<6);            //6 settable EXTI0 Line0 interrupt
//    NVIC->IP[1]        =0xF000;            //установка приоритета 15 для 6-й Position
    NVIC_EnableIRQ(EXTI0_IRQn);
    NVIC_SetPriority(EXTI0_IRQn,1);

//***********GPIOD**************
    RCC->AHB1ENR    |= RCC_AHB1ENR_GPIODEN;
    GPIOD->MODER    =0x55000000;
    GPIOD->OSPEEDR    =0xFFFF0000;                //100 MHz
    GPIOD->ODR        = 0xFFFF;

//***********DAC****************
    RCC->APB1ENR     |= RCC_APB1ENR_DACEN;        // вкл. тактирование ЦАП
    DAC->CR         |= DAC_CR_TEN1;                // включение запуска от события, по умолчанию таймер 6
    DAC->CR         |= DAC_CR_MAMP1;            // амплитуда на максимум
    DAC->CR         |= DAC_CR_WAVE1_1;            // вкл. генератор треуг. сигн.
// DAC->CR         |= DAC_CR_WAVE1_0;            // вкл. генератор шума
    DAC->CR         |= DAC_CR_EN1;                // вкл. ЦАП 1

//***********TIM6***************
    RCC->APB1ENR     |= RCC_APB1ENR_TIM6EN;        // тактирование таймера
    TIM6->PSC         = 0;                        // предделитель
    TIM6->ARR         = 0xF;                        // переполнение
    TIM6->DIER         |= TIM_DIER_UIE;            // прерывание по переполнению
// TIM6->DIER         |= TIM_DIER_UDE;            // влк. запуск ПДП
    TIM6->CR2         |= TIM_CR2_MMS_1;             // ЦАП будет запускаться по переполнению
    TIM6->CR1         |= TIM_CR1_CEN;                // запуск счета
//******************************
//***********TIM7***************
    RCC->APB1ENR     |= RCC_APB1ENR_TIM7EN;        // тактирование таймера
    TIM7->PSC         = 16000-1;                    // предделитель
    TIM7->ARR         = 1000;                        // переполнение
    TIM7->DIER         |= TIM_DIER_UIE;            // прерывание по переполнению
//    TIM7->DIER         |= TIM_DIER_UDE;            // влк. запуск ПДП
//*    TIM7->CR2         |= TIM_CR2_MMS_1;             // ЦАП будет запускаться по переполнению
    TIM7->CR1         |= TIM_CR1_CEN;                // запуск счета
    NVIC_EnableIRQ(TIM7_IRQn);
//***********TIM2***************
    RCC->APB1ENR    |= RCC_APB1ENR_TIM2EN;        // тактирование таймера
    GPIOA->MODER    |= 0x20;                    // Alternate function mode
    GPIOA->AFR[1]    |= (1 << (2 * 4));            //
    TIM2->CR1        |= TIM_CR1_CMS;                // выравнивание по центру
    TIM2->PSC         = 16000-1;
    TIM2->ARR        = 1000;                        // счетный регистр (период шима)
    TIM2->CCMR2        |= TIM_CCMR2_OC3CE;            // !
    TIM2->CCMR2        |= TIM_CCMR2_OC3M;            // инвертированный шим
    TIM2->CCER         |= TIM_CCER_CC3E;            // разрешаем таймеру использование ШИМ
    TIM2->CR1         |= TIM_CR1_CEN;                // запуск таймера
    TIM2->CR1         |= TIM_CR1_ARPE;            // разрешаем перезагрузку ARR
    TIM2->CCR3        =500;

    //***********TIM12***************
    RCC->AHB1ENR    |= RCC_AHB1ENR_GPIOBEN;
    RCC->APB1ENR    |= RCC_APB1ENR_TIM12EN;        // тактирование таймера
    GPIOB->MODER    |= (1<<(14*2+1));            // Alternate function mode
    GPIOB->AFR[2]    |= (1 << (6 * 4));            //
    TIM12->PSC         = 0x00A7;
    TIM12->ARR         = 0x0FFF;                    // счетный регистр (период шима)
    TIM12->CCR1     = 0x050;
    TIM12->CCMR1    |= TIM_CCMR1_OC1M;            // инвертированный шим
    TIM12->CCER     |= TIM_CCER_CC1E;            // разрешаем таймеру использование ШИМ
    TIM12->CR1         |= TIM_CR1_CEN;                // запуск таймера

    //******************************
    uint32_t pwm[]={0,0,6553,13107,19660,26214,32768,39321,45875,52428,58982,65535};
  while(i<6)
  {
    TIM2->CCR2=0x0F;

    Led_Orange_On;
    Delay_mS(20);

    Led_Orange_Off;
    Led_Red_On;
    Delay_mS(20);

    Led_Red_Off;
    Led_Blue_On;
    Delay_mS(20);

    Led_Blue_Off;
    Led_Green_On;
    Delay_mS(20);

    Led_Green_Off;
    i++;
  }

  while(i>0)
  {

    Led_Green_On;
    Delay_mS(20);

    Led_Green_Off;
    Led_Blue_On;
    Delay_mS(20);

    Led_Blue_Off;
    Led_Red_On;
    Delay_mS(20);

    Led_Red_Off;
    Led_Orange_On;
    Delay_mS(20);

    Led_Orange_Off;
    i--;
  }

    Delay_mS(9000);
}

}

Изменено пользователем stm32f4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

GPIOA->AFR[1]

 

Нужно GPIOA->AFR[0]

Воу, работает! По видимому, это глупый вопрос, но все же! Если чесн то я не оч понимаю что этот регистр вообще делает(

что означают все эти значения?

AFRLy selection:
0000: AF0
0001: AF1
0010: AF2
0011: AF3
0100: AF4
0101: AF5
0110: AF6
0111: AF7
1000: AF8
1001: AF9
1010: AF10
1011: AF11
1100: AF12
1101: AF13
1110: AF14
1111: AF15

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Воу, работает! По видимому, это глупый вопрос, но все же! Если чесн то я не оч понимаю что этот регистр вообще делает(

что означают все эти значения?

Это не глупый, а правильный вопрос (которого от Вас ждут второй день).

 

Набор регистров AFR выбирает для пина необходимую альтернативную функцию.

Например, на выбранном Вами пине PA2 "сидит" еще:

- TIM2_CH3;

- TIM5_CH3;

- TIM9_CH14

- USART2_TX;

- ETH_MDIO.

 

Каким образом камень узнает, что вы хотите видеть на пине PA2? Никаким!

 

Для этого Вы настраиваете PA2 для работы, скажем, с TIM2_CH3 (а это AF1) в регистре альтернативных функций AFR. Поглядеть на каком пине что сидит и номер альтернативной функции можно в datasheet в таблице "Alternate function mapping".

 

Справедливости ради замечу, что раньше выбор той или иной альтернативной функции определялся тактированием того или иного периферийного узла и не было возможности частично задействовать некоторые пины в группе выводов для SPI, а некоторые для TIMER. От этого errata у STM32F1xx разрасталась. И слава Инженерам STM, что в F4 нет такого гемора.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это не глупый, а правильный вопрос (которого от Вас ждут второй день).

 

Набор регистров AFR выбирает для пина необходимую альтернативную функцию.

Например, на выбранном Вами пине PA2 "сидит" еще:

- TIM2_CH3;

- TIM5_CH3;

- TIM9_CH14

- USART2_TX;

- ETH_MDIO.

 

Каким образом камень узнает, что вы хотите видеть на пине PA2? Никаким!

 

Для этого Вы настраиваете PA2 для работы, скажем, с TIM2_CH3 (а это AF1) в регистре альтернативных функций AFR. Поглядеть на каком пине что сидит и номер альтернативной функции можно в datasheet в таблице "Alternate function mapping".

 

Справедливости ради замечу, что раньше выбор той или иной альтернативной функции определялся тактированием того или иного периферийного узла и не было возможности частично задействовать некоторые пины в группе выводов для SPI, а некоторые для TIMER. От этого errata у STM32F1xx разрасталась. И слава Инженерам STM, что в F4 нет такого гемора.

Ого, тк это еще и очень важный регистр)

Странно, почему при включении в регистре AFR, любого, второго ШИМ-а, МК начинает себя вести фантастическим образом. Все зависает!!! кроме того ШИМ-а, которому последним установили AFR.

 

//***********TIM2***************
    RCC->APB1ENR    |= RCC_APB1ENR_TIM2EN;        // тактирование таймера
    GPIOA->MODER    |= 0x20;                    // Alternate function mode
    GPIOA->AFR[0]    |= (1 << (2 * 4));            //
    TIM2->CR1        |= TIM_CR1_CMS;                // выравнивание по центру
    TIM2->PSC         = 0;
    TIM2->ARR        = 1000;                        // счетный регистр (период шима)
    TIM2->CCMR2        |= TIM_CCMR2_OC3CE;            // !
    TIM2->CCMR2        |= TIM_CCMR2_OC3M;            // инвертированный шим
    TIM2->CCER         |= TIM_CCER_CC3E;            // разрешаем таймеру использование ШИМ
    TIM2->CR1         |= TIM_CR1_ARPE;            // разрешаем перезагрузку ARR
    TIM2->CCR3        =222;
    //-----------------
    GPIOA->MODER    |= 0x2;                        // Alternate function mode
    GPIOA->AFR[0]    |= 1;                        //
    TIM2->CCMR1        |= TIM_CCMR1_OC1M;            // инвертированный шим
    TIM2->CCER         |= TIM_CCER_CC1E;            // разрешаем таймеру использование ШИМ
    TIM2->CCR1        = 22;
    TIM2->CR1         |= TIM_CR1_CEN;                // запуск таймера

Изменено пользователем stm32f4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ого, тк это еще и очень важный регистр)

Странно, почему при включении в регистре AFR, любого, второго ШИМ-а, МК начинает себя вести фантастическим образом. Все зависает!!! кроме того ШИМ-а, которому последним установили AFR.

 

    //-----------------
    GPIOA->MODER    |= 0x2;                        // Alternate function mode
    GPIOA->AFR[0]    |= 1;                        //
    TIM2->CCMR1        |= TIM_CCMR1_OC1M;            // инвертированный шим
    TIM2->CCER         |= TIM_CCER_CC1E;            // разрешаем таймеру использование ШИМ
    TIM2->CCR1        = 22;
    TIM2->CR1         |= TIM_CR1_CEN;                // запуск таймера

Может Вы запустили ШИМ на ноге PA0, которая в STM32F4DISCOVERY соединена с питанием через резистор (330 Ом) и конденсатор (100 нФ)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может Вы запустили ШИМ на ноге PA0, которая в STM32F4DISCOVERY соединена с питанием через резистор (330 Ом) и конденсатор (100 нФ)?

Спасибо большое за помощь, Вы снова оказались правы)

Изменено пользователем stm32f4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тут небольшой вопрос хотел бы уточнить, чтоб новой темы не создавать.

 

вот например использую я TIM3, хочу чтобы на выходе чипа был сигнал с периодом 7.5мс, т.е. 3.75мс 1, и 3.75мс 0. Или 50% дуты цыцле.

 

вот код моей настройки таймера:

// enable TIM3 clock
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;


// set the Auto Reload Register
// PWM_period = Needed period / (1/TIM_frequency)
TIM3->ARR = 15000; // PWM_period = 7.5ms / (1/2MHz)

// set the prescaler
TIM3->PSC = 20; // f_cnt = 42MHz / (PSC + 1) = 2MHz

// clear CR2
TIM3->CR2 = 0;


TIM3->CCR1 = 7500; // 50% duty cycle

// set output compare mode 1.
TIM3->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1;

// enable Output compare
TIM3->CCER |= TIM_CCER_CC1E;

// enable TIM3
TIM3->CR1 |= TIM_CR1_CEN;

 

 

тут такое дело, ведь если я делю 42МГц клок на 21, и получаю 2МГц, а следовательно этот клок и является клоком таймера, то чтобы получить период в 7.5мс мне нужно чтобы счетчик посчитал до 15000, т.к. 1 клок - (1/2МГц = 0.5мкс), но а 15000 клоков это 7.5мс.

 

 

я загружаю в ARR 15000, ну а в CCR1 7500, т.к. мне 50% нужно.

 

 

Но почему я на выходе на осциллографе вижу сигнал с периодом 3.75мс, 50%, т.е. в два раза ровно быстрее?

ведь выбран режим: считать вверх, и счет идет каждые 0.5мкс (2МГц клок после деления 42МГц на 21)

что я тут упустил?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

мне кажется что клок таймера ТИМ3 = клок периферии * 2

 

ну а только после этого, этот клок таймера делится прескалером, и подается на счетчик.

 

я прав?

 

это даже в комментах некоторого кода стандартного видно.

а вот в даташите или мануале никак про явно не написано, не могу найти.

только лишь в даташите на стр. 29 в табличке видно что максимальная частота счетчика в два раза больше макс. частоты периферии таймера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...