記事のディレクトリ
1はじめに
STM32プラットフォームにLWIP1.4.1を移植してPing機能を実現するには、最初にいくつかの準備作業を行う必要があります。たとえば、次のようになります。
移植の対象となるプラットフォームはSTM32F429です。以前の情報準備では、STM32の公式ウェブサイトにSTM32F4x7マイクロコントローラーがあると述べました。LwIP TCP / IPプロトコルスタックデモコードについては、ターゲットプラットフォームを大部分参照できます。
以下に説明する移植プロセスは、ハードウェアプラットフォームSTM32F429に基づいており、STM32標準ライブラリの移植に基づいて実行されます。
2.主な機能
まず、プログラム全体の入り口であるメイン機能を移植しました。ダウンロードしたSTM32F4x7LwIP TCP / IPプロトコルスタックのデモコードを参照できます。
パス:STM32F4x7_ETH_LwIP_V1.1.1\Project\Standalone\tcp_echo_client\src\main.c
参照コードを使用して、次のタスクを実行する必要があります。
SysTick_Init
、STM32の作業システムクロックを初期化します。TIM3_Int_Init
、Timer3を初期化し、LwIPプロトコルスタックに必要な現地時間のハートビートとして機能します。ETH_BSP_Config
、イーサネットGPIOとDMAを構成し、SMIインターフェイスを介してPHYネットワークカード(LAN8742A)関連のレジスタを設定します。LwIP_Init
、LwIPプロトコルスタックを初期化します。ETH_CheckFrameReceived
ループを介して受信したデータパケットがあるかどうかを検出しLwIP_Pkt_Handle
、受信したネットワークデータパケットを処理します。LwIP_Periodic_Handle
、LwIPの定期的なタスクを処理します。
int main(void)
{
...
// init systick
SysTick_Init();
//init timer3 10ms
TIM3_Int_Init(100-1,8400-1);
/* Configure ethernet (GPIOs, clocks, MAC, DMA) */
ETH_BSP_Config();
/* Initilaize the LwIP stack */
LwIP_Init();
while(1){
/* check if any packet received */
if (ETH_CheckFrameReceived())
{
/* process received ethernet packet */
LwIP_Pkt_Handle();
}
/* handle periodic timers for LwIP */
LwIP_Periodic_Handle(os_get_tick_counter());
}
//return 0;
}
3.イーサネット(GPIO、MAC、DMA)を構成します
イーサネットを構成するには、ダウンロードしたSTM32F4x7 LwIP TCP / IPプロトコルスタックのデモコードを参照できます。
パス:STM32F4x7_ETH_LwIP_V1.1.1\Project\Standalone\tcp_echo_client\src\stm32f4x7_eth_bsp.c
GPIOをイーサネット機能として構成し、MACおよびDMA構成は参照コードに直接従います。
注:イーサネットを構成する場合、外部PYHアドレスが必要です。前のハードウェアの紹介で述べたように、に設定する必要があります
PHYAddress = 0
。
void ETH_BSP_Config(void)
{
/* Configure the GPIO ports for ethernet pins */
ETH_GPIO_Config();
/* Configure the Ethernet MAC/DMA */
ETH_MACDMA_Config();
/* Get Ethernet link status*/
if(GET_PHY_LINK_STATUS())
{
EthStatus |= ETH_LINK_FLAG;
}
}
4.プロジェクトにLwIPを追加します
lwIPをコピーSTM32F4x7 LWIP TCP / IPプロトコルスタック:現在のプロジェクトにデモコード
PATH: STM32F4x7_ETH_LwIP_V1.1.1\Utilities\Third_Party\lwip-1.4.1
。私はここに使う必要がIDEツールにコンパイルすることLWIPソースファイルを追加ザ・Keil社のツール。
-
LwIPソースが大きすぎて、それほど多くのものを必要としないので、フォルダー内
のsrc
ファイルのLwIPソースを追加するだけで済みます。 -
それぞれ
api
、core
、netif
Keil社のプロジェクトに追加 -
STM32F4x7プラットフォームのイーサネットドライバーを現在のプロジェクトにコピーし、名前をSTM32F429に変更します。
パス:STM32F4x7_ETH_LwIP_V1.1.1\Libraries\STM32F4x7_ETH_Driver
-
プロジェクトにLwIPヘッダーファイルのパスを追加し、C99モードを確認します。完成した回路図は次のとおりです。
5.コンパイルエラーの問題を解決します
- エラー1:
error: #5: cannot open source input file "lwip/opt.h": No such file or directory
解決策:
正しいヘッダーファイルパスを追加してくださいlwip-1.4.1\src\include
。 - エラー2:
..\lwip-1.4.1\src\include\lwip/opt.h(45): error: #5: cannot open source input file "lwipopts.h": No such file or directory
解決策:STM32F4x7 LwIP TCP / IPプロトコルスタックのデモコードを現在のプロジェクト、PATHに
コピーします。lwipopts.h
STM32F4x7_ETH_LwIP_V1.1.1\Project\Standalone\tcp_echo_client\inc\lwipopts.h
備考:lwipopts.hは、LwIPの関連パラメーターを構成するために使用されます。一般的に、LwIPにはデフォルトでパラメーター構成があり、opt.hファイルに保存されます。ユーザーがlwipopts.hファイルで構成しない場合は、 LwIPはそれを使用します。opt.hのデフォルトパラメータ。移植時に特定のパラメータを定義することが非常に重要であることに注意してください。これはLwIPのパフォーマンスにとって非常に重要であり、構成が間違っている場合でも、直接原因となる可能性があります。クラッシュするLwIPの操作。ここでは、単純なPing関数を実装しているだけなので、デフォルトの構成を直接使用します。
- エラー3:
..\lwip-1.4.1\src\include\lwip/arch.h(43): error: #5: cannot open source input file "arch/cc.h": No such file or directory
ソリューション:現在のプロジェクトのコピーとシステムヘッダファイルパスに追加。lwip-1.4.1\port\STM32F4x7\arch\cc.h
備考:cc.hファイルには、プロセッサ関連の変数タイプ、データ構造、およびバイトアラインメント関連のマクロが含まれています。
LwIPで使用される基本的な変数タイプは、抽象的な変数タイプの定義である桁数によって名前が付けられます。開発者は、使用するプロセッサとコンパイラの特性に従って定義する必要があります。通常、変数を基本タイプとして直接定義します。このように、Unsigned char、intなどのC言語は、LwIPプロトコルスタックがプラットフォームに依存しないことを保証できます。さらに、大小のエンディアンモード、出力デバッグマクロなどを定義することもできます。 - エラー4:
Error: L6218E: Undefined symbol LwIP_Init (referred from main.o).
Error: L6218E: Undefined symbol LwIP_Periodic_Handle (referred from main.o).
Error: L6218E: Undefined symbol LwIP_Pkt_Handle (referred from main.o).
解決策:
メイン関数を移植するときに、メイン関数が参照によって直接コピーされましたが、これらの関数は実際には実装されていませんでした。ダウンロードしたSTM32F4x7LwIP TCP / IPプロトコルスタックのデモコードを引き続き参照できます。
パス:STM32F4x7_ETH_LwIP_V1.1.1\Project\Standalone\tcp_echo_client\src\netconf.c
現在のプロジェクトにコピーしてから、再コンパイルします。 - エラー5:
netconf.c(36): error: #5: cannot open source input file "ethernetif.h": No such file or directory
解決策:現在のプロジェクトにコピー
できlwip-1.4.1\port\STM32F4x7\Standalone\ethernetif.h
ますが、実装されていない関数がまだたくさんあることがわかりました。lwip-1.4.1(lwip-1.4.1\src\netif\ethernetif.c
)のテンプレートを追加したため、このファイルはプラットフォームごとにカスタマイズする必要があります。これが参照コード(lwip-1.4.1\port\STM32F4x7\Standalone\ethernetif.c
)です。現在のプロジェクトに追加して再コンパイルしてください。注:ethernetif.cは、主にネットワークカードに関連する基盤となるドライバー機能です。
6.検証テスト
最後に、検証テストは次のように成功します。
7.データダウンロードアドレス
移植を成功させるための完全なコードダウンロードアドレスは次のとおりです:https:
//download.csdn.net/download/ZHONGCAI0901/12921796