STM32CubeIDE中UART,printf無輸出的解決辦法

折騰了大半天,各種改造fputc,才想起來,老子用的是eclipse,不是MDK。

但是真心話,這全集成環境,挺好用。STM32Cube》eclipse》ST-Link》目標板,再也不用倒騰各種軟件和接口了。唯一不合適的,我這個i3,4G內存的機器,運行起來有那麼一堆堆卡頓。。。

鬧心的事兒不說。正題吧。兩個地方:

  • 第一,printf調用的底層不一樣。
  • 第二,main裡面記得調用stdio.h。要不然警告,但是能運行(純粹看著不舒服)。
<code>#include <stdio.h>/<code>

MDK中printf用的是fputc,在stdio.h裡面改就行了。

但是eclipse中,編譯用的GCC,也沒有microLIB,所以上面套路不管用了。得按照GCC的規矩來。

GCC中,printf用的是_write和_read,但是我們並不需要_read,這個在syscalls.c中,是一個備用的虛函數,並沒有指定數據流輸出的設備。

下面是_write的原型:

<code>__attribute__((weak)) int _write(int file, char *ptr, int len)
{
\tint DataIdx;

\tfor (DataIdx = 0; DataIdx < len; DataIdx++)
\t{
\t\t__io_putchar(*ptr++);
\t}
\treturn len;
}/<code>

我們來改造它一下:

先備註起舊的_write:


STM32CubeIDE中UART,printf無輸出的解決辦法

原文件

然後另起一行寫上新的_write,保存:


STM32CubeIDE中UART,printf無輸出的解決辦法

改造以後的

下面是改造好的,你也可以直接複製上去

<code>HAL_UART_Transmit_DMA(&huart4, (uint8_t *) &ptr[i++], len);/<code>

這裡自己改下數據流輸出設備和輸出方式就行了。

<code>HAL_UART_Transmit_DMA(&huart4, (uint8_t *) &ptr[i++], len);/*------------------------------------------------old _write begin--------------------------------------------------------------------
__attribute__((weak)) int _write(int file, char *ptr, int len)
{
\tint DataIdx;

\tfor (DataIdx = 0; DataIdx < len; DataIdx++)
\t{
\t\t__io_putchar(*ptr++);
\t}
\treturn len;
}
---------------------------------------------------old _write end and new _write begin-----------------------------------------------*/
int _write(int32_t fd, char* ptr, int32_t len) {
if (fd == STDOUT_FILENO || fd == STDERR_FILENO) {
int32_t i = 0;
while (i < len)
HAL_UART_Transmit_DMA(&huart4, (uint8_t *) &ptr[i++], len);//這句是用DMA方式將數據指向UART4。當然也可以用你自己的方式,TIM,DMA,寄存器。看你心情寫命令序列就好

}
return len;
}
//-------------------------------------------------new _write end-----------------------------------------------------------------------/<code>


STM32CubeIDE中UART,printf無輸出的解決辦法

寫好的printf。我用輸出RTC來示例下下


下載以後的運行結果:

STM32CubeIDE中UART,printf無輸出的解決辦法


分享到:


相關文章: