• 正文
    • 1 串口代碼編寫(xiě)
    • 2 Keil勾選MicroLIB庫(kù)
    • 結(jié)束語(yǔ)
  • 推薦器件
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

智芯Z20K11x串口printf重定向

2024/04/09
1805
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

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

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

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

1 串口代碼編寫(xiě)

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)庫(kù)函數(shù)實(shí)質(zhì)是一個(gè)宏,它其實(shí)調(diào)用的是fputc()函數(shù),而fputc()函數(shù)在<stdio.h>里面是有定義的,但它默認(rèn)不是指向串口。

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

下面以串口0為例重寫(xiě)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庫(kù)

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

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

看了這解釋?zhuān)液孟穸擞趾孟駴](méi)有,不過(guò)這不重要,反正我知道不勾這個(gè)庫(kù)就用不了printf()函數(shù),那咱勾上就好了。

打開(kāi)Options for Target,勾選Use MicroLIB即可。

在這里插入圖片描述

結(jié)束語(yǔ)

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

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

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

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
HFBR-1412Z 1 Broadcom Limited Transmitter, 792nm Min, 865nm Max, 5Mbps, ST Connector, DIP, Panel Mount, Through Hole Mount, ROHS COMPLIANT PACKAGE

ECAD模型

下載ECAD模型
$27.45 查看
TLP293-4(GB-TP,E(T 1 Toshiba America Electronic Components Transistor Output Optocoupler, 4-Element, 3750V Isolation

ECAD模型

下載ECAD模型
$2.77 查看
S29JL032J70TFI313 1 Cypress Semiconductor Flash, 2MX16, 70ns, PDSO48, TSOP-48
$30.84 查看

相關(guān)推薦