STM32F103C8 Плата Bluepill HAL_delay () проблема

Я использую STM32 cubeMX для настройки и Keil для программирования. Установите встроенный светодиодный контакт pc13 в качестве выходного контакта и по умолчанию в двухтактном режиме. Установите отладчик на последовательный кабель, поскольку я использую ST-link V2 в качестве отладчика. RCC установил HSE на кварцевый / керамический резонатор. и конфигурация часов установлена ​​по умолчанию и сгенерирован проект. введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Теперь я начал с простой программы мигания светодиодами. Как показано ниже

    HAL_GPIO_TogglePin(led_GPIO_Port,led_Pin);
    HAL_Delay(1000);

построить успешно без ошибок и загрузить и удивиться, что мой светодиод не мигал и шокирован, как я делал это раньше, а теперь это не работает. когда я отлаживал шаг за шагом, и мой код несколько раз переходил от двух функций.

  while ((HAL_GetTick() - tickstart) < wait)
  {
  }
__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}

В этом коде больше ничего не происходит. Я знаю, что код правильный, но в конфигурации HAL_delay есть ошибка. Почесав голову в течение дня, я попытался загрузить следующий код

    HAL_GPIO_TogglePin(led_GPIO_Port,led_Pin);
    HAL_Delay(100);

И странно то, что теперь мой светодиод мигает только я изменил значение HAL_dealy с 1000 на 100, и он работает нормально, но при использовании 1000 не работает вообще. Поэтому для тестирования я постепенно увеличивал значение задержки и обнаружил, что больше HAL_delay (400) не работает.

Не удалось найти причину для этого. Любая помощь будет заметна.

Как предложил Том, я отлаживал uwTickFreq с помощью STstudio. и я получил следующую форму выходного сигнала. введите описание изображения здесь

После этого я также загрузил следующий код. И определил переменную как unsigned long int a;

    HAL_GPIO_TogglePin(led_GPIO_Port,led_Pin);
    HAL_Delay(100);
    a= HAL_GetTick();

Теперь я отладил значение a с помощью STstudio. И странно, что значение a становится 0, когда оно достигает значения 300.  введите описание изображения здесь


person dharmik    schedule 06.02.2021    source источник
comment
Каково значение uwTickFreq, tickstart и uwTick каждый раз?   -  person Tom V    schedule 06.02.2021
comment
Код, который вы опубликовали, явно не там, где ошибка. Вы были слишком агрессивны в показанных вами фрагментах. Если вы покажете хороший код фрагментами и спросите, почему они не работают, вы не получите ответов.   -  person Clifford    schedule 06.02.2021
comment
@TomV Я нашел следующую строку кода, разработанную в моем проекте Keil. HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT; / * 1 кГц * /   -  person dharmik    schedule 06.02.2021
comment
Я знаю эту строку, но можете ли вы использовать отладчик для проверки содержимого переменных?   -  person Tom V    schedule 06.02.2021
comment
@TomV Я отлаживал несколько вещей, см. Прикрепленное изображение формы волны, которое я получил из STstudio. Я не думаю, что значение переменной a должно сбрасываться, когда оно достигнет отметки 300, верно?   -  person dharmik    schedule 06.02.2021
comment
Кажется, что что-то пишет в эту переменную, чего не должно быть. Можете ли вы установить точку наблюдения за данными для переменной uwTick? В качестве альтернативы можете ли вы просмотреть выходные данные сборки, чтобы увидеть, ссылается ли какой-либо другой элемент кода на этот символ? Если вы используете компоновщик GNU, попробуйте использовать флаг -Wl, -Map = file.map или, возможно, запустить nm для каждого из ваших объектов сборки.   -  person Tom V    schedule 06.02.2021
comment
@TomV добавляет uwTick в окно просмотра в Keil, он не показывает никакого значения. сегодня в моем коде я определил один вывод как выходной и установил его состояние на высокое при запуске. Я загрузил код без какой-либо функции тайминга Hal и установил этот вывод на низкий уровень кода. Результат был выведен на пин, не светился это нормально. Теперь я добавляю еще одну строчку в свой код a = HAL_GetTick (); и установил контакт на низкий уровень и загрузил код, и теперь я вижу, что мой светодиод мигает, как слегка светится, и быстро гаснет, когда код сбрасывает контакт. вывод кажется, что контроллер сбрасывается при использовании функций hal_delay.   -  person dharmik    schedule 07.02.2021
comment
Вы же не пытаетесь управлять светодиодом напрямую от PC13 без полевого транзистора? Потому что этот вывод не может ни получать, ни потреблять ток.   -  person Tom V    schedule 07.02.2021
comment
@TomV PC13 имеет встроенный светодиод на плате bluepill. Сначала я пытался с этим, и после того, как просто убедился, что я использовал вывод PB11, напрямую связанный со светодиодом, и резистор ограничения тока столкнулся с той же проблемой. Но изменив 3 необязательных байта, показанных ниже в ответе, проблема была решена.   -  person dharmik    schedule 07.02.2021


Ответы (1)


Кажется, наконец, у меня возникла проблема, когда я заметил проблему сброса в контроллере, который искал, и нашел что-то здесь.

Поэтому я проверил свои необязательные байты, установленные в MCU, с помощью программатора куба STM32. Он был установлен, как показано ниже.

введите описание изображения здесь

Поэтому я включил эти три необязательных байта.

введите описание изображения здесь

И проблема сброса исчезла, и теперь я могу правильно использовать функцию HAL_delay, и теперь значение HAL_GetTick () также увеличивается более чем на 300.

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

person dharmik    schedule 07.02.2021