Почему долго стартует МК

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Aviator_93
Открыл глаза
Сообщения: 49
Зарегистрирован: Ср мар 26, 2014 17:33:08

Почему долго стартует МК

Сообщение Aviator_93 »

Доброго времени суток... Использую отладочную плату STM32F3DISCOVERY. Пытаюсь настроить шим сигнал на 2 каналах таймера TIM 1. Никак не могу понять, почему после подключения питания к плате, микроконтроллер долго стартует? Пины 1 и 2 каналов, на самой плате, выведены на светодиоды, соответственно, когда началась генерация шим, светодиоды хоть как то загораются... Подключив питание к плате или после нажатия кнопки RESET, проходит где-то 30-40 секунд, после чего начинается генерация шим и светодиоды загораются... Почему все так медленно?

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

#include "stm32f3xx.h"
			
void SetRCC()
{
	RCC_OscInitTypeDef osc_def;
	RCC_ClkInitTypeDef clk_def;
	RCC_PeriphCLKInitTypeDef per_def;

	HAL_RCC_EnableCSS();

	osc_def.OscillatorType = RCC_OSCILLATORTYPE_HSE;
	osc_def.HSEState = RCC_HSE_ON;
	osc_def.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
	osc_def.LSEState = RCC_LSE_OFF;
	osc_def.HSIState = RCC_HSI_OFF;
	osc_def.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
	osc_def.LSIState = RCC_LSI_OFF;
	osc_def.PLL.PLLState = RCC_PLL_ON;
	osc_def.PLL.PLLSource = RCC_PLLSOURCE_HSE;
	osc_def.PLL.PLLMUL = RCC_PLL_MUL9;
	HAL_RCC_OscConfig(&osc_def);

	clk_def.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
						| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
	clk_def.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
	clk_def.AHBCLKDivider = RCC_SYSCLK_DIV1;
	clk_def.APB1CLKDivider = RCC_HCLK_DIV2;
	clk_def.APB2CLKDivider = RCC_HCLK_DIV1;
	HAL_RCC_ClockConfig(&clk_def, FLASH_LATENCY_2);

	per_def.RTCClockSelection = RCC_PERIPHCLK_TIM1;
	per_def.Tim1ClockSelection = RCC_TIM1CLK_HCLK;
	HAL_RCCEx_PeriphCLKConfig(&per_def);
}

void SetGPIOs()
{
	GPIO_InitTypeDef pin_out;

	__HAL_RCC_GPIOE_CLK_ENABLE();

	pin_out.Pin = GPIO_PIN_9 | GPIO_PIN_11;
	pin_out.Mode = GPIO_MODE_AF_PP;
	pin_out.Pull = GPIO_PULLDOWN;
	pin_out.Speed = GPIO_SPEED_FREQ_HIGH;
	pin_out.Alternate = GPIO_AF2_TIM1;

	HAL_GPIO_Init(GPIOE, &pin_out);
}

void InitTim1()
{
	TIM_HandleTypeDef htim1;
	TIM_OC_InitTypeDef pwm;

	__HAL_RCC_TIM1_CLK_ENABLE();

	HAL_TIM_PWM_MspInit(&htim1);

	htim1.Instance = TIM1;
	htim1.Init.Prescaler = 1200 - 1;
	htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
	htim1.Init.Period = 1200 - 1;
	htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
	htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
	HAL_TIM_PWM_Init(&htim1);

	pwm.OCMode = TIM_OCMODE_PWM2;
	pwm.Pulse = 0;
	pwm.OCPolarity = TIM_OCPOLARITY_HIGH;
	pwm.OCFastMode = TIM_OCFAST_DISABLE;
	HAL_TIM_PWM_ConfigChannel(&htim1, &pwm, TIM_CHANNEL_1);

	pwm.OCMode = TIM_OCMODE_PWM2;
	pwm.Pulse = 0;
	pwm.OCPolarity = TIM_OCPOLARITY_HIGH;
	pwm.OCFastMode = TIM_OCFAST_DISABLE;
	HAL_TIM_PWM_ConfigChannel(&htim1, &pwm, TIM_CHANNEL_2);

	HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
	HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);

	TIM1->CCR1 = 600;
	TIM1->CCR2 = 600;
}

int main(void)
{
	SetRCC();
	SetGPIOs();
	InitTim1();

	while(1)
	{

	}
}
Программирую в System Workbench for STM32
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Почему долго стартует МК

Сообщение oleg110592 »

STM32F3DISCOVERY изначально без кварца, судя по картинке с сайта ST, вроде по коду вы включаете HSE. В HALовских функциях настройки тактирования, если нет кварца может и вообще зависнуть.
Реклама
Aviator_93
Открыл глаза
Сообщения: 49
Зарегистрирован: Ср мар 26, 2014 17:33:08

Re: Почему долго стартует МК

Сообщение Aviator_93 »

Кварц на 8 МГц и всю обвязку к нему, допаял вручную. Тут чуть-чуть пошаманил и у меня такая проблема, когда собираешь отладочную версию (Debug), а когда прошил релизной версией (Releas), то все стартует сразу и без задержек...
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Почему долго стартует МК

Сообщение oleg110592 »

тогда пошагово дебагом пройтись по функциям и посмотреть где зависает - скорее всего в HAL_RCC_OscConfig(&osc_def). Debug версия обычно дает больший размер кода (оптимизация отключена).
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
AlanDrakes
Прорезались зубы
Сообщения: 236
Зарегистрирован: Пн июл 04, 2016 16:51:22
Откуда: Россия, Омск

Re: Почему долго стартует МК

Сообщение AlanDrakes »

Кошмар какой.
У меня контроллер (что на Discovery плате, что на готовых устройствах) стартует едва ли не быстрее, чем напряжение его питания стабилизируется на уровне 3.3V.
Кварц в низком корпусе, к нему добавлены небольшие нагрузочные ёмкости около 10пФ, без которых запуск происходит неуверено. Кстати, попробуйте добавить пару конденсаторов от ножек кварца к земле.

Опять же, попробуйте запустить кристалл без кварца. Если запустится сразу - проблема явно либо в самом кварце, либо в недостаточной/излишней ёмкости между какой-то (или двумя) ножкой и землёй. Проверьте, насколько хорошо смыт флюс.
Полистайте AN2867 Oscillator design guide for ST microcontrollers

Ради прикола, то, как у меня инициализируется кварцевый генератор:
Спойлер

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

void RCC_Init(void) {
	uint32_t i;
	RCC->CR |= RCC_CR_HSEON;
	i=0;
	while (!(RCC->CR & RCC_CR_HSERDY)) { };  // Ожидаем запуска собственно кристалла
	// Flash: Enable Perfetch + Latency = 1 cycle (24..48MHz)
	FLASH->ACR |= FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY_0;
	// PLL input = HSE / 2 = 6MHz, PLL_MUL = 5 = 30MHz, PLL.SRC = HSE, 
	RCC->CFGR |= RCC_CFGR_PLLXTPRE_HSE_DIV2 | RCC_CFGR_PLLMULL5 | RCC_CFGR_PLLSRC | RCC_CFGR_ADCPRE_DIV8;
	// Запускаем сам PLL
	RCC->CR |= RCC_CR_PLLON;
	// Ожидаем готовности
	while (!(RCC->CR & RCC_CR_PLLRDY)) { };
	i = RCC->CFGR;
	i &= ~(RCC_CFGR_SW);
	i |= RCC_CFGR_SW_PLL;
	RCC->CFGR = i;
	RCC->APB1ENR |= RCC_APB1ENR_PWREN;		// Разрешаем работу PWR модуля
};
Реклама
Ответить

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