実は、最新のFSL USBスタックがKSDKの一部になっているので、KSDKをベースにしたUSBアプリケーションをお客様が設計することをお勧めしますが、K70、K60F、KL25などの古い部分はまだKSDKでサポートされていない部分もありますので、USBスタックver 4.1.1は、まだそれらの部分をベースにしたアプリケーションを開発している人にとっては多少の助けになります。
USBスタック ver 4.1.1はK60Fの代わりにK70をサポートしますが、どちらもKinetisの120MHzパーツであるため、移植は非常に簡単です。ここでは、このパーツの移植ガイドを提供します。
ポーティングは、ホストまたはデバイスのK70 USBの例に基づいています。
1. デバイスのヘッダー ファイルを置き換えます。
MK60F12.h を使用します。代わりに、KINETIS_120MHz_SC (Kinetis 120MHz ベア メタル サンプル コード) から抽出し、このヘッダ ファイルを "C:\Freescale\Freescale USB Stack v4.1.1\Source\Host\source\bsp\P3" のフォルダに格納します。ホスト用または "C:\Freescale\Freescale USB Stack v4.1.1\Source\Device\app\common\kinetis"デバイスの場合、derivative.h を変更します。以下のように:
2. マクロ定義の変更
MK60F12.hでは、MCU_MK60F12 は MCU_MK70F12 ではなく定義されているため、このステップでは、MCU_MK70F12に関連するコード スニペットを変更する必要があります。
まず、プロジェクト内のMCU_MK70F12、たとえば、IARに基づくホストデモUSB_MSDプロジェクトで、次のように検索できます。
また、「#ifdef MCU_MK70F12」や「#ifndef MCU_MK70F12」などのマクロを見つけて、次のように変更する場合があります。
#ifdef MCU_MK70F12 ----> #if (定義MCU_MK60F12) ||(定義MCU_MK70F12)
#ifndef MCU_MK70F12 ----> #if (!defined MCU_MK60F12) && (!defined MCU_MK70F12)
3. IO ドライバーの変更。
TWR-K70F120はTWR-K60F120とほぼ同じハードウェアを備えているため、ヘッダーファイルを置き換えた後にドライバーコードを変更する必要はありませんが、シリアルポートドライバーを除いて、USB_MSDデモを参照して、シリアルドライバーはsci_kinetis.cにあります。TWR-K70F120M は PTE16 と PTE17(UART2) をコンソールとして使用し、TWR-K60F120M は PTE8 と PTE9(UART5) を代わりに使用しますので、printf を正常に動作させるには、以下のようにドライバを変更する必要があります。
void sci2_init(){
#if (定義MCU_MK60F12) ||(定義MCU_MK70F12)
register uint_16 sbr, brfa;
uint_8 temp;
#ifdef MCU_MK70F12
/* PTD3でUART2_TXD機能を有効にする */
PORTE_PCR16 = PORT_PCR_MUX(0x3);UARTは、このピンのalt3機能です
/* PTD2のUART2_RXD機能を有効にする */
PORTE_PCR17 = PORT_PCR_MUX(0x3);UARTは、このピンのalt3機能です
/* クロックを有効にする */
SIM_SCGC4 |= SIM_SCGC4_UART2_MASK;
/ *送信機と受信機が無効になっていることを確認してください
*設定を変更します。
*/
UART_C2_REG(UART2_BASE_PTR) &= ~(UART_C2_TE_MASK | UART_C2_RE_MASK);
/* UART を 8 ビット モード、パリティなしに設定します */
UART_C1_REG(UART2_BASE_PTR) = 0; /* すべてのデフォルト設定が必要なので、レジスタ全体がクリアされます */
/* ボー設定の計算 */
sbr = (uint_16)((SYSCLK*1000)/(UART_BAUDRATE * 16));
/* SBR フィールドを除く UARTx_BDH の現在の値を保存します */
temp = UART_BDH_REG(UART2_BASE_PTR) & ~(UART_BDH_SBR(0x1F));
UART_BDH_REG(UART2_BASE_PTR) = 温度 | UART_BDH_SBR(((SBR & 0x1F00) >> 8));
UART_BDL_REG(UART2_BASE_PTR) = (uint_8)(sbr & UART_BDL_SBR_MASK);
/* ボーレートに近づくために分数除算が必要かどうかを判断します */
brfa = (((SYSCLK*32000)/(UART_BAUDRATE * 16)) - (SBR * 32));
/* BRFA フィールドを除く UARTx_C4 レジスタの現在値を保存 */
temp = UART_C4_REG(UART2_BASE_PTR) & ~(UART_C4_BRFA(0x1F));
UART_C4_REG(UART2_BASE_PTR) = temp | UART_C4_BRFA(brfa);
/* 受信機と送信機を有効にする */
UART_C2_REG(UART2_BASE_PTR) |= (UART_C2_TE_MASK | UART_C2_RE_MASK);
#else //MCU_MK60F12
/* PTE8でUART2_TXD機能を有効にする */
PORTE_PCR8 = PORT_PCR_MUX(0x3);UARTは、このピンのalt3機能です
/* PTE9でUART2_RXD機能を有効にします */
PORTE_PCR9 = PORT_PCR_MUX(0x3);UARTは、このピンのalt3機能です
/* クロックを有効にする */
SIM_SCGC1 |= SIM_SCGC1_UART5_MASK;
/ *送信機と受信機が無効になっていることを確認してください
*設定を変更します。
*/
UART_C2_REG(UART5_BASE_PTR) &= ~(UART_C2_TE_MASK | UART_C2_RE_MASK);
/* UART を 8 ビット モード、パリティなしに設定します */
UART_C1_REG(UART5_BASE_PTR) = 0; /* すべてのデフォルト設定が必要なので、レジスタ全体がクリアされます */
/* ボー設定の計算 */
sbr = (uint_16)((SYSCLK*1000)/(UART_BAUDRATE * 16));
/* SBR フィールドを除く UARTx_BDH の現在の値を保存します */
temp = UART_BDH_REG(UART5_BASE_PTR) & ~(UART_BDH_SBR(0x1F));
UART_BDH_REG(UART5_BASE_PTR) = 温度 | UART_BDH_SBR(((SBR & 0x1F00) >> 8));
UART_BDL_REG(UART5_BASE_PTR) = (uint_8)(sbr & UART_BDL_SBR_MASK);
/* ボーレートに近づくために分数除算が必要かどうかを判断します */
brfa = (((SYSCLK*32000)/(UART_BAUDRATE * 16)) - (SBR * 32));
/* BRFA フィールドを除く UARTx_C4 レジスタの現在値を保存 */
temp = UART_C4_REG(UART5_BASE_PTR) & ~(UART_C4_BRFA(0x1F));
UART_C4_REG(UART5_BASE_PTR) = temp | UART_C4_BRFA(brfa);
/* 受信機と送信機を有効にする */
UART_C2_REG(UART5_BASE_PTR) |= (UART_C2_TE_MASK | UART_C2_RE_MASK);
#endif
#endif
}
#ifdef __CC_ARM
int sendchar (int ch)
#else
ボイドTERMIO_PutChar (char ch)
#endif
{
#if (!defined MCU_MK60F12) && (!defined MCU_MK70F12)
#if (定義MCU_MK20D5) ||(定義MCU_MK20D7) ||(定義MCU_MK40D7)
/* FIFOでスペースが空くまで待つ */
while(!(UART1_S1 & UART_S1_TDRE_MASK){};
/* キャラクターを送る */
UART1_D = (uint_8)ch;
#elif(定義MCU_MK21D5)
while(!(UART2_S1 & UART_S1_TDRE_MASK){};
/* キャラクターを送る */
UART2_D = (uint_8)ch;
#elif(定義MCU_MKL25Z4) ||(定義MCU_MKL46Z4)
/* FIFOでスペースが空くまで待つ */
while(!(UART0_S1 & UART_S1_TDRE_MASK){};
/* キャラクターを送る */
UART0_D = (uint_8)ch;
#else
/* FIFOでスペースが空くまで待つ */
while(!(UART3_S1 & UART_S1_TDRE_MASK){};
/* キャラクターを送る */
UART3_D = (uint_8)ch;
#endif
#else
#ifdef MCU_MK70F12
/* FIFOでスペースが空くまで待つ */
while(!(UART2_S1 & UART_S1_TDRE_MASK){};
/* キャラクターを送る */
UART2_D = (uint_8)ch;
#else
/* FIFOでスペースが空くまで待つ */
while(!(UART5_S1 & UART_S1_TDRE_MASK){};
/* キャラクターを送る */
UART5_D = (uint_8)ch;
#endif
#endif
}
4. IDE設定で正しいデバイスタイプを設定します。
IARの場合は、プロジェクトオプションの観点からデバイスファミリを変更します。
これで、TWR-K60F120MでUSBデモの実行を開始できますが、上記の手順はUSBデバイススタックでは問題ありませんが、[ USBスタックバージョン4.1.1] で述べたように、USBホストスタックにはコードの問題があります。msd_mfs_genericホストデモのコードの問題がありますので、先に進む前に問題を修正してください。
お役に立てれば幸いです。
よろしくお願いいたします。
Kan
Hi,
私はこれらの変更を行いましたが、コンパイル時にこの関数が定義されていないため、エラーが発生しました: void USB_ISR(void);
usb_dci_kinetis.hでは、この関数は、#if に対してのみ定義されています。HIGH_SPEED_DEVICE
コードのこの部分はHIGH_SPEED_DEVICEによって異なりますか?私は自分のアプリケーションにHSを使用しようとしています。どんな洞察もありがとう!!