Генерирование частоты на stm32
Добавлено: Сб апр 06, 2013 10:40:08
Добрый день, ув. коты! Помогите найти ошибку. Я нехитрым кодом пытаюсь генерировать определенную частоту, но на осциллограмме наблюдаю совершенно другое, чем предполагал, вот код:
Хотел чтобы частота была 1 Гц, а осциллограф показывает 4.5 Гц...померял руками и действительно 4.5 Гц...что не так...вроде бы предделитель настроен на 1000 мс и счетчик должен срабатывать каждые 500 мс, или я где-то не прав?
Код: Выделить всё
#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(); // разрешаем глобальные прерывания
}