智芯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的用法,這對于用串口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ù)實(shí)質(zhì)是一個(gè)宏,它其實(shí)調(diào)用的是fputc()
函數(shù),而fputc()函數(shù)在<stdio.h>
里面是有定義的,但它默認(rèn)不是指向串口。
如果需要printf()
函數(shù)指定到串口上就需要重寫fputc()
函數(shù),原理是鏈接器檢查到用戶編寫了與C庫函數(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庫
除了上述的代碼編寫,我們還需要在keil上面把MicroLIB庫(微庫)勾選上,具體原理其實(shí)我也不是很懂。
關(guān)于MicroLIB庫的介紹,官方的解釋是:MicroLib 是一個(gè)高度優(yōu)化的庫,適用于用 C 編寫的基于 ARM 的嵌入式應(yīng)用程序。與 ARM 編譯器工具鏈中包含的標(biāo)準(zhǔn) C 庫相比,MicroLib 提供了許多嵌入式系統(tǒng)所需的顯著代碼大小優(yōu)勢。
看了這解釋,我好像懂了又好像沒有,不過這不重要,反正我知道不勾這個(gè)庫就用不了printf()函數(shù),那咱勾上就好了。
打開Options for Target
,勾選Use MicroLIB
即可。
結(jié)束語
上面的步驟都做完以后就可以使用串口printf()打印數(shù)據(jù)了,具體的用法和測試圖這里就不放了,大家都懂的。
步驟也簡單,和stm32的串口重定向原理都一樣,用過的同學(xué)應(yīng)該都知道。
好了,關(guān)于智芯Z20K11x串口printf重定向的介紹就到這里,如果還有什么問題,歡迎評論區(qū)留言或者私信,謝謝。