STM32 CubeMX/GNU/Eclipse-Toolchain Ретаргетинг (newlib и libgloss)
Я создал цепочку инструментов на основе Windows для платы обнаружения STM32F401C, используя Eclipse CDT 4.5.1 (Mars), ARM GCC 4.9 2015q3, GnuArmEclipse-Plugin от Liviu Ionescu, OpenOCD 0.9.0 и STM32CubeMX 4.11.0.
В общем, я сгенерировал проект SW4STM32 с использованием STM32CubeMX, импортировал все в новый проект Cross ARM GCC Eclipse C и адаптировал некоторые параметры, например символы, тип процессора, FPU и файл ссылок. Простой пример мигания светодиода построен успешно и может быть выполнен OpenOCD, точки останова также работают.
Чтобы обеспечить системные вызовы, требуемые newlib или newlib nano, например, _sbrk
а также _write
Я начал с --specs=nosys.specs
опция компоновщика. Таким образом, динамическое распределение памяти работает просто отлично. Тем не менее, я хотел бы реализовать _write
работать самостоятельно, чтобы печатать на дисплей или отправлять данные через UART.
В libgloss the _write
функция имеет слабый символ, поэтому ее должно быть достаточно для ее повторной реализации. Я сделал это в моем main.c:
int _write (int fd, char *ptr, int len)
{
HAL_GPIO_TogglePin(LD5_GPIO_Port, LD5_Pin);
HAL_Delay(300);
return len;
}
int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
HAL_GPIO_TogglePin(LD5_GPIO_Port, LD5_Pin);
printf("Blink");
while(1)
{
// do nothing
}
}
Я ожидал, что светодиод будет мигать, но только команда переключения внутри самой основной функции показала эффект.
Почему моя функция записи не вызывается? Я что-то пропустил?
1 ответ
Вы должны либо очистить буфер явно до выхода (fflush(stdout)
) или отправьте перевод строки ('\n'
).