@vipvizor

Вызов функции C в другом файле. Как реализовать?

Здравствуйте!
Проблема в следующем, имеются 4 файла:
main.h
main.c
stm32f0xx_it.h
stm32f0xx_it.c
в файле main.c объявляется функция:
spoiler
void start_impulse()
{
if (count < 10 & off == 0)
{
TIM1->CNT= 0; while(TIM1->CNT < delay_sinus) {} // Задержка
pulse_out();
count++;
}
else
{
count = 0;
delay_sinus = delay_sinus - 700;
TIM1->CNT= 0; while(TIM1->CNT < delay_sinus) {} // Задержка
pulse_out();
}
if (delay_sinus <= 700)
{
off = 1;
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
}
}

в файле main.h тоже прописано объявление прототипа функции:
spoiler
/* Exported functions prototypes ---------------------------------------------*/
void Error_Handler(void);

/* USER CODE BEGIN EFP */
void start_impulse(void);
void pulse_out(void);
/* USER CODE END EFP */

При попытке вызвать функцию в stm32f0xx_it.c происходит ошибка:
"Description Resource Path Location Type undefined reference to `start_impulse' stm32f0xx_it.c /Timer/Core/Src line 154 C/C++ Problem"
Вызывается функция следующим образом:
spoiler
void EXTI4_15_IRQHandler(void)
{
/* USER CODE BEGIN EXTI4_15_IRQn 0 */

/* USER CODE END EXTI4_15_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);
start_impulse();
//HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
/* USER CODE BEGIN EXTI4_15_IRQn 1 */

/* USER CODE END EXTI4_15_IRQn 1 */
}

Подскажите новичку, в какую сторону гуглить ,пожалуйста, либо способ устранения проблемы.. Спасибо!
  • Вопрос задан
  • 299 просмотров
Решения вопроса 1
@vipvizor Автор вопроса
Ошибка была связана с тем, что я не привёл весь код.
Я объявил эти функции в цикле while..
Все проблемы из за области видимости.
Нужно было нормально объявить функции в теле программы..
Всем спасибо
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Код выглядит нормально. Разбирайся с тем как выполняется сборка проекта. Похоже, что проект не линкуется с main.o
Ответ написан
Комментировать
@vanyamba-electronics
void start_impulse(void);
void start_impulse()

Второе объявление в Си не эквивалентно первому. Поэтому линкер и ругается, что такой объект объявлен в заголовке, но по факту его нет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы