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

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

Пт июл 07, 2017 23:41:52

Доброго времени суток... Использую отладочную плату 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

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

Сб июл 08, 2017 06:56:57

STM32F3DISCOVERY изначально без кварца, судя по картинке с сайта ST, вроде по коду вы включаете HSE. В HALовских функциях настройки тактирования, если нет кварца может и вообще зависнуть.

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

Сб июл 08, 2017 09:15:12

Кварц на 8 МГц и всю обвязку к нему, допаял вручную. Тут чуть-чуть пошаманил и у меня такая проблема, когда собираешь отладочную версию (Debug), а когда прошил релизной версией (Releas), то все стартует сразу и без задержек...

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

Сб июл 08, 2017 10:16:05

тогда пошагово дебагом пройтись по функциям и посмотреть где зависает - скорее всего в HAL_RCC_OscConfig(&osc_def). Debug версия обычно дает больший размер кода (оптимизация отключена).

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

Вс июл 30, 2017 18:35:49

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

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

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