STM32点滅++またはインクリメンタルエンコーダデータの読み取り

やる気



数か月前、インクリメンタルエンコーダの仕組みと、最も単純なarduinoを使用して角度を読み取る方法について説明しました。 もちろん、私はすぐにこれらのコメントを受け取りました:







私は脳のアルドゥイノを持っています。 私は個人的にarduino環境を使用していませんが、それでも非常に便利なものだと考えています。 私はstm32で始める方法について多くの恐怖を聞いたが、それには入りたくなかった。 一方、最近では、ツールキットが完成し、一般的にすべてがチョコレートになっているというコメントが頻繁に聞かれています。 私は、LEDを点滅させるような単純なプロジェクトを行うのにどれくらい時間がかかるか試してみることにしました。 青い錠剤を購入し、st-link v2デバッガーの中国語版を購入し、それをすべて処理するために座った。



これから先、問題の鉄片は次のようになります。







始めましょう:プロジェクトのセットアップ



開発環境として、 STM32のSystem Workbenchを選択しました。これは、stm32を操作するためのプラグインがプリインストールされたEclipseです。 使用するのに非常に便利な2番目のソフトウェアはSTM32CubeMXです。 理想的には、他に何も必要ありません。 これら2つのサイトに登録し、ソフトウェアをダウンロードし、「OK」ボタンをクリックするだけで十分です。



そして、楽しみが始まります。 インターネットは働くチュートリアルに非常に貧弱です。 そのため、コードを実行できるようにするために、全体のクリコドロームを表示します。 私自身もこの投稿に戻ると思います。



STM32CubeMXを起動し、プロセッサでドライブし、プロジェクトの開始ボタンをクリックします。







STM32CubeMXは、プロセッサレッグを構成するソフトウェアです。その後、すべてが既に構成されている既製のコードテンプレートを取得します。使用するだけです。



ほとんどの青いタブレットにはPC13ピンにLEDがありますが、それを使わずにGPIO_OUTPUTで設定するにはどうすればよいですか:







デバッグプロセスが機能するように、SYSにシリアルワイヤを配置します。







エンコーダーをTIM4タイマーに掛けることにしたので、このモードにしました。 一部のプロセッサ入力は5ボルト(5ボルトトレラント、FT)に耐性があり、特にPB6 / PB7では5ボルトエンコーダーを接続できることに注意してください。







私は、arduinoと同じように、古き良き仮想シリアルポートにデータを出力するのが好きなので、さらに2、3回クリックします。







プロセッサは、外部共振器からシュレッドを受け取ります。







これで足の間隔が多少なりましたが、今度は細断します。 クロック設定タブに移動し、自動アシスタントを拒否します。







次に、次のようにあらゆる種類の除数を公開します。







さらに構成-> GPIOレッグGPIOを構成します。







構成-> TIM4では、4xモードで読み取るようにタイマーを構成します( 前の記事を参照して、それが何であるかを説明します)







次に、プロジェクト設定でディレクトリを設定し、STM32のSystem Workbenchでコードを生成するようにします。







次に、コードを生成し、Eclipseを開きます。 最初にここをクリックしてください:







そして、コードを書く準備ができました。



直接コードとデバッグ



これは私が自分の手で書いた唯一のコードであり、すべてがかなり透明です:



int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM4_Init(); MX_USB_DEVICE_Init(); HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_ALL); char buf[25]; int32_t capture=0, capture_prev=0, encoder=0; while (1) { capture = TIM4->CNT; encoder += capture - capture_prev; if (abs(capture-capture_prev)>32767) { encoder += (capture<capture_prev ? 65535 : -65535); HAL_GPIO_TogglePin(MY_PIN_13_GPIO_Port, MY_PIN_13_Pin); } capture_prev = capture; sprintf(buf,"count: [%ld]\n", encoder); CDC_Transmit_FS((uint8_t *)buf, strlen(buf)); HAL_Delay(100); } }
      
      





唯一の微妙な点は、青いタブレットには16ビットのカウンターがあり、エンコーダーは1回転あたり10,000イベントを生成することです。 したがって、私の手では、カウンター値のオーバーフローを監視します。私のコードでは、2つのカウンター読み取りの間、エンコーダーが32kパルスを生成しないと想定しています。オーバーフロー/アンダーフローイベントの割り込みハンドラーを書くのは率直に怠wasでした。 LEDがオーバーフローするたびにLEDの状態が変わりますが、点滅するかどうかはわかりませんか?



すべて準備ができているようですので、プロジェクトをコンパイルしてデバッガーを実行します。







青いタブレット自体がUSBに引っかかっており、3本のワイヤがそこから中国のstlinkに行き、これも順番にUSBに引っかかっています。 エンコーダはUSBから5Vの電力を受け取ります。 すべてがうまくいけば、デバッガーが起動し、仮想ポート/ dev / ttyACM0がシステムに表示されます。



エンコーダーシャフトを指で回転させ、cat / dev / ttyACM0を作成し、エンコーダーを正しく読みます。







ちょうど点滅/のようにしたい場合、青いタブレットの最小接続は次のようになります。







そして、すべてがうまくいっていなければ?



USB



この点に到達するのに3日かかりました。 何がそんなに時間がかかりましたか? たとえば、青いタブレットにコードを再入力すると、デバッグもうまく機能し、システムにシリアルポートが存在しますが、そこからは何も得られません。 USBレースを貼れば、すべてがうまくいきます。



googleが長くなると、ボードの配線に問題があり、さらに、ほとんどの場合、 間違った抵抗が含まれてます。







この抵抗器を交換すると、半分のコンピューターで助けになりました。 より丁寧なグーグルはこれを示しています。 修正案は次のようになります。









デバイスのソフトウェアカットに満足しました。 コードは次のとおりです。ccusbreset.cを作成するだけで十分です。



非表示のテキスト
 /* usbreset -- send a USB port reset to a USB device */ #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <sys/ioctl.h> #include <linux/usbdevice_fs.h> int main(int argc, char **argv) { const char *filename; int fd; int rc; if (argc != 2) { fprintf(stderr, "Usage: usbreset device-filename\n"); return 1; } filename = argv[1]; fd = open(filename, O_WRONLY); if (fd < 0) { perror("Error opening output file"); return 1; } printf("Resetting USB device %s\n", filename); rc = ioctl(fd, USBDEVFS_RESET, 0); if (rc < 0) { perror("Error in ioctl"); return 1; } printf("Reset successful\n"); close(fd); return 0; }
      
      







そして、彼の作品は次のとおりです。







ソフトリセット後にすべてが修正された後、最初はポートから何も送信されなかったことに注意してください。



Swd



他にどんな問題があるのでしょうか? たとえば、壊れたデバッガー:





長い間コードを埋めることができませんでした。できる場合、最初にboot0 = 1、boot1 = 0にジャンパーを入れ、コードを埋めてから、ジャンパーを再配置する必要がありました。 ジャンパーの通常の位置はboot0 = boot1 = 0です。 これは、プロセッサでSWDが無効にされたという事実によるもので、STM32CubeMXに具体的に含まれていることに注意してください。 しかし、私たちはそれをオンにしたので、ボードはSWDをオフにして来ることができました。



ブートローダー



誰かが突然arduino環境がSTMの下で既に終了していると判断した場合、 ブートローダーはおそらく問い合わせをしないことに留意してください。



書き込み保護



私が購入したボードの1つでは、フラッシュの書き込みから保護されていました。 これを修正できる唯一の方法は、STM32 ST-LINKユーティリティをWindowsにインストールし、メモリを完全に消去することです。 Linuxの迷走は助けにはなりません。



ちょうど死んだボード



そして、それは起こります。 さらに、それはどういうわけか動きますが、部分的に死んでいます。 曲がった手とこれを区別する方法はあまり明確ではありません。



SWO:シリアルワイヤ出力



公式のデモボードはありますか?また、SWOを介して情報を出力することに慣れていますか? このようなイチジクは、中国のクローンでは直接動作しません、時間を無駄にしないでください、ここに修正があります:





おわりに



そして、他にも多くの問題があり、それぞれが原則として解決できます。 たとえば、stm32 errata(存在する場合)は、多くの場合、データシート自体よりも長いという事実...



初心者向けの体系的な情報はどこにもありません。最も単純なLEDフラッシャーはすぐに頭痛になります。 はい、今では少し理解しましたが、少なくともデバッガーが確実に機能するように、より少ない問題で開発を継続できることを本当に願っています。



一般的に、私は費やした時間を後悔しておらず、次のプロジェクトはstm32で見られます。 しかし、今では、このような青い錠剤のコミュニティがかなり少ないのは完全に明らかです。 あなたが頭痛を必要としないが、あなたが鉄を働かせることだけを必要とするなら、広告にだまされないでください、彼らはそれがすべてかなりのお金だと言います。 本物のプログラマーと本物の開発ボードを購入してください。 それ以外の場合は、arduino環境にとどまり、その中においしいものがたくさんあります。



All Articles