Gamming Controller GPIO 與 ADC 軟體設定介紹

一、概述

上篇文章介紹了透過  Game Controller Tester 測試軟體實測方案 Gamming Controller 的方法,本文章針對該方案的輸入介面 Sample Code 相關 GPIO、ADC 的 initialization、Function 判斷方式做介紹。

二、 模組板輸入介面:

        2.1 基本輸入單元 ( 如圖 2 ),GPIO 與 ADC Pin Define ( 如圖 1 )


圖 1

圖 2

2.2 Connector 單元 ( 如圖 3 )

Vibration Motor Power Select ( CON1、CON2 ):Pin 1、2 配置短路 Pin 使 Vibration Motor 為 1.8 V

Vibration Motor Output ( J9、J10 ):Vibration Motor 配置端口


圖 3

三、 Debug 方式:

3.1 本文章使用 LPC Link 2 作為 debug tool,LPC Link 2 透過 SWD Port 對 Gamming Controller 做 debug,線路配置方式如圖 4

圖 4

3.2  將 USB Cable 與模組板 USB Connector 連結,如圖 5

圖 5

3.3  將 USB Cable 與 LPC Link2 USB Connector 連結,如圖 6

圖 6

3.4 本文章使用 MCUXPRESSO 作為 IDE,執行 MCUXPRESSO 並將 WPI 提供的 Sample Code 導入到 IDE 中,點擊圖示即可進行 debug,如圖 7

圖 7

四、GPIO、ADC initialization

        4.1 在 main > XBOX_Init > XBOX_DigitalChannelInit 中執行項目 ( 如圖 8  )

4.1.1 宣告一變數 key_config 將對 GPIO input 的相關參數儲存其中,參數如下:

        a ) kGPIO_DigitalInput > 宣告為 DigitalInput mode

        b ) 1 > GPIO_PinInit function 中在 Input 模式中不做判斷

 

4.1.2 宣告一變數 motor_config 將對 GPIO input 的相關參數儲存其中,參數如下:

       a ) kGPIO_DigitalOutput > 宣告為 DigitalOutput mode

        b ) 0 > GPIO_PinInit function 中為 Output 輸出為 Low

 

4.1.3 宣告一變數 port_pin_config 將對 GPIO input 的相關參數儲存其中,參數如下:

a ) IOCON_PIO_FUNC0 : 選擇 IOCON function 為 0 ( GPIO 功能 )

b ) IOCON_PIO_MODE_PULLUP : 宣告使用 MCU 內部 pull up

c ) IOCON_PIO_SLEW_STANDARD : 選擇 Driver slew rate 為 Standard-mode

d ) IOCON_PIO_INV_DI : 當 GPIO 為 input時輸入功能不反轉

e ) IOCON_PIO_DIGITAL_EN : 設定為 digital input

f ) IOCON_PIO_OPENDRAIN_DI : 宣告為 Normal push-pull output mode

 

4.1.4 GPIO_PinInit function 中有 4 個參數需填入如下:

a ) GPIO : 對應到 LPC5528 的 GPIO register address ( 0x4008C000 )

b ) JOYSTICK_KEY_X_PORT : 對應到硬體規劃的 GPIO Port 上 ( 這邊宣告為 Port 1 )

c ) JOYSTICK_KEY_X_PIN : 對應到硬體規劃的 GPIO Port Pin 上 ( 這邊宣告為 Port 1 Pin 25 )

d ) key_config : 該參數用來定義 GPIO register 的 In/Out put 與 Output 時的輸出邏輯為 high 或 low,詳細參數說明如 4.1.1 所示

 

4.1.5 IOCON_PinMuxSet function 中有 4 個參數需填入如下:

a ) IOCON : 對應到 LPC5528 的 IOCON register address ( 0x40001000 )

b ) JOYSTICK_KEY_X_PORT : 對應到硬體規劃的 GPIO Port 上 ( 這邊宣告為 Port 1 )

c ) JOYSTICK_KEY_X_PIN : 對應到硬體規劃的 GPIO Port Pin 上 ( 這邊宣告為 Port 1 Pin 25 )

d ) port_pin_config : 該參數用來定義 IOCON register 的參數,詳細參數說明如 4.1.3 所示

 

4.1.6 GPIO_PinInit function 中有 4 個參數需填入如下:

a ) GPIO : 對應到 LPC5528 的 GPIO register address ( 0x4008C000 )

b ) JOYSTICK_Motor_Left : 對應到硬體規劃的 GPIO Port 上 ( 這邊宣告為 Port 0 )

c ) JOYSTICK_Motor_Left : 對應到硬體規劃的 GPIO Port Pin 上 ( 這邊宣告為 Port 0 Pin 8 )

d ) motor_config : 該參數用來定義 GPIO register 的 In/Out put 與 Output 時的輸出邏輯為 high 或 low,詳細參數說明如 4.1.2 所示

 

* 其餘 GPIO Port Pin 設定相同因此後續說明省略

圖 8

4.2 在 main > BOARD_InitBootPins 中執行項目如下 ( 如圖 9 )

4.2.1 CLOCK_EnableClock(kCLOCK_Iocon) : 使 MCU 內 Iocon CLOCK 起震

4.2.2 CLOCK_EnableClock(kCLOCK_Gpio0) : 使 MCU 內 Gpio0 CLOCK 起震

4.2.3 CLOCK_EnableClock(kCLOCK_Gpio1) : 使 MCU 內 Gpio1 CLOCK 起震

4.2.4 宣告一變數 port0_pin23_config 將對 P0_23 ( ADC_CH0 ) 的相關參數儲存其中,參數如下:

a ) IOCON_PIO_FUNC0 : 選擇 IOCON function 為 0 ( GPIO 功能 )

b ) IOCON_PIO_MODE_INACT : 針對該 Port Pin 不做內部上、下拉電阻功能

c ) IOCON_PIO_SLEW_STANDARD : 選擇 Driver slew rate 為 Standard-mode

d ) IOCON_PIO_INV_DI : 當 GPIO 為 input時輸入功能不反轉

e ) IOCON_PIO_ANALOG_EN : 啟用類比通道

f ) IOCON_PIO_OPENDRAIN_DI : 設定為 digital input

g ) IOCON_PIO_ASW_EN : 方案 MCU 為 1B 版 ( CPU 150 MHz ) 因此此處設定為開啟

 

4.2.5 IOCON_PinMuxSet function 中有 4 個參數需填入如下

a ) IOCON : 對應到 LPC5528 的 IOCON register address ( 0x40001000 )

b ) 0U : 對應到硬體規劃的 GPIO Port 上 ( 這邊宣告為 Port 0 )

c ) 23U : 對應到硬體規劃的 GPIO Port Pin 上 ( 這邊宣告為 Port 0 Pin 23 )

d ) port_pin_config : 該參數用來定義 IOCON register 的參數,詳細參數說明如 4.2.4 所示

 

* 其餘 ADC Port Pin 設定相同因此後續說明省略



圖 9

4.3 在 main > ADC_Init > 中執行項目如下 ( 如圖 10 )

4.3.1 CLOCK_SetClkDiv(kCLOCK_DivAdcAsyncClk, 2U, true) : ADC Clock 除頻設定為倍率 2,並且帶入參數 3 的 true 執行 divider counter reset

4.3.2 CLOCK_AttachClk(kFRO_HF_to_ADC_CLK) : ADC Clock 來源參考 FRO_HF

4.3.3 POWER_DisablePD(kPDRUNCFG_PD_LDOGPADC) : 關閉 LDOGPADC power down

4.3.4 LPADC_GetDefaultConfig(&mLpadcConfigStruct) : 獲取 ADC defaultconfig 的參數值,後續將針對除了 default 以外 ADC config 所需變更的參數進行設定

a ) mLpadcConfigStruct.enableAnalogPreliminary : 開啟 ADC 以高直流電流消耗為代價,降低 ADC 啟動延遲的現象

b ) mLpadcConfigStruct.referenceVoltageSource = DEMO_LPADC_VREF_SOURCE : 將參考電壓設定為 VREF Pin 輸入的電壓值

c ) mLpadcConfigStruct.conversionAverageMode = kLPADC_ConversionAverage128 : 啟用自動校準平均值功能,並設定為 128 筆平均值

4.3.5 LPADC_Init(DEMO_LPADC_BASE, &mLpadcConfigStruct) : 將 mLpadcConfigStruct 的相關參數設定到對應的 ADC 參數中

4.3.6 LPADC_DoOffsetCalibration(DEMO_LPADC_BASE) : 啟動 ADC 偏移校準功能

4.3.7 LPADC_DoAutoCalibration(DEMO_LPADC_BASE) : 啟動 ADC 自動校準功能

圖 10

* 以下為 ADC0_0 ~ ADC0_12 的相關設定,因設定方式皆相同,因此僅說明 ADC0_0 的部分 ( 如圖 11 )

 

4.3.8 LPADC_GetDefaultConvCommandConfig(&ADC0_0_Command) : 獲取 ADC defaultConvCommandConfig 的參數值,後續將針對除了 default 以外 ADC ConvCommandConfig 所需變更的參數進行設定

a ) ADC0_0_Command.channelNumber = ADC0_0 : 將 ADC0_0 Channel 參數設定到 ADC0_0_Command 中

b ) ADC0_0_Command.conversionResolutionMode = kLPADC_ConversionResolutionHigh : 選擇 ADC 解析度為 16 bit

 

4.3.9 LPADC_SetConvCommandConfig function 中有 3 個參數需填入如下,並將參數設定到 ADC register 中 :

a ) DEMO_LPADC_BASE : 對應到 LPC5528 的 ADC register address 0x400A0000

b ) DEMO_LPADC_USER_CMDID : 對應 LPC5528 的 ADC command low buffer register 為第幾組,DEMO_LPADC_USER_CMDID 參數為 1

c ) ADC0_0_Command : 該參數用來定義 ADC register 中的 CMDL 與 CMDH 參數,詳細參數說明如 4.3.6 所示

4.3.10 LPADC_GetDefaultConvTriggerConfig(&ADC0_0_Tigger) : 獲取 ADC defaultConvTriggerConfig 的參數值,後續將針對除了 default 以外 ADC ConvTriggerConfig 所需變更的參數進行設定

a ) ADC0_0_Tigger.targetCommandId       = DEMO_LPADC_USER_CMDID : 將對應的 ADC0_0 Tigger 參數設定到 targetCommandId 中,後續當 對應的 ADC0_0 Tigger 被出發時,ADC0_0 則會開始執行 Sampling

b ) ADC0_0_Tigger.enableHardwareTrigger = false : 將 Hardware Trigger 關

4.3.11 LPADC_SetConvTriggerConfig function 中有 3 個參數需填入如下,並將參數設定到 ADC register 中 :

a ) DEMO_LPADC_BASE : 對應到 LPC5528 的 ADC register address 0x400A0000

b ) 0U : 對應 LPC5528 的 ADC Trigger control register 為第幾組,0U 參數為 0

c ) ADC0_0_Tigger : 該參數用來定義 ADC register 中的 TCTRL 參數,詳細參數說明如 4.3.8 所示

圖 11

4.4 在 main > while  中執行項目如下 ( 如圖 12、13 )

4.4.1 ADC_VALUE_print0 = ((ADC_Value(ADC0_0_READ)) >> g_LpadcResultShift) > 設定 ADC0_0 software trigger 並將結果放置於 ADC_VALUE_print0 變數中

 

* 其餘 ADC Sampling 與取得結果的方式相同,因此後續說明省略

圖 12

4.4.1.1 ADC_Value(ADC0_0_READ) > LPADC_DoOffsetCalibration(DEMO_LPADC_BASE) > 啟動 ADC 偏移校準功能

4.4.1.2 ADC_Value(ADC0_0_READ) > LPADC_DoSoftwareTrigger(DEMO_LPADC_BASE, 1<<ADC_num) > 將軟件觸發轉換指令設定到 ADC SWTRIG register

4.4.1.3 while (!LPADC_GetConvResult(DEMO_LPADC_BASE, &ADC0_0_Result, 0U)){} > 等待 ADC0_0 轉換完成,並將轉換結果放到 ADC0_0_Result.convValue 中,
而後即可將 ADC 轉換完畢的資訊透過 USB 傳輸到 PC 達成功能。

圖 13

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

★博文作者未開放評論功能