реклама на сайте
подробности

 
 
> STM32F103T8, Ride7, ШИМ на PB7
AndreyKeil
сообщение Aug 16 2010, 13:42
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930



Второй день маюсь. Не могу запустить ШИМ на ноге PB7. Что я делаю не так? Подскажите ,плиз! 1111493779.gif
Прикрепленные файлы
Прикрепленный файл  main.txt ( 1.33 килобайт ) Кол-во скачиваний: 77
 
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 28)
AHTOXA
сообщение Aug 16 2010, 14:34
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



А включить таймер:
Код
    RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;

или
Код
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE)...

?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
AndreyKeil
сообщение Aug 17 2010, 03:48
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930



Включил теперь...
-не помогает.
RCC->APB2ENR|=1; - альтернативные фнкции портов включил и тоже ничего...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 17 2010, 04:55
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Вот мой рабочий код (таймер 2, канал 2):
Код
#define ARR_VAL    36
#define CCR2_VAL    ARR_VAL / 2

    // 1. set up timer
    TIM2->CR1 = TIM_CR1_ARPE;    // count up, no divisor, auto reload
    TIM2->ARR = ARR_VAL;        // timer period
    TIM2->PSC = 0;                // prescaler
    TIM2->EGR = TIM_EGR_UG;        // generate an update event to reload the prescaler value
    TIM2->CR2 = 0;

    // 2. set up ccr2
    TIM2->CCER &= ~(TIM_CCER_CC2E | TIM_CCER_CC2P);    // disable cc2 output, clear polarity
    TIM2->CCR2 = CCR2_VAL;                        // cc2 period
    TIM2->CCMR1 = TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE; // PWM 1 (0x6000), enable preload;
    TIM2->CCER |= TIM_CCER_CC2E;    // enable cc2 output

    TIM2->CR1 |= TIM_CR1_CEN;


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
AndreyKeil
сообщение Aug 17 2010, 06:43
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930



Сделал как ты написал, Антоха. С поправкой на таймер 4 - все равно не работает.
А в режиме симуляции таймер должен вести отсчеты?
И еще вопрос: на ножке порта в симуляторе я увижу ШИМ?
Go to the top of the page
 
+Quote Post
adnega
сообщение Aug 17 2010, 06:46
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



А в регистре RCC_APB2ENR бит AFIO_EN установлен?
Go to the top of the page
 
+Quote Post
AndreyKeil
сообщение Aug 17 2010, 06:53
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930



Цитата(adnega @ Aug 17 2010, 12:46) *
А в регистре RCC_APB2ENR бит AFIO_EN установлен?

да
Go to the top of the page
 
+Quote Post
adnega
сообщение Aug 17 2010, 07:39
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Код
#include    "stm32f10x_map.h"

#define    RCC_APB1ENR_TIM4EN        ((u32)(2))
#define    RCC_APB2ENR_IOPAEN        ((u32)(2))
#define    RCC_APB2ENR_IOPBEN        ((u32)(3))
#define    RCC_APB2ENR_AFIOEN        ((u32)(0))
#define    RCC_CFGR_ADCPRE            ((u32)(14))
#define    RCC_CFGR_PPRE1            ((u32)(8))
#define    AF_PP_50                    ((u32)(11))
#define    CFG_PIN7                    ((u32)(28))
#define    TIM_CCER_CC1E            ((u32)(0))
#define    TIM_CCER_CC2E            ((u32)(4))
#define    OC_MODE_PWM1            ((u32)(6))
#define    TIM_CCMR1_OC1M            ((u32)(4))
#define    TIM_CCMR1_OC2M            ((u32)(12))
#define    TIM_CR1_CEN                ((u32)(0))
#define    TIM_CR1_ARPE                ((u32)(7))

int    main()
{
    RCC->AHBENR=0;
    RCC->APB1ENR=
        (1<<RCC_APB1ENR_TIM4EN);
    RCC->APB2ENR=
        (1<<RCC_APB2ENR_IOPAEN)
        |(1<<RCC_APB2ENR_IOPBEN)
        |(1<<RCC_APB2ENR_AFIOEN);
    RCC->CFGR=
        (3<<RCC_CFGR_ADCPRE)
        |(4<<RCC_CFGR_PPRE1);

    GPIOB->CRL=(AF_PP_50<<CFG_PIN7);    // T4_C2


    TIM4->ARR=(12000000/75000)-1;        // запись периода
    TIM4->PSC=0;                        // запись базы
    TIM4->CCR1=10;                    // длительность импульса DIM0
    TIM4->CCR2=20;                    // длительность импульса DIM1
    TIM4->CCER=
        (1<<TIM_CCER_CC1E)
        |(1<<TIM_CCER_CC2E);            // разрешить первый и второй выходы сравнения
    TIM4->CCMR1=
        (OC_MODE_PWM1<<TIM_CCMR1_OC1M)    // режим ШИМ для первого канала
        |(OC_MODE_PWM1<<TIM_CCMR1_OC2M); // режим ШИМ для второго канала
    TIM4->CNT=0;
    TIM4->CR2=0;
    TIM4->CR1=
        (1<<TIM_CR1_CEN)                 // разрешить счет
        |(1<<TIM_CR1_ARPE);            // разрешить автоматическую перезагрузку

    while(1);
}


В Keil даже симулируется...

АХТУНГ!
А есть ли четвертый таймер у 103T8?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 17 2010, 07:49
Сообщение #9


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Нашёл ошибку:
Код
    GPIOB->CRL=0x30000000;//альтерн.функция push-pull,PB7-50МГц,

0x3 - это просто output, а надо 0xB - альтернативный output.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
AndreyKeil
сообщение Aug 17 2010, 08:03
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930



Цитата(AHTOXA @ Aug 17 2010, 13:49) *
Нашёл ошибку:
Код
    GPIOB->CRL=0x30000000;//альтерн.функция push-pull,PB7-50МГц,

0x3 - это просто output, а надо 0xB - альтернативный output.

это я уже исправил. Все равно не помогает...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 17 2010, 08:20
Сообщение #11


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(adnega @ Aug 17 2010, 13:39) *
А есть ли четвертый таймер у 103T8?

Вроде есть.

Цитата(AndreyKeil @ Aug 17 2010, 14:03) *
это я уже исправил. Все равно не помогает...


В симуляторе или в реальном железе?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
AndreyKeil
сообщение Aug 17 2010, 08:42
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930



Цитата(AHTOXA @ Aug 17 2010, 14:20) *
Вроде есть.



В симуляторе или в реальном железе?

Не работает и в симуляторе, и в железе.

Таймер4 есть.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 17 2010, 08:55
Сообщение #13


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Покажите полный код, что есть сейчас.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
AndreyKeil
сообщение Aug 17 2010, 09:03
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930



Цитата(AHTOXA @ Aug 17 2010, 14:55) *
Покажите полный код, что есть сейчас.

Вот
Прикрепленные файлы
Прикрепленный файл  mn.txt ( 9.57 килобайт ) Кол-во скачиваний: 133
 
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 17 2010, 09:14
Сообщение #15


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



А куда делась строка
Код
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
AndreyKeil
сообщение Aug 17 2010, 09:23
Сообщение #16


Частый гость
**

Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930



Цитата(AHTOXA @ Aug 17 2010, 15:14) *
А куда делась строка
Код
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

?

...остальные:
последний файл хеадер:
Прикрепленные файлы
Прикрепленный файл  stm32f10x_gpio.txt ( 21.98 килобайт ) Кол-во скачиваний: 28
Прикрепленный файл  stm32f10x_rcc.txt ( 42.56 килобайт ) Кол-во скачиваний: 318
Прикрепленный файл  stm32f10x_gpio.txt ( 14.47 килобайт ) Кол-во скачиваний: 27
 
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 17 2010, 09:50
Сообщение #17


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Да не. Где вызов этой функции?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
adnega
сообщение Aug 17 2010, 09:52
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Попробывал код из сообщения #8. Все работает и в симуляторе (Keil) и в железе (STM32F103T8U6)!
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 17 2010, 09:54
Сообщение #19


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



И, кстати, откуда вдруг появилась строка
Код
    AFIO->MAPR|=0x00001000;

?
Вам же не нужен ремап. Вы что, методом научного тыка пытаетесь запустить PWM?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
AndreyKeil
сообщение Aug 17 2010, 10:15
Сообщение #20


Частый гость
**

Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930



Цитата(AHTOXA @ Aug 17 2010, 15:50) *
Да не. Где вызов этой функции?

В файле "stm32f10x_rcc"

Цитата(AHTOXA)
И, кстати, откуда вдруг появилась строка
Код
AFIO->MAPR|=0x00001000;

?
Вам же не нужен ремап. Вы что, методом научного тыка пытаетесь запустить PWM?

... blush.gif я уж и не знаю что делать.
Подозреваю, что что-то до настроек таймера не сделал.

Цитата(adnega @ Aug 17 2010, 15:52) *
Попробывал код из сообщения #8. Все работает и в симуляторе (Keil) и в железе (STM32F103T8U6)!

здесь не полный код. Нет настроек каких-то,которые идут до таймера.
Go to the top of the page
 
+Quote Post
adnega
сообщение Aug 17 2010, 10:58
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(AndreyKeil @ Aug 17 2010, 14:15) *
здесь не полный код. Нет настроек каких-то,которые идут до таймера.


Здесь достаточный код для генерации ШИМ сигнала на ноге PB7 указанного МК)

А Вы его уже запускали?

Достаточно:
1. Включить тактовые частоты таймера, порта, альтернативных функций;
2. Настроить порт на альтернативную функцию;
3. Настроить таймер на генерацию ШИМ;
4. Зациклится на месте.

0. Не использовать библиотеку от ST (опционально)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 17 2010, 11:30
Сообщение #22


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(AndreyKeil @ Aug 17 2010, 16:15) *
В файле "stm32f10x_rcc"


У-у-у, как всё запущеноsmile.gif
В файле stm32f10x_rcc.c - не вызов, а определение этой функции.

Давайте по порядку. Вот наш main():
Код
void main()
{
// 1. Инициализируем клоки:
    RCC_Configuration();

// 2. Инициализируем контроллер прерываний:
    NVIC_Configuration();

// 3. Включаем порт B:
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;

// 4. Включаем альтернативные функции:
    RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;

// 5. Включаем таймер4:
    RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;

// 6. Сконфигурируем ногу PB7 как альтернативный output:
    GPIOB->CRL=0xB0000000;

// 7. Теперь займёмся конфигурированием таймера:
    TIM4->CR1 = TIM_CR1_ARPE;        // считаем вверх, автоперезагрузка, без делителя
    TIM4->CR2 = 0;                // здесь ничего не нужно
    TIM4->ARR = 36;                // период таймера
    TIM4->PSC = 0;                // прескалер
    TIM4->EGR = TIM_EGR_UG;        // обновим прескалер немедленно

// 8. А теперь сконфигурим 2й канал таймера:
    TIM4->CCER &= ~(TIM_CCER_CC2E | TIM_CCER_CC2P);    // отключим вывод
    TIM4->CCR2 = 18;        // период
    TIM4->CCMR1 =
        TIM_CCMR1_OC2M_2 |
        TIM_CCMR1_OC2M_1 |
        TIM_CCMR1_OC2PE; // PWM 1 (0x6000), предзагрузка;
    TIM4->CCER |= TIM_CCER_CC2E;    // включаем вывод 2

// 9. И, наконец, запустим таймер:
    TIM4->CR1 |= TIM_CR1_CEN;
}

И всё!


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
AndreyKeil
сообщение Aug 17 2010, 14:49
Сообщение #23


Частый гость
**

Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930



Я понял все с таймером(ШИМом). Спасибо.
Теперь напишите подробнее, как сконфигурироваться от внутреннего HSI.
Как сконфигурировать внутренние частоты.
Заранее спасибо. То есть, интересует процедура RCC_Configuration().
В примерах что-то не нашел конфигурацию от внутреннего источника.
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение Aug 17 2010, 20:15
Сообщение #24


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118




А это - не то, что требуется?
Код
/*******************************************************************************
* Function Name  : RCC_SYSCLKConfig
* Description    : Configures the system clock (SYSCLK).
* Input          : - RCC_SYSCLKSource: specifies the clock source used as system
*                    clock. This parameter can be one of the following values:
*                       - RCC_SYSCLKSource_HSI: HSI selected as system clock
*                       - RCC_SYSCLKSource_HSE: HSE selected as system clock
*                       - RCC_SYSCLKSource_PLLCLK: PLL selected as system clock
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_SYSCLKConfig(u32 RCC_SYSCLKSource)
{
  u32 tmpreg = 0;

  /* Check the parameters */
  assert(IS_RCC_SYSCLK_SOURCE(RCC_SYSCLKSource));

  tmpreg = RCC->CFGR;

  /* Clear SW[1:0] bits */
  tmpreg &= CFGR_SW_Mask;

  /* Set SW[1:0] bits according to RCC_SYSCLKSource value */
  tmpreg |= RCC_SYSCLKSource;

  /* Store the new value */
  RCC->CFGR = tmpreg;
}


--------------------
ASB
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение Aug 18 2010, 02:34
Сообщение #25


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118



Цитата(Aleksandr Baranov @ Aug 17 2010, 16:15) *
А это - не то, что требуется?
Код
/*******************************************************************************
* Function Name  : RCC_SYSCLKConfig
* Description    : Configures the system clock (SYSCLK).
* Input          : - RCC_SYSCLKSource: specifies the clock source used as system
*                    clock. This parameter can be one of the following values:
*                       - RCC_SYSCLKSource_HSI: HSI selected as system clock
*                       - RCC_SYSCLKSource_HSE: HSE selected as system clock
*                       - RCC_SYSCLKSource_PLLCLK: PLL selected as system clock
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_SYSCLKConfig(u32 RCC_SYSCLKSource)
{
  u32 tmpreg = 0;

  /* Check the parameters */
  assert(IS_RCC_SYSCLK_SOURCE(RCC_SYSCLKSource));

  tmpreg = RCC->CFGR;

  /* Clear SW[1:0] bits */
  tmpreg &= CFGR_SW_Mask;

  /* Set SW[1:0] bits according to RCC_SYSCLKSource value */
  tmpreg |= RCC_SYSCLKSource;

  /* Store the new value */
  RCC->CFGR = tmpreg;
}

И еще кусок из void RCC_DeInit(void):
Код
/* Set HSION bit */
  RCC->CR |= (u32)0x00000001;

  /* Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], ADCPRE[1:0] and MCO[2:0] bits*/
  RCC->CFGR &= 0xF8FF0000;
  
  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= 0xFEF6FFFF;


--------------------
ASB
Go to the top of the page
 
+Quote Post
AndreyKeil
сообщение Aug 18 2010, 03:35
Сообщение #26


Частый гость
**

Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930



Сегодня узнал интересную особенность. Я отлаживаю программу в режиме симуляции. Я загружаю код в Ride7 и хочу увидеть там ШИМ в пошаговом режиме, а его там нет. Так вот мне сказали, среда Ride7 не покажет ШИМ.Так что смотреть надо на реальном контроллере. Может быть у меня уже получался ШИМ.
Go to the top of the page
 
+Quote Post
AndreyKeil
сообщение Aug 18 2010, 07:45
Сообщение #27


Частый гость
**

Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930



Решил оставить в покое ШИМ и выдать простой меандр на ту же ножку PB7. Сконфигурил ее на выход и вот что получилось:
..и все равно не работает laughing.gif
Прикрепленные файлы
Прикрепленный файл  Aok_mn.txt ( 7.43 килобайт ) Кол-во скачиваний: 97
 
Go to the top of the page
 
+Quote Post
AndreyKeil
сообщение Aug 18 2010, 18:15
Сообщение #28


Частый гость
**

Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930



Нашел ошибку rolleyes.gif
У меня была строчка:
GPIOB->CRL|=0xB0000000; //выход 50МГц, общее назначение вывода
После сброса в регистре GPIOB_CRL не нулевое значение,поэтому я получал не то что хотел.
Правильное значение:
GPIOB->CRL=0xB0000000; //выход 50МГц, альтернативная функция push-pull.
После этой строчки ШИМ появился.
Большое спасибо всем ответившим за помощь!
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 19 2010, 05:04
Сообщение #29


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Ура! smile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 17:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01564 секунд с 7
ELECTRONIX ©2004-2016