Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Генерирование частоты на stm32

Сб апр 06, 2013 10:40:08

Добрый день, ув. коты! Помогите найти ошибку. Я нехитрым кодом пытаюсь генерировать определенную частоту, но на осциллограмме наблюдаю совершенно другое, чем предполагал, вот код:
Код:
#include "stm32f10x.h"
//#include "header\settings.h"
//----------
void init(void);
//----------
int main(void)
{
   init();
   
   while(1)
   {}
}
//----------
void TIM6_DAC_IRQHandler(void)
{
  if(TIM6->SR & TIM_SR_UIF)
  {
    TIM6->SR &= ~TIM_SR_UIF;     //сбросить флаг
      
      if(GPIOA->IDR & GPIO_IDR_IDR0) // если на выходе PA0 единица
      {
         GPIOA->BSRR |= GPIO_BSRR_BR0; // сбросить в ноль
      }
      else
      {
         GPIOA->BSRR |= GPIO_BSRR_BS0; // выставить в единицу
      }
   } 
}
//----------
void init(void)
{
   RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // включение тактирования порта А
   RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // включение тактирования порта В
   RCC->APB1ENR |= RCC_APB1ENR_TIM6EN; // включение тактирования таймера 6
   //RCC->APB1ENR |= RCC_APB1ENR_TIM7EN; // включение тактирования таймера 7
   
   // настройка PA0 на выход (излучатель)
   GPIOA->CRL &= ~GPIO_CRL_CNF0; // сброс настроек направления PA0 (CNF0[1:0] - push-pull)
   GPIOA->CRL &= GPIO_CRL_MODE0; // сброс настроек частоты PA0
    GPIOA->CRL |= GPIO_CRL_MODE0_1; // максимальная частота 2MHz
   
   // настройка таймера TIM6
   TIM6->PSC = 8001;
   TIM6->ARR = 500; // счетчик автоперезагрузки
   TIM6->DIER = TIM_DIER_UIE; // разрешить обновления прерывания TIM6
   TIM6->CR1 |= TIM_CR1_ARPE | TIM_CR1_CEN; // разрешить автоперезагрузку
                                                                // по предустановленному значению
                                                                // включить таймер
   
   NVIC_EnableIRQ(TIM6_DAC_IRQn); // разрешить прерывания TIM6
   NVIC_SetPriority(TIM6_DAC_IRQn, 0); //задаем приоритет прерывания
   
   __enable_irq(); // разрешаем глобальные прерывания
}

Хотел чтобы частота была 1 Гц, а осциллограф показывает 4.5 Гц...померял руками и действительно 4.5 Гц...что не так...вроде бы предделитель настроен на 1000 мс и счетчик должен срабатывать каждые 500 мс, или я где-то не прав?

Re: Генерирование частоты на stm32

Вт апр 09, 2013 15:01:25

Все таки запустил тактирование от внешнего кварца на 12 МГц, а вот почему без настроек тактирования выдавало 4.5 Гц так и не понял...перелопатил весь раздел reset and clock, но ничего не нашел, только то что по умолчанию контроллер стартует от внутреннего генератора на 8 МГц...а на практике оказалось не так....

Re: Генерирование частоты на stm32

Ср апр 10, 2013 19:39:32

gruffi писал(а):Все таки запустил тактирование от внешнего кварца на 12 МГц, а вот почему без настроек тактирования выдавало 4.5 Гц так и не понял...перелопатил весь раздел reset and clock, но ничего не нашел, только то что по умолчанию контроллер стартует от внутреннего генератора на 8 МГц...а на практике оказалось не так....

8 * 4,5 = 36
похоже по умолчанию стояла максимальная частота
можно посмотреть, что в SystemCoreClock по умолчанию записанно
Ответить