NXP S32K312 開發板試用體驗第一篇
拿到開發板已經快一個月了,按理說早就應該發出第一篇帖子。不過這段時間適逢過年,加上在摸索開發板代碼時遇到了一些問題,直到將問題解決後才發出第一篇帖子。我這篇帖子是以有一定ARM開發經驗,但對S32K3系列以及Eclipse開發環境完全不熟悉的角度進行編寫的。總的來說,開發S32K312開發板需要三個軟體:S32DS開發環境(基於Eclipse開發環境,由NXP公司自行搭建的GCC編譯鏈)、RTD驅動代碼庫,以及Segger JLINK燒錄工具(因為S32K312晶片內核是ARM Cortex-M7,只要是ARM內核,都可以使用Segger JLINK燒錄工具進行燒錄)。
1. 下載S32DS&RTD驅動程式代碼庫
S32DS 開發環境下載地址:
https://nxp.flexnetoperations.com/control/frse/download?agree=Accept&element=6497301

RTD5.0 驅動程式代碼庫下載地址:
https://nxp.flexnetoperations.com/control/frse/download?agree=Accept&element=6441901


安裝RTD5.0庫需要透過Help選單中的Install New Software頁面進行:
RTD5.0庫安裝完成後,可以透過新建專案的方式找到NXP原廠為S32K312開發板提供的範例程式:
但實際上這些範例程式在編譯時會找不到源文件和標頭文件,我自己不熟悉 Eclipse 開發環境,所以僅作為參考,不會將範例程式燒錄到開發板中。
2. 新建S32K312工程並燒錄

新建專案時選對MCU型號,是S32K312,RTD庫選擇最新的5.0,I/O支援選擇不支援,GDB選項隨意,反正我不使用Eclipse內部的燒錄工具進行燒錄。
初始化 DIO 和 LPUART 所使用的引腳(PTB10 為 RGBLED 的紅色 LED,PTC2 和 PTC3 為 LPUART0 的收發引腳):

初始化DIO和LPUART模組:

LPUART 模組需要設定波特率,我這邊設定的波特率為 115200,資料位 8,停止位 1,無奇偶校驗位。
設定完成後更新原始碼,並在 main.c 檔案中新增程式碼:
#include <stdio.h>
#include "Mcal.h"
#include "Clock_Ip.h"
#include "Siul2_Port_Ip.h"
#include "Siul2_Dio_Ip.h"
#include "Lpuart_Uart_Ip.h"
void Delay(uint32_t n)
{
static volatile uint32 DelayTimer = 0;
while (DelayTimer < n)
{
DelayTimer++;
}
DelayTimer=0;
}
int __io_putchar(int ch)
{
Lpuart_Uart_Ip_SyncSend(0 , (uint8_t *)&ch , 1 , 0xffff);
return (ch);
}
__attribute__((weak)) int _write(int file, char *ptr, int len)
{
int DataIdx;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
__io_putchar(*ptr++);
}
return len;
}
int main(void)
{
Clock_Ip_Init(&Clock_Ip_aClockConfig[0]);
Siul2_Port_Ip_Init(NUM_OF_CONFIGURED_PINS_PortContainer_0_BOARD_InitPeripherals , g_pin_mux_InitConfigArr_PortContainer_0_BOARD_InitPeripherals);
Lpuart_Uart_Ip_Init(0 , &Lpuart_Uart_Ip_xHwConfigPB_0);
printf("LPUART0.\n");
在 Eclipse 環境中覆寫 fputc 標準輸出函數,重載為 LPUART0 串口輸出。
找到工程生成的ELF檔案:
使用Segger JLINK燒錄工具開啟:

將 JLINK V9 和電源接上開發板,micro USB 接口連接電腦,按下 F7 進行燒錄:
即可看到 RGB 燈的紅燈被成功初始化,串口打印 LPUART0:

3. ADC SAR模組
開發板上有一個藍色的電位器旋鈕R78,對應的引腳是PTD4:

從對應關係可得知PTD4為ADCSAR模組的第19路輸入,設定ADCSAR模組的第19路輸入(映射43),資料位右對齊,14位資料:

設定完成後更新原始碼,並在main.c檔案中新增程式碼:
#include "Adc_Sar_Ip.h"
int main(void)
{
。。。
status = (StatusType) Adc_Sar_Ip_Init(ADCHWUNIT_0_INSTANCE , &AdcHwUnit_0);
while (status != E_OK);
for(Index = 0; Index <= 5; Index++)
{
status = (StatusType) Adc_Sar_Ip_DoCalibration(ADCHWUNIT_0_INSTANCE);
if(status == E_OK)
{
break;
}
}
。。。
while(1)
{
Adc_Sar_Ip_StartConversion(ADCHWUNIT_0_INSTANCE , ADC_SAR_IP_CONV_CHAIN_NORMAL);
while(!(Adc_Sar_Ip_GetStatusFlags(ADCHWUNIT_0_INSTANCE) & ADC_SAR_IP_NOTIF_FLAG_NORMAL_ENDCHAIN))
{
}
data = Adc_Sar_Ip_GetConvData(ADCHWUNIT_0_INSTANCE , 43);
Adc_Sar_Ip_ClearStatusFlags(ADCHWUNIT_0_INSTANCE , ADC_SAR_IP_NOTIF_FLAG_NORMAL_ENDCHAIN);
printf("data = %d.\n", data);
Siul2_Dio_Ip_WritePin(RGBLED_RED_PORT , RGBLED_RED_PIN , 1);
Delay(1000000);
Siul2_Dio_Ip_WritePin(RGBLED_RED_PORT , RGBLED_RED_PIN , 0);
Delay(1000000);
}
。。。
}
可以在串口中看到對ADC引腳的讀取數據打印:
由於是14位資料,因此最大值為16383,旋轉旋鈕即可看到資料變化。
4. LPSPI模組

透過原理圖可知,LPSPI0 和 LPSPI1 這兩組 SPI 接口分別接到了開發板 J31 和 J26 的兩組母插孔上,並在引腳界面對這兩組 SPI 接口的 SCK、SIN、SOUT 共計六個引腳進行初始化:
在LPSPI模組中,初始化兩組SPIDriver和SPIGeneral,分別對應兩組不同的SPI介面,這兩個SPI介面使用獨立的設定,但資料位都是8位,且都是MSB。



並確保兩組AIPS時鐘都正常設定:
AIPS_PLAT時鐘是LPSPI0使用的,AIPS_SLOW時鐘是LPSPI1到LPSPI3使用的。
設定完成後更新原始碼,並在main.c檔案中新增程式碼:
#include "Lpspi_Ip.h"
#define LPSPI0_BUFFER_NUM 2
uint8_t lpspi0_tx_buffer[LPSPI0_BUFFER_NUM] = {0xaa , 0xab};
uint8_t lpspi0_rx_buffer[LPSPI0_BUFFER_NUM] = {0};
#define LPSPI1_BUFFER_NUM 2
uint8_t lpspi1_tx_buffer[LPSPI1_BUFFER_NUM] = {0xbb , 0xbc};
uint8_t lpspi1_rx_buffer[LPSPI1_BUFFER_NUM] = {0};
int main(void)
{
。。。
Lpspi_Ip_Init(&Lpspi_Ip_PhyUnitConfig_SpiPhyUnit_0_Instance_0);
printf("Lpspi_Ip_Init.\n");
Lpspi_Ip_SyncTransmit(
&Lpspi_Ip_PhyUnitConfig_SpiPhyUnit_0_Instance_0 ,
lpspi0_tx_buffer ,
lpspi0_rx_buffer ,
LPSPI0_BUFFER_NUM ,
0xffff
);
printf("lpspi0_rx_buffer = 0x%x 0x%x.\n" , lpspi0_rx_buffer[0] , lpspi0_rx_buffer[1]);
Lpspi_Ip_Init(&Lpspi_Ip_PhyUnitConfig_SpiPhyUnit_1_Instance_1);
printf("Lpspi_Ip_Init.\n");
Lpspi_Ip_SyncTransmit(
&Lpspi_Ip_PhyUnitConfig_SpiPhyUnit_1_Instance_1 ,
lpspi1_tx_buffer ,
lpspi1_rx_buffer ,
LPSPI1_BUFFER_NUM ,
0xffff
);
printf("lpspi1_rx_buffer = 0x%x 0x%x.\n" , lpspi1_rx_buffer[0] , lpspi1_rx_buffer[1]);
。。。
}
短接兩組SPI介面的SIN和SOUT介面:
可以在串口列印介面中看到SPI傳輸的數據:

文章來自「S32K312 開發板評測活動」測評者:李明
歡迎在文章下方留言評論,我們會及時回覆您的問題。
如有更多需求,歡迎聯繫大聯大世平集團 ATU 部門:atu.sh@wpi-group.com 作者:WPIg
更多資訊,請掃碼關注我們!
評論