上篇【S32K 進階之旅】系列博文介紹了 S32K 中的 LPUART 模塊,并以 S32DS 開發環境中自帶的例程 LPUART_s32k144 為例,使用 S32K144-EVB 評估板燒錄進行了演示。為了幫助新手快速的入門 LPUART 模塊,本文將逐句解析例程 LPUART_s32k144
一、 串口初始化:void LPUART_init(void)
1. 開啟時鐘

初始化確保時鐘關閉。
查詢 S32K144 參考手冊,設置 LPUART 時鐘源為 SOSCDIV2_CLK(0b001),并使能時鐘。


2. LPUART1->BAUD:LPUART波特率寄存器
用于配置串口波特率。

下圖為 32 位寄存器 BAUD 的圖表:

LPUART BAUD寄存器
通過查詢 LPUART BAUD 寄存器位功能可知:波特率=baud clock / ((OSR+1) * SBR)。baud clock為 SOSCDIV2_CLK= 8 MHz,OSR 默認值為F=15,則可以算出波特率為 9600 時,SBR的值約為 52,即 0x34。不使用BAUD寄存器的其他功能,則給 BAUD 寄存器賦值0x0F000034。

3. LPUART->CTRL:LPUART 控制寄存器
控制 LPUART 系統的多種可選特性,只有在發送器和接收器被禁止時才可以更改。

根據下圖32 位寄存器 CTRL 的圖表可知:TE=1,RE=1(0x000C0000)

LPUART CTRL寄存器
查寄存器字段知:設置收發使能,8-bit數據位,1-bit停止位,無校驗位,不使用中斷功能。

二、 功能函數
1. 發送單字符:void LPUART1_transmit_char(char send)

下圖為 32 位寄存器 STAT 的圖表:

LPUART STAT寄存器
已知:LPUART_STAT_TDRE_MASK=0x800000u,LPUART_STAT_TDRE_SHIFT=23u
函數功能:在發送器緩沖器空的時候,將 send 代表的數據放入 LPUART->DATA 中發送。

2. 字符串發送函數:void LPUART1_transmit_string(char data_string[])
函數功能:通過循環調用 LPUART1_transmit_char函數發送單個字符直到檢測到字符串結尾‘\0’,來實現發送字符串的功能。
3. 單字符接收函數:char LPUART1_receive_char(void)

已知:LPUART_STAT_RDRF_MASK=0x200000u;LPUART_STAT_RDRF_SHIFT=21u。
函數功能:等待接收器緩沖器滿的時候,讀取 LPUART->DATA 的數據賦值給 receive,并返回 receive 的值。

3. 單字符接收并回傳函數:void LPUART1_receive_and_echo_char(void)

函數功能:使用 LPUART1_receive_char 函數接收 send代表的字符,并通過LPUART1_transmit_char 函數重新發送。
注: “\r”是回車,“\n”是換行, Windows 系統中每行結尾應按 <回車><換行>的順序,即 “\r\n”。需要將例程中所有的“\n\r”改為“\r\n”,否則串口工具顯示輸出字符串將不會換行,出現錯誤格式。
三、 初始化引腳:void PORT_init (void)

函數功能:使能 PORTC 時鐘,配置引腳復用 PTC6為接收引腳,PTC7 為發送引腳。
注:各引腳功能具體查詢 S32K144 參考手冊。
ALT1 | ALT2 | ALT3 | ALT4 | ALT5 | ALT6 |
PTC7 | LPUART1_TX | CAN1_TX | FTM3_CH3 | FTM1_QD_PHA | |
PTC6 | LPUART1_RX | CAN1_RX | FTM3_CH2 | FTM1_QD_PHB |
四、 主循環:

函數功能:發送一個輸入提示字符‘>’,等待主機回傳,并將收到的字符再次回傳。
五、 參考文檔
[1] S32K144 Reference Manual.pdf,NXP
[2] S32K1xx Series Cookbook.pdf,NXP
[3] S32K1xx Series Reference Manual.pdf,NXP
[4] S32K144_IO_Signal_Description_Input_Multiplexing,NXP
-
NXP
+關注
關注
61文章
1328瀏覽量
187377 -
汽車電子
+關注
關注
3035文章
8243瀏覽量
169418 -
S32k144
+關注
關注
1文章
9瀏覽量
2027
發布評論請先 登錄
免費分享Arduino入門+進階(全套例程+書籍)

簡述K3S和K8S的區別
為什么無法使用Lpuart_Uart_Ip_ 發送任何數據回調中的AsyncSend?
S32K148頻繁UART_FRAMING_ERROR的原因?
S32K312通過UART口打印系統信息,是否有使用Printf () 函數打印信息的Demo例程?
使用RTD5.0.0的s32k312,C40_Ip擦除pflash存在一些問題求解決
k32l2b31寫入LPUART1->STAT |= (1<<25)會導致semihost_hardfault是為什么?
使用S32K322上的LPUART進行UART通信,接收超過14個字符時遇到問題,求解決
EB tresos導入S32K1 RTD中的例程,verify工程時報錯怎么解決?
WD50-110S24K1 WD50-110S24K1

S32K344將LPUART6添加到Uart_example產生硬故障怎么解決?
手冊描述LPUart1可以工作在APB clock domain,請問用HAL庫如何設置?
【S32K 進階之旅】如何使用 S32K3 PIT 定時器實現精準延時?

BOOSTXL-K350QVG-S1 QVGA顯示BoosterPack?插件模塊用戶指南

評論