加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 1 串口代碼編寫
    • 2 Keil勾選MicroLIB庫
    • 結(jié)束語
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

智芯Z20K11x串口printf重定向

04/09 11:20
1848
閱讀需 7 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

智芯Z20K11x系列是基于ARM CORTEX M0+的中低端微控制器,高達256K P FLASH + 128K D FLASH,2路CANFD接口,4路UART/LIN接口,多種封裝類型,適用于車身控制、空調(diào)控制、照明控制、中小功率電機控制等各種應(yīng)用。更多詳細的信息可以到智芯官網(wǎng)查看。

智芯官網(wǎng)地址:https://www.zhixin-semi.com

最近用到這個MCU做項目,發(fā)現(xiàn)官方的SDK里面有串口的demo但沒有串口printf的用法,這對于用串口debug來說沒有那么方便,所以我就自己做了。

1 串口代碼編寫

1、串口初始化

Z20K11x有幾組串口,我這里以UART0的PTA11和PTA12為例。

void uart_init(void)
{
    /*Uart config struct*/
    static const UART_Config_t uartCfg = 
    {
        115200,
        UART_DATABITS_8,
        UART_PARITY_NONE,
        UART_STOPBITS_1,
        DISABLE,
        40000000,
    };

    /*Config UART0 clock, enable UART0 module*/
    CLK_ModuleSrc(CLK_UART0, CLK_SRC_OSC40M);
    CLK_SetClkDivider(CLK_UART0, CLK_DIV_1);
    SYSCTRL_EnableModule(SYSCTRL_UART0);
    
    /*Config PortA clock, enable PortE module*/
    CLK_ModuleSrc(CLK_PORTA, CLK_SRC_OSC40M);
    SYSCTRL_EnableModule(SYSCTRL_PORTA);

    /* Inital UART0 */
    UART_Init(UART0_ID, &uartCfg);
    
    /*Config UART0 pinmux*/
    PORT_PinmuxConfig(PORT_A, GPIO_11, PTA11_UART0_TX);
    PORT_PinmuxConfig(PORT_A, GPIO_12, PTA12_UART0_RX);

    /*When UART re-open after close, need to check and clear busy status*/
    while(ERR == UART_WaitBusyClear(UART0_ID, 7000))
    {
        (void)UART_ReceiveByte(UART0_ID);
    }
}

2、fputc函數(shù)重定向

我們常用的printf()函數(shù)在c標(biāo)準(zhǔn)庫函數(shù)實質(zhì)是一個宏,它其實調(diào)用的是fputc()函數(shù),而fputc()函數(shù)在<stdio.h>里面是有定義的,但它默認不是指向串口。

如果需要printf()函數(shù)指定到串口上就需要重寫fputc()函數(shù),原理是鏈接器檢查到用戶編寫了與C庫函數(shù)相同名字的函數(shù)時,優(yōu)先調(diào)用用戶編寫函數(shù),這樣就可實現(xiàn)重定向。

下面以串口0為例重寫fputc()函數(shù)。

int fputc(int ch, FILE *f)
{     
    (void) f; 
    /* Wait untill FIFO is empty */
	while(RESET == UART_GetLineStatus(UART0_ID, UART_LINESTA_TEMT))
    {
    }
    /* Send data */
    UART_SendByte(UART0_ID, (uint8_t)ch);     
	return ch;
}

2 Keil勾選MicroLIB庫

除了上述的代碼編寫,我們還需要在keil上面把MicroLIB庫(微庫)勾選上,具體原理其實我也不是很懂。

關(guān)于MicroLIB庫的介紹,官方的解釋是:MicroLib 是一個高度優(yōu)化的庫,適用于用 C 編寫的基于 ARM 的嵌入式應(yīng)用程序。與 ARM 編譯器工具鏈中包含的標(biāo)準(zhǔn) C 庫相比,MicroLib 提供了許多嵌入式系統(tǒng)所需的顯著代碼大小優(yōu)勢。

看了這解釋,我好像懂了又好像沒有,不過這不重要,反正我知道不勾這個庫就用不了printf()函數(shù),那咱勾上就好了。

打開Options for Target,勾選Use MicroLIB即可。

在這里插入圖片描述

結(jié)束語

上面的步驟都做完以后就可以使用串口printf()打印數(shù)據(jù)了,具體的用法和測試圖這里就不放了,大家都懂的。

步驟也簡單,和stm32的串口重定向原理都一樣,用過的同學(xué)應(yīng)該都知道。

好了,關(guān)于智芯Z20K11x串口printf重定向的介紹就到這里,如果還有什么問題,歡迎評論區(qū)留言或者私信,謝謝。

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
HFE7000-210 1 Honeywell Sensing and Control Fiber Optic Emitter, FIBER OPTIC LED EMITTER, 50Mbps, THROUGH HOLE MOUNT, SMA CONNECTOR, PLASTIC PACKAGE-4
$21.47 查看
ASDMB-50.000MHZ-LY-T 1 Abracon Corporation MEMS OSC XO 50.0000MHZ LVCMOS
$3.02 查看
NX5032GA-8.000M-STD-CSU-1 1 Nihon Dempa Kogyo Co Ltd Parallel - Fundamental Quartz Crystal, 8MHz Nom, ROHS COMPLIANT PACKAGE-2
暫無數(shù)據(jù) 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜