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

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

智芯Z20K11x串口printf重定向

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

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

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

最近用到這個(gè)MCU做項(xiàng)目,發(fā)現(xiàn)官方的SDK里面有串口的demo但沒有串口printf的用法,這對(duì)于用串口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)庫(kù)函數(shù)實(shí)質(zhì)是一個(gè)宏,它其實(shí)調(diào)用的是fputc()函數(shù),而fputc()函數(shù)在<stdio.h>里面是有定義的,但它默認(rèn)不是指向串口。

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

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

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

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

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

在這里插入圖片描述

結(jié)束語(yǔ)

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

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

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

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
MX25L3233FM2I-08G 1 Macronix International Co Ltd Flash, 8MX4, PDSO8, SOP-8
$0.82 查看
HFBR-2412Z 1 Broadcom Limited Receiver, 5Mbps, ST Connector, Through Hole Mount, ROHS COMPLIANT, PLASTIC, 8 PIN
$31.76 查看
ASDMB-8.000MHZ-LC-T 1 Abracon Corporation MEMS OSC XO 8.0000MHZ LVCMOS SMD

ECAD模型

下載ECAD模型
$2.68 查看

相關(guān)推薦

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