NXP S32K312 UART 與 DMA 模塊結合應用講解

關鍵字 :NXPS32K312UARTDMA

1. 簡介

       本文介紹如何使用 NXP 提供的 RTD 軟體包開發 S32K312 UART 與 DMA 模塊結合應用,通過串口列印 Log 數據。

圖 1-1 Knight S32K312 開發板

圖 1-1 Knight S32K312 開發板

1.1 需求組件

硬體組件:

  • 開發板:Knight S32K312開發板;

軟體組件:

  • 開發軟體:S32 Design Studio for S32 Platform 3.5;
  • 拓展包:S32K3xx development V3.5.13;
  • RTD 版本:SW32K3_S32M27x_RTD_R21-11_4.0.0_P19_D2403_DS_updatesite;

2. 工程配置

2.1 UART 埠配置

       本文使用 UART1 模塊為例,配置埠 PTD13 與 PTD14 分別作為 UART1 模塊的 Rx 引腳與 Tx 引腳,在配置引腳時需要注意信號欄與方向欄,除了在信號欄里配置成 Tx、Rx 還需要根據 Tx、Rx 的數據輸入輸出調整方向,若不一致會導致執行初始化埠函數時進入硬體故障中斷而無法退出。

圖 2.1-1 UART 埠配置

圖 2.1-1 UART 埠配置

2.2 DMA 模塊配置

       配置 DMA 模塊首先需要在 General 選項卡下勾選 Enable DMA Support 選項,如不勾選此選項 Specific Configuration 頁面將處於灰色頁面無法進行配置操作。

圖 2.2-1 DMA General 頁面

圖 2.2-1 DMA General 頁面

       Specific Configuration 頁面我們需要配置 Hardware Channel、Interrupt Callback、Enable Global Config 與 Global 下 Enable DMA Request 選項。Hardware Channel 選項選擇所使用的硬體 DMA 通道,S32K312 僅有 1 個 DMA 模塊 12 個通道,所以使用 DMA 模塊時僅需配置 Hardware Channel 無需配置 Hardware Instance 選項;由於 DMA 模塊發送數據使用中斷功能所以需要中斷回調函數即配置 Interrupt Callback 選項內輸入中斷回調函數名稱,該回調函數可自定義;除以上配置外使用 DMA 功能還需要使能 DMA 請求即勾選 Global 下 Enable DMA Request 選項,使能 DMA 請求需要先勾選 Enable Global Config 選項;為了更好地將在其他模塊連接 DMA 通道建議同步修改 Name 欄名稱為通道所用功能。

圖 2.2-1 DMA 模塊 Tx 通道配置

圖 2.2-1 DMA 模塊 Tx 通道配置

圖 2.2-2 DMA 模塊 Rx 通道配置

圖 2.2-2 DMA 模塊 Rx 通道配置

       DMA 通道配置完成之後為了能夠使用 DMA 功能,還需要確定 DMA 的數據來源,然而 S32DS 內配置工具並沒有提供工具用於配置 DMA 源,所以需要我們手動使用代碼對寄存器進行寫入。通過查詢 S32K3xx_DMAMUX_map.xlsx 表格得知 LPUART1 發送 DMA 請求與接收 DMA 請求數據源分別為 39 和 40,同時查詢 S32KXXRM.pdf 手冊 Direct Memory Access Multiplexer(DMAMUX)章節下 DMAMUX register descriptions 小段得知 0x40280000-0x40280003 寄存器分別對應 DMA 通道3 到通道 0 的配置,寄存器為 8 位寄存器,0-5 位為 DMA 通道源在該位寫入值將指定特殊 DMA 數據來源到指定 DMA 通道;第 6 位是 DMA 通道觸發使能位,該位寫入 1 會周期觸發 DMA 通道;第 7 位是 DMA 通道使能位,寫入 1 將使能相應的 DMA 通道,例如向 0x40280003 第 7 位寫入 1 會使能 DMA 通道 0。綜上所屬本例程使用 DMA 通道 0 和通道 1 用作 LPURAT1 的 Tx 和 Rx 功能,即向 0x40280003 寄存器寫入 0xA7 數據與 0x40280002 寄存器寫入 0xA8 數據,具體寫入代碼如下:

    IP_DMAMUX_0->CHCFG[3]=0xA7;

    IP_TCD->CH0_CSR=1;

    IP_DMAMUX_0->CHCFG[2]=0xA8;

    IP_TCD->CH1_CSR=1;

圖 2.2-3 DMAMUX 寄存器地址與偏移地址 

圖 2.2-3 DMAMUX 寄存器地址與偏移地址

圖 2.2-4 寄存器位說明

圖 2.2-4 寄存器位說明

圖 2.2-4 寄存器位說明

2.3 UART 模塊配置

       UART 模塊配置相比普通串口模式配置只需在 GeneralConfiguration 頁面內勾選 Uart DMA Enable 選項,並在 UartGlobalConfig 頁面選擇發送模式為 DMA 模式並鏈接相應的 Tx 與 Rx DMA 通道即可。

圖 2.3-1 UART 模塊 GeneralConfiguration

圖 2.3-1 UART 模塊 GeneralConfiguration


圖 2.3-2 UART 模塊 UartGlobalConfig

圖 2.3-2 UART 模塊 UartGlobalConfig

2.4 IntCtrl 模塊配置

DMA 模塊通道發送數據使用中斷功能需要在 IntCtrl 模塊內對相應 DMA 模塊進行中斷配置。

圖 2.4-1 IntCtrl 模塊配置

圖 2.4-1 IntCtrl 模塊配置

3. 主函數編寫

       各模塊初始化與功能函數在工程內 MCAL 文件夾下相對應模塊名稱的頭文件與源文件內,若使用其他版本 RTD 軟體包則各函數名稱會有所區別調用函數需要到相應模塊文件內查找。

 

#include "Mcal.h"


#include "string.h"

#include "stdio.h"

#include "S32K312.h"

#include "Clock_Ip.h"

#include "Siul2_Port_Ip.h"

#include "IntCtrl_Ip.h"

#include "Lpuart_Uart_Ip.h"

#include "Dma_Ip.h"

 

#define uart1   1

#define message "this is uart1_dma example!\r\n"

#define timeout 0xFFFF

#define rxsize 30

#define txsize 30

 

ISR(LPUART_UART_IP_1_IRQHandler);

 

ISR(Dma0_Ch0_IRQHandler);

ISR(Dma0_Ch1_IRQHandler);

 

 

#pragma GCC section bss ".mcal_bss_no_cacheable"

       uint8 rxbuffer[rxsize]={0};

       uint8 txbuffer[txsize]={0};

#pragma GCC section bss

 

 

int main(void)

{

    /* Write your code here */

   int length=0;

   uint32 remainingbytes=0;

   Lpuart_Uart_Ip_StatusType status=LPUART_UART_IP_STATUS_SUCCESS;

   uint32 i,n=0;

 

Clock_Ip_Init(Clock_Ip_aClockConfig);

 

Siul2_Port_Ip_Init(NUM_OF_CONFIGURED_PINS_PortContainer_0_BOARD_InitPeripherals,

       g_pin_mux_InitConfigArr_PortContainer_0_BOARD_InitPeripherals);

 

   IntCtrl_Ip_Init(&IntCtrlConfig_0);

 

Lpuart_Uart_Ip_Init(uart1,&Lpuart_Uart_Ip_xHwConfigPB_1);

 

   Dma_Ip_Init(&Dma_Ip_xDmaInitPB);

 

 

   IP_DMAMUX_0->CHCFG[3]=0x80;

   IP_DMAMUX_0->CHCFG[3]=0xA7;

   IP_TCD->CH0_CSR=1;//寫 0x40280000 寄存器使能 DMA 通道 0 並選擇源

 

   IP_DMAMUX_0->CHCFG[2]=0x80;

   IP_DMAMUX_0->CHCFG[2]=0xA8;

   IP_TCD->CH1_CSR=1;//寫 0x40280000 寄存器使能 DMA 通道 1 並選擇源

 

 

   length=strlen(message);

 

status=Lpuart_Uart_Ip_AsyncSend(uart1,(uint8 *)message,length);

   do

   {

   status=Lpuart_Uart_Ip_GetTransmitStatus(uart1,&remainingbytes);

   }

while(LPUART_UART_IP_STATUS_SUCCESS!=status);

 

    for(;;)

    {

       for(i=0;i<rxsize;i++)

       {

           rxbuffer[i]='\0';

           txbuffer[i]='\0';

       }

 

       n=0;

 

    status=Lpuart_Uart_Ip_AsyncReceive(uart1,rxbuffer,rxsize);

       do

       {

       status=Lpuart_Uart_Ip_GetReceiveStatus(uart1,&remainingbytes);

       }

    while(LPUART_UART_IP_STATUS_BUSY==status);

 

 

       while(rxbuffer[n]!='\0')

       {

           txbuffer[n]=rxbuffer[n];

           n++;

       }

 

    status=Lpuart_Uart_Ip_SyncSend(uart1,txbuffer,n,timeout);

       return 0;

}

 

4. 調試測試

       將上文主函數添加到 S32DS 內編譯工程生成 .elf 文件通過 Jlink 調試器下載進入 Knight S32K312 開發板連接 PTD13、PTD14 到串口調試助手到上位機進行調試,MCU 初始化後會發送字符串“this is uart1_dma example!”到上位機串口調試軟體,隨後會發送從上位機串口調試軟體接收到的字符串回上位機調試軟體。

圖 4-1 Knight 硬體連接

圖 4-1 Knight 硬體連接


圖 4-2 UART 與 DMA 結合調試

圖 4-2 UART 與 DMA 結合調試


由於篇幅所限本文僅介紹 S32K312 RTD UART 與 DMA 模塊結合應用講解,如想了解更多資料與設計,請聯繫我們 atu.sh@wpi-group.com

5. 參考文獻

[1] S32K3XX Reference Manual.pdf,NXP

[2] S32K3XX Data Sheet.pdf,NXP

[3] S32K3xx_DMAMUX_map.xlsx,NXP

 

歡迎在博文下方留言評論,我們會及時回復您的問題。

如有更多需求,歡迎聯繫大聯大世平集團 ATU 部門:atu.sh@wpi-group.com   
作者:Hobo

更多資訊,請掃碼關注我們!
 

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論