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

А куда делась строка

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

?

...остальные:

последний файл хеадер:

stm32f10x_gpio.txt

stm32f10x_rcc.txt

stm32f10x_gpio.txt

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


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

Попробывал код из сообщения #8. Все работает и в симуляторе (Keil) и в железе (STM32F103T8U6)!

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


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

И, кстати, откуда вдруг появилась строка

    AFIO->MAPR|=0x00001000;

?

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

 

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


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

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

В файле "stm32f10x_rcc"

 

И, кстати, откуда вдруг появилась строка

Код

AFIO->MAPR|=0x00001000;

 

?

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

... :blush: я уж и не знаю что делать.

Подозреваю, что что-то до настроек таймера не сделал.

 

Попробывал код из сообщения #8. Все работает и в симуляторе (Keil) и в железе (STM32F103T8U6)!

здесь не полный код. Нет настроек каких-то,которые идут до таймера.

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


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

здесь не полный код. Нет настроек каких-то,которые идут до таймера.

 

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

 

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

 

Достаточно:

1. Включить тактовые частоты таймера, порта, альтернативных функций;

2. Настроить порт на альтернативную функцию;

3. Настроить таймер на генерацию ШИМ;

4. Зациклится на месте.

 

0. Не использовать библиотеку от ST (опционально)

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


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

В файле "stm32f10x_rcc"

 

У-у-у, как всё запущено:)

В файле 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;
}

И всё!

 

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


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

Я понял все с таймером(ШИМом). Спасибо.

Теперь напишите подробнее, как сконфигурироваться от внутреннего HSI.

Как сконфигурировать внутренние частоты.

Заранее спасибо. То есть, интересует процедура RCC_Configuration().

В примерах что-то не нашел конфигурацию от внутреннего источника.

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


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

 

А это - не то, что требуется?

/*******************************************************************************
* 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;
}

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


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

А это - не то, что требуется?

/*******************************************************************************
* 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;

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


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

Сегодня узнал интересную особенность. Я отлаживаю программу в режиме симуляции. Я загружаю код в Ride7 и хочу увидеть там ШИМ в пошаговом режиме, а его там нет. Так вот мне сказали, среда Ride7 не покажет ШИМ.Так что смотреть надо на реальном контроллере. Может быть у меня уже получался ШИМ.

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


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

Решил оставить в покое ШИМ и выдать простой меандр на ту же ножку PB7. Сконфигурил ее на выход и вот что получилось:

..и все равно не работает :laughing:

Aok_mn.txt

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


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

Нашел ошибку :rolleyes:

У меня была строчка:

GPIOB->CRL|=0xB0000000; //выход 50МГц, общее назначение вывода

После сброса в регистре GPIOB_CRL не нулевое значение,поэтому я получал не то что хотел.

Правильное значение:

GPIOB->CRL=0xB0000000; //выход 50МГц, альтернативная функция push-pull.

После этой строчки ШИМ появился.

Большое спасибо всем ответившим за помощь!

 

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


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

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

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

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

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

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

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

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

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

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