Я установил цепочку инструментов на основе Windows для платы обнаружения STM32F401C, используя Eclipse CDT 4.5.1 (Mars), ARM GCC 4.9 2015q3, GnuArmEclipse-Plugin от Ливиу Ионеску, 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 функция _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
}
}
Я ожидал, что светодиод будет мигать, но только команда переключения внутри самой основной функции показала эффект.
Почему моя функция записи не вызывается? Я что-то пропустил?