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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 83
Зарегистрирован: Чт дек 29, 2011 16:25:56

Сообщение gruffi »

Добрый день, ув. коты! Помогите найти ошибку. Я нехитрым кодом пытаюсь генерировать определенную частоту, но на осциллограмме наблюдаю совершенно другое, чем предполагал, вот код:

Код: Выделить всё

#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 мс, или я где-то не прав?
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 83
Зарегистрирован: Чт дек 29, 2011 16:25:56

Сообщение gruffi »

Все таки запустил тактирование от внешнего кварца на 12 МГц, а вот почему без настроек тактирования выдавало 4.5 Гц так и не понял...перелопатил весь раздел reset and clock, но ничего не нашел, только то что по умолчанию контроллер стартует от внутреннего генератора на 8 МГц...а на практике оказалось не так....
Реклама
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Пт сен 21, 2007 17:53:23
Откуда: Зарайск

Сообщение mrFox »

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

Вернуться в «ARM»