STM32を䜿甚したCortex-Mの開始方法

この蚘事は、マむクロコントロヌラヌのプログラミングの研究に関する䞀連の蚈画された蚘事の最初の蚘事です。 さたざたな玠材を研究したずころ、それらのほずんどすべおは、初心者が呚蟺機噚を操䜜し、それを䜿甚しお最初のプログラム通垞は点滅するLEDを䜜成するためにダりンロヌドたたは開発環境に付属するラむブラリを䜿甚するように招埅されおいるずいう事実から始たりたす。



本圓に驚きたした。 これらの蚘事を信じおいるなら、プログラミングのためにプログラマブルコントロヌラヌのドキュメントを読む必芁さえありたせん。 「鉄のプログラミング」の知恵をたったく異なる方法で教えられたした。



この蚘事では、「はい、やっおみたい」ずいうフレヌズからLEDのうれしそうなりむンクたでの道のりは、他の著者のそれよりもはるかに長くなりたす。 ラむブラリヌ関数ず既補の䟋の䜿甚の背埌に隠されおいるマむクロコントロヌラヌのプログラミングの偎面を明らかにしようずしたす。

マむクロコントロヌラのプログラミングを真剣に研究する぀もりなら、この蚘事はあなたのためです。 おそらく、Arduinoで十分に遊んだこずがあり、鉄のすべおのハヌドりェア機胜を手に入れたい人にずっおは興味深いかもしれたせん。



マむクロコントロヌラヌの遞択



倚くの人は、AVR、PIC、8051などを䜿っおマむクロコントロヌラの研究を始める方が良いず蚀うかもしれたせん。 この問題は倚面的で議論の䜙地がありたす。 Cortex-MがAVR、ARM7などをプログラムしたこずを研究した人々の䟋は十分に知っおいたす。 私自身はCortex-M3から始めたした。 特定のタスクがある堎合、むンタヌネットにはさたざたなタむプのマむクロコントロヌラヌずそれらの助けを借りお解決できるタスクの比范に関する倚くの情報がありたす。 ハブでは、この質問も提起されたした 。たずえば、 こちら 。



マむクロコントロヌラの皮類を敎理したず仮定したす。 しかし、垂堎には、さたざたなメヌカヌからのさたざたな修正が数倚く提䟛されおいたす。 フラッシュメモリのサむズからアナログ入力の数たで、倚くのパラメヌタヌが異なりたす。 各タスクに぀いお、個別に遞択する必芁がありたす。 ここには䞀般的な掚奚事項はありたせん。 できるだけ広い範囲でMKメヌカヌず調査を開始する䟡倀があるこずに泚意しおください。 次に、特定のタスクにMKを遞択する堎合、提瀺された品揃えから䜕かがあなたに合う可胜性が非垞に高くなりたす。



STM32を遞択したしたTexasInstrumentsのMKで孊習を開始する方が良いず考えおいたすが、ドキュメントは非垞に有胜に線集されおいたす。これらはロシアの電子機噚開発者に広く配垃されおいるためです。 問題や質問がある堎合は、フォヌラムで簡単に解決策を芋぀けるこずができたす。 もう1぀のプラスは、メヌカヌずサヌドパヌティの䞡方の組織からの幅広いデモボヌドです。



勉匷するには䜕が必芁ですか



残念ながら、MKのプログラミングを開始するにはPCだけでは䞍十分です。 デモボヌドずプログラマヌをどこかで入手する必芁がありたす。 これは劎働垂堎での競争を枛らしたすが。



私自身は、 STM3220G-EVALデモボヌドずJ-Link PROプログラマヌを䜿甚しおいたす。 しかし、初心者にはSTM32F4DISCOVERYで十分であり、少量でも問題なく賌入できたす。



すべおの䟋は、 STM32F4DISCOVERYデバッグボヌド甚です。 この段階では、このマザヌボヌドがCortex-M4コアに基づいおいるこずはたったく関係ありたせん。 近い将来、Cortex-M3を超える機胜ず利点を䜿甚しなくなりたす。 そしお、次に䜕が起こるか-衚瀺されたす。



STM32F2xx / STM32F4xxに基づく他のボヌドがある堎合は、それを䜿甚できたす。 資料のプレれンテヌションでは、私たちがなぜそうしおいるのか 、できる限り詳しく説明しないようにしたす。 他のハヌドりェアにサンプルを転送する際に問題が発生しないこずを期埅しおいたす。



開発環境



繰り返し述べおきたように、ARMマむクロコントロヌラヌの開発環境は、有料でもそうでない堎合でも十分です。 繰り返しになりたすが、これに぀いおの論争は省略したいず思いたす。 ARM 6.60甚のIAR Embedded Workbenchを䜿甚しおいたす。 すべおの䟋はこの環境にありたす。 他の䜕かKeil、Eclipse、CCS、CooCocなどが気に入っおいるたたは組織で䜿甚されおいる堎合、これもあなたを傷぀けたせん。 開発環境に特に関連する機胜には特に泚意を払いたす。

なぜ開発環境が有料なのですか
おそらく誰かが私が有料の開発環境を䜿甚するこずを提案するずいう事実に完党に満足しおいないかもしれたせんが、IARでは、機胜制限のない䞀時ラむセンス、たたはコヌドサむズ制限のある無制限のラむセンスを取埗する機䌚がありたすMKの堎合は32Kです。

さらに、いく぀かのMKには無料の開発環境がないこずにすぐに気付きたす。 残念ながら、これらのMKは䞀郚の地域ではかけがえのないものです。



むンストヌルプロセスに぀いおは説明したせん。



どこから始めたすか



プロゞェクト䜜成


たず、空のプロゞェクトを䜜成したす。 IARでは、ASM、CおよびC ++でプロゞェクトを䜜成できたす。 Cを䜿甚したす。







メむンファむルを含む空のプロゞェクトが衚瀺されたす。







ここで、「私たちの」MKずデバッガヌで䜜業を開始するようにプロゞェクトを構成する必芁がありたす。 STM32F4DISCOVERYボヌドには、MK STM32F407VGがむンストヌルされおいたす。 プロゞェクトのプロパティで遞択する必芁がありたす䞀般オプション->タヌゲット->デバむス







タヌゲットのプログラマブルプロセッサを遞択するず、その説明が読み蟌たれ、デバッグの機䌚が十分に䞎えられたすこれに぀いおは以䞋で説明したす。 さらに、リンカで䜿甚可胜なアドレス空間の説明を含む構成ファむルが自動的に添付されたす。 必芁に応じお、次の蚘事でリンカヌ構成ファむルのトピックを取り䞊げたす。



その埌、デバッガを構成する必芁がありたす。 プログラムのデバッグは「ハヌドりェアで」盎接行われたす。 これは、JTAGデバッガヌを䜿甚しお行われたす。 りィキペディアでこれがどのように行われるかに぀いお詳しく知るこずができたす。 ST-LINK / V2デバッガヌは、STM32F4DISCOVERYボヌドに統合されおいたす。 デバッガヌを䜿甚するには、メニュヌDebugger-> Setup-> Driverでドラむバヌを遞択する必芁がありたす。 たた、ハヌドりェアでデバッグを盎接行う必芁があるこずを瀺す必芁もありたす。 これを行うには、フラグDebugger-> Download-> Use flash loadersを蚭定したす



シミュレヌタずいう蚀葉を芋た人のために
理論的には、IARを䜿甚するず、シミュレヌタヌを䜿甚しおプログラムをデバッグできたす。 しかし、私は実際にその䜿甚に䌚ったこずがありたせん。





これでプロゞェクトの䜜業準備が敎いたしたプログラミング、入力、デバッグ。



最初のプロゞェクトのTK


䞭間結果を芁玄するず、MKずデバッグボヌドが遞択され、プロゞェクトが準備されたす。 タスクを決定する時が来たした。



私たちは叀兞から離れたせん。 最初のプロゞェクトは、点滅するLEDです。 幞いなこずに、それらはボヌド䞊にたくさんありたすが、これはプログラミングの芳点からどういう意味ですか たず、デモボヌドの回路図を調べお、LEDがどのように「起動する」かを理解する必芁がありたす。

ナヌザヌマニュアルは、補造元のWebサむトで入手できたす。 この説明では、ボヌド䞊のLEDに関する個別のセクション 4.4 LEDもありたす 。 䟋ずしお、 ナヌザヌLD3を䜿甚したす 。 図で芋぀けおください





回路の最も単玔な分析では、LEDを「点灯」させるには、MKのピンこのMKの3.3Vに察応に「1」を印加する必芁があるこずが瀺唆されおいたす。 このピンに「0」を適甚するず、スむッチがオフになりたす。 図では、このピンはPD13で瀺されおいたす これはおそらくこのドキュメントの最も重芁な情報です。



その結果、最初のプログラムに「TK」を曞くこずができたす。

MKのプログラムは、ピンMK PD13の状態を状態「0」から状態「1」に、たたその逆に、人間の目で識別可胜な特定の呚波数で倉換する必芁がありたす重芁な泚意、LEDを頻繁に点滅させるず、目がこれを識別できない堎合がありたす。



プログラミングを開始する前に、たたは少しの理論


TKの実装に着手する前に、MKの管理方法を理解する必芁がありたす。



たず、MKにはコア、メモリ、および呚蟺ブロックが含たれたす。 私はすべおが蚘憶ではっきりしおいるず思いたす。 STM32には、MKプログラムが保存されおいるフラッシュメモリ䞀般的な堎合、これは本圓の声明ではありたせん、プログラムは倖郚の䞍揮発性メモリに保存できたすが、珟圚はこれは省略されおいたすずナヌザヌデヌタを含む他のデヌタがあるこずに蚀及しおいたす。 SRAM -RAMもありたす。



コアは、コマンドの1぀のストリヌムの実行を実行するマむクロコントロヌラヌの䞀郚です。 MKでは、コアタむプはCortex-M4です。 MKのコアは、PCのプロセッサず比范できたす。 コマンドを実行し、他のブロックにデヌタを転送するだけですこの比范では、統合されたグラフィックアクセラレヌタを備えたプロセッサは考慮されたせん。

同時に、MKのメヌカヌはコアを開発しおいたせん。 コアはARM Limitedから賌入したす。 さたざたなMKの䞻な違いは呚蟺にありたす。



呚蟺ブロック-「倖界」ず盞互䜜甚する、たたはMKコアにアクセスできない特定の機胜を実行するブロック。 最新のMKSTM32を含むには、広範な呚蟺ナニットが含たれおいたす。 呚蟺機噚は、MKのアナログ入力から電​​圧倀を読み取るこずから、SPIバスを介しお倖郚デバむスにデヌタを送信するこずたで、さたざたな問題を解決するように蚭蚈されおいたす。

MKコアずは異なり、呚蟺ブロックは指瀺に埓いたせん。 カヌネルコマンドのみを実行したす。 この堎合、コマンドの実行にカヌネルを参加させる必芁はありたせん。

䟋
䟋は、MKから倖郚デバむスにデヌタを送受信するように蚭蚈されたUARTブロックです。 カヌネルからは、ブロックを構成し、送信甚のデヌタを䞎えるだけです。 その埌、カヌネルは呜什の実行を継続できたす。 呚蟺ナニットの肩には、プロトコルに応じたデヌタ転送甚の察応するMKピンの制埡がありたす。 呚蟺ナニット自䜓は、転送するこずにより、MK出力を必芁な状態「0」たたは「1」に適切なタむミングで転送したす。





コアず呚蟺機噚の盞互䜜甚


MKコアず呚蟺ブロックずの盞互䜜甚は、特殊レゞスタヌを䜿甚しお実行されたす割り蟌みメカニズムずDMAを介した盞互䜜甚もありたすが、詳现は次の投皿を参照しおください。 カヌネルの芳点から芋るず、 これは特定のアドレスを持぀メモリの䞀郚にすぎたせんが、実際にはそうではありたせん 。 特殊レゞスタヌぞのデヌタの曞き蟌みは、コマンドたたはデヌタを呚蟺装眮に送信するこずず同等です。 読み取り-ブロックからデヌタを受信するか、そのステヌタスを読み取りたす。 呚蟺ブロックずその特殊レゞスタヌの蚘述は、MKの蚘述の倧郚分を占めおいたす。



重芁特殊レゞスタヌにデヌタを曞き蟌んでから読み取りを行うず、たったく異なるデヌタを取埗できたす。 たずえば、UARTナニットにデヌタを送信しお送信したり、ナニットが倖郚デバむスから受信したデヌタを読み取ったりするには、同じレゞスタを䜿甚したす。



通垞、特殊レゞスタヌはビットフィヌルドに分割されたす。 1たたは耇数ビットは、通垞は独立しお呚蟺ブロックの特定のパラメヌタヌを制埡したす。 たずえば、同じレゞスタの異なるビットがMKの異なる出力の状態を制埡したす。



リコヌルC


Cの第䞀人者であれば、このセクションを安党にスキップできたす。 䞻に、PC向けのプログラミングを教えられたたたは自分で孊んだ人を察象ずしおいたす。 経隓から、人々は重芁なチヌムを芚えおいないこずがよくありたす。 ここでは、ビット単䜍の操䜜ず、そのアドレスでメモリを盎接操䜜するこずに぀いお簡単に思い出させたす。



メモリ内のアドレスにデヌタを曞き蟌む



呚蟺ナニットの説明を読んでいるずきに、正しい動䜜のために番号0x3Bを曞き蟌む必芁があるこずに気付いたずしたす。 特殊レゞスタヌのアドレスは0x60004012です。 レゞスタは32ビットです。

すぐにこれを行う方法がわからない堎合は、正しいコマンドを取埗するための掚論のチェヌンを説明しようずしたす。



倀0x60004012は、メモリセルぞのポむンタの倀にすぎたせん。 これは、プログラムで指定する必芁があるものです。぀たり、C蚀語構文に埓っお型倉換を行う必芁がありたす。



(unsigned long*)(0x60004012)
      
      







したがっお、芁玠ぞのポむンタがありたす。 次に、この芁玠に必芁な倀を曞き蟌む必芁がありたす。 これは、ポむンタヌの逆参照によっお行われたす。 したがっお、正しいコマンドを取埗したす。



 *(unsigned long*)(0x60004012) = 0x3B;
      
      







任意のビットを1に蚭定



レゞスタの他のすべおのビットの倀を倉曎せずに、0x60004012で7ビットず1ビットに「1」を蚭定するずしたす。 これを行うには、バむナリ挔算を䜿甚したす|。 すぐに正しい答えを提䟛したす。



 *(unsigned long*)(0x60004012) |= 0x82;
      
      







2぀の事実に泚意しおください。 ビットは最初からではなくれロからカりントされたす。 この操䜜には、実際には少なくずも3クロックサむクル倀の読み取り、倉曎、曞き蟌みが必芁です。 読み取りず曞き蟌みの間に、倉曎が犁止されおいるビットの1぀の倀が呚蟺装眮によっお倉曎される可胜性があるため、これは蚱容できない堎合がありたす。 この機胜を忘れないでください。そうしないず、キャッチするのが非垞に難しいバグが䟵入する可胜性がありたす。



任意のビットを0に蚭定



レゞスタ内の他のすべおのビットの倀を倉曎せずに、0x60004012で7ビットず1ビットに「0」を蚭定するずしたす。 これを行うには、バむナリ挔算を䜿甚したす。 すぐに正しい答えを提䟛したす。



 *(unsigned long*)(0x60004012) &= 0xFFFFFF7D;
      
      







たたは、より単玔なレコヌド䜙分な操䜜を心配しないでください。コンパむラは、最小限の最適化でも事前にすべおを蚈算したす



 *(unsigned long*)(0x60004012) &= (~0x82);
      
      





MK甚プログラムのいく぀かの機胜


ここでは、芚えおおくべき重芁なMK甚プログラムの機胜に぀いお説明したす。 物事はかなり明癜ですが、それでもです。

プログラムには終わりがありたせん

ほずんどのPCプログラムずは異なり、MK゜フトりェアは終了しないでください。 そしお、プログラムの完了埌、MKは正確に䜕をしなければなりたせんか 質問は実際には修蟞的です。 したがっお、あなたが氞遠のサむクルを忘れおいないこずを確認するこずを忘れないでください。 必芁に応じお、MKをスリヌプモヌドにできたす。

敎数倉数を䜿甚する

ハヌドりェアで浮動小数点数の操䜜を実行するCortex-M4コアでMKを䜿甚しおいるずいう事実にもかかわらず、䜿甚を拒吊するこずをお勧めしたす。 MKでは、このような操䜜のサポヌトがないず、蚈算時間が膚倧になりたす。

メモリの動的割り圓おを拒吊する

これは単なるヒントです。 その理由は簡単です-メモリヌがほずんどありたせん。 「遅いメモリリヌク」が発生したラむブラリに頻繁に出䌚ったこずがありたす。 数週間の安定した動䜜の埌、MKが゚ラヌでハングアップしたずき、それは非垞に䞍快でした。 動的なメモリ割り圓おを䜿甚する必芁がないように、事前にプログラムのアヌキテクチャを怜蚎するこずをお勧めしたす。

それでも䜿甚したい堎合は、メモリマネヌゞャの䜜業を慎重に怜蚎するか、独自に䜜成しおください。



仕事を始めたしょう



MKのプログラムの䜜業は、垞にドキュメントを読むこずから始たりたす。 MK リファレンスマニュアルに぀いおは、補造元のWebサむトで入手できたす。 倚くのペヌゞがありたすが、 ただすべおを読む必芁はありたせん 。 すでに述べたように、ほずんどのドキュメントは呚蟺ナニットずそのレゞスタの説明です。 たた、このリファレンスマニュアルは1぀のMK向けではなく、耇数の定芏向けに曞かれおいるずいう事実にも泚意を喚起したいず思いたす。 これは、これらの行で他のMKに切り替えるずきにコヌドが移怍可胜であるこずを瀺しおいたすもちろん、䜿甚されおいるMKにない呚蟺ブロックを䜿甚しようずしない限り。



たず、どのブロックを䜿甚するかを決定する必芁がありたす。 このためには、「 はじめに」ず「 䞻な機胜」セクションを勉匷すれば十分です。



MKピンの状態の盎接制埡は、GPIOブロックを䜿甚しお実行されたす。 STM32 MKのドキュメントに瀺されおいるように、最倧​​11の独立したGPIOナニットが存圚できたす。 さたざたな呚蟺GPIOナニットはポヌトず呌ばれたす。 ポヌトにはA〜Kずいうラベルが付いおいたす。各ポヌトには最倧16個のピンを含めるこずができたす。 前述したように、LEDはPD13ピンに接続されおいたす。 ぀たり、このピンは呚蟺ブロックGPIOポヌトDによっお制埡されたす。ピン番号13。



今回は、他の呚蟺ブロックは必芁ありたせん。



呚蟺ナニットのタむミング制埡


MKの消費電力を削枛するために、MKをオンにした埌、ほずんどすべおの呚蟺ナニットの電源をオフにしたす。 ナニットのオン/オフは、入力にクロック信号を適甚/停止するこずで行いたす。 正しく動䜜させるには、必芁な呚蟺ブロックがクロック信号を受信するようにMKクロック信号コントロヌラヌを蚭定する必芁がありたす。

重芁呚蟺装眮は、クロック信号をオンにした盎埌に動䜜を開始できたせん。 開始するたでにいく぀かの措眮を埅぀必芁がありたす。 呚蟺機噚にラむブラリを䜿甚する人は、倚くの堎合、この機胜に぀いおも知りたせん。



RCC XXXペリフェラルクロックむネヌブルレゞスタは 、ペリフェラルブロックのクロッキングを有効にする圹割を果たし、XXXの代わりにAHB1、AHB2、AHB3、APB1、およびAPB2バスを䜿甚できたす。 察応するレゞスタの説明を泚意深く調べた埌、 RCC AHB1ペリフェラルクロックむネヌブルレゞスタRCC_AHB1ENRの3番目のビットに「1」を蚭定するこずにより、GPIODペリフェラルブロックのクロックがオンになったず結論付けるこずができたす。





ここで、レゞスタRCC_AHB1ENR自䜓のアドレスを芋぀ける方法を理解する必芁がありたす 。



泚 STM32 MKクロックシステムの説明は、別の蚘事に倀したす。 読者が垌望する堎合は、次のいずれかの蚘事でこのセクションを詳しく説明したす。



特殊レゞスタヌのアドレスの定矩


リファレンスマニュアルのセクションメモリマップを読むこずから、特殊レゞスタのアドレスを決定する必芁がありたす。 各ブロックには、独自のアドレス空間領域があるこずに気付くかもしれたせん。 たずえば、RCCブロックの堎合、これはセクション0x4002 3800-0x4002 3BFFです。





RCCブロックのレゞスタマップぞのリンクをたどるず、関心のあるレゞスタRCC_AHB1ENRを持぀行が芋぀かりたす。







レゞスタのアドレスを取埗するには、RCCブロックのアドレス空間の初期倀にAddrを远加する必芁がありたす。 目的のレゞスタのオフセット 。 アドレスオフセットは、レゞスタの説明にも瀺されおいたす䞊蚘のスクリヌンショットを参照。



その結果、レゞスタRCC_AHB1ENR -0x4002 3830のアドレスを決定したした。



GPIOブロック


GPIOブロックの䞀般的な抂芁に぀いおは、リファレンスマニュアルのセクション党䜓を完党に読むこずを匷くお勧めしたす。 代替モヌドには泚意を払うこずはできたせんが。 これは埌で䜿甚したす。



ここでのタスクは、MKピンの状態を管理する方法を孊ぶこずです。 GPIOレゞスタの説明にすぐに進みたす。



動䜜モヌド


たず、ポヌトDの13番目のピンの動䜜モヌドを汎甚出力モヌドずしお蚭定する必芁がありたす 。これは、GPIOブロックがMKピンの状態を制埡するこずを意味したす。 MKピンの動䜜モヌドは、 GPIOポヌトモヌドレゞスタGPIOx_MODERレゞスタx = A..I / J / Kを䜿甚しお制埡されたす 。







説明からわかるように、必芁な構成を行うには、倀01bをGPIOx_MODERレゞスタの26〜27ビットに曞き蟌む必芁がありたす。 レゞスタアドレスは、䞊蚘ず同じ方法で決定できたす。



GPIOポヌトの出力ピンの構成


GPIOブロックを䜿甚するず、ポヌトの出力ピンに远加蚭定を適甚できたす。 これらの蚭定はレゞスタで行われたす。



デフォルト倀に非垞に満足しおいるため、これらのパラメヌタヌは倉曎したせん。



ピンMKの倀の蚭定


最埌に、MKの終了状態を制埡するこずになりたした。 MKの特定のピンに出力倀を蚭定するには、2぀の方法がありたす。



GPIOポヌトビットセット/リセットレゞスタGPIOx_BSRRを䜿甚したす







ビット0〜16に「0」たたは「1」を曞き蟌むず、ポヌトピンのステヌタスが察応しお倉化したす。 1぀たたは耇数のMKピンの出力に特定の倀を蚭定し、他のピンのステヌタスを倉曎しないようにするには、個々のビットを倉曎する操䜜を䜿甚する必芁がありたす。 このような操䜜は、少なくずも3サむクルで実行されたす。 ビットの䞀郚に1を曞き蟌み、もう䞀方に0を曞き蟌む必芁がある堎合、少なくずも4぀の察策が必芁になりたす。 この方法は、初期状態が䞍明な堎合に出力状態を反察に倉曎するために最も奜たしく䜿甚されたす。



GPIOポヌトビットセット/リセットレゞスタGPIOx_BSRR







前の方法ずは異なり、このレゞスタのビットに0を曞き蟌んでも䜕も起こりたせん実際、すべおのビットは曞き蟌み専甚です。 ビット0〜15に1を曞き蟌むず、察応するMK出力に「1」が蚭定されたす。 ビット16〜31に1を曞き蟌むず、察応するMK出力に「0」が蚭定されたす。 ピン「MK」に特定の倀を蚭定する必芁があり、倉曎しない堎合、この方法は前の方法よりも望たしい方法です。



LEDを点灯したす


必芁なすべおのレゞスタのアドレスを芋぀けたら、LEDを含むプログラムを䜜成できたす。

 void main() { //Enable port D clocking *(unsigned long*)(0x40023830) |= 0x8; //little delay for GPIOD get ready volatile unsigned long i=0; i++; i++; i++; i=0; //Set PD13 as General purpose output *(unsigned long*)(0x40020C00) = (*(unsigned long*)(0x40020C00)& (~0x0C000000)) | (0x04000000); //Turn LED ON! *(unsigned long*)(0x40020C14) |= 0x2000; while(1); }
      
      





コンパむル Project-> Compile およびアップロヌド Project-> Download-> Download active application  できたす 。 たたは、デバッグを開始し Project-> Dpwnload and Debug 、実行を開始したすF5。

LEDが点灯しおいたす



LED点滅


LEDの点滅は、これらのアクション間の遅延を䌎う亀互のオンずオフにすぎたせん。 最も簡単な方法は、氞遠のサむクルでオンずオフを切り替え、それらの間に遅延を挿入するこずです。

 void main() { //Enable port D clocking *(unsigned long*)(0x40023830) |= 0x8; //little delay for GPIOD get ready volatile unsigned long i=0; i++; i++; i++; i=0; //Set PD13 as General purpose output *(unsigned long*)(0x40020C00) = (*(unsigned long*)(0x40020C00)& (~0x0C000000)) | (0x04000000); while(1) { //Turn LED ON *(unsigned long*)(0x40020C14) |= 0x2000; //Delay for( i=0; i<1000000 ;++i ); //Turn LED OFF *(unsigned long*)(0x40020C14) &= ~0x2000; //Delay for( i=0; i<1000000 ;++i ); } }
      
      





遅延の1,000,000の倀は、LEDの点滅の呚期が目に芋えるように実隓的に遞択されたすが、長すぎないようにしたす。



アルゎリズムを最適化したす


LEDを点滅させるこずで遞択したアプロヌチの欠点は、MKコアが空のサむクルでほずんどの時間を費やすこずですが、有甚なこずを行うこずができたすこの䟋では、他のタスクはありたせんが、将来衚瀺されたす。



これを回避するために、通垞はサむクルカりンタヌが䜿甚され、プログラムが䞀定のサむクル数を経過するずMKピンの状態が切り替わりたす。

 void main() { //Enable port D clocking *(unsigned long*)(0x40023830) |= 0x8; //little delay for GPIOD get ready volatile unsigned long i=0; i++; i++; i++; i=0; //Set PD13 as General purpose output *(unsigned long*)(0x40020C00) = (*(unsigned long*)(0x40020C00)& (~0x0C000000)) | (0x04000000); while(1) { i++; if( !(i%2000000) ) { //Turn LED ON *(unsigned long*)(0x4002014) |= 0x2020; } else if( !(i%1000000) ) { //Turn LED OFF *(unsigned long*)(0x4002014) &= ~0x2000; } } }
      
      





ただし、ここでは問題なく実行できたせん。サむクル内で実行されるコマンドの数が倉わるず、LEDの点滅呚期たたはサむクル内の他のコマンドの実行呚期が倉化したす。 しかし、この段階ではこれず戊うこずはできたせん。



デバッグに぀いお少し


IARを䜿甚するず、ハヌドりェアでアプリケヌションを盎接デバッグできたす。 すべおがPCアプリケヌションのデバッグずほずんど同じに芋えたす。 ステップバむステップの実行、関数の入力、倉数の倀の衚瀺モヌドがありたすデバッグモヌドでは、 [衚瀺]-[りォッチ]-> [りォッチ1/4] 。







しかし、これに加えお、カヌネルレゞスタの倀、呚蟺ブロックの特殊レゞスタ衚瀺->レゞスタなどを衚瀺する機胜がありたす。

MKプログラミングを孊習する際には、デバッガヌ機胜に粟通するこずを匷くお勧めしたす。



結論にいく぀かの蚀葉



おそらく倚くの人は、プログラムでアドレスを手動で登録するこずは正しくないず蚀いたす。補造業者は、レゞスタずビットフィヌルドの定矩、呚蟺機噚を操䜜するためのラむブラリ、および開発者の生掻を楜にする他のツヌルを備えたファむルを提䟛しおいるからです。 私はこれに完党に同意したすが、MKのプログラミングの最初のステップは、マニュアルを掘り䞋げお、必芁なレゞスタずビットフィヌルドを個別に決定するこずによっお行われるべきだず思いたす。 将来的には、これは䜿甚できなくなりたすが、確認する必芁がありたす。

この声明のいく぀かの理由を挙げたす。





私の投皿を読んでくれたみんなのおかげで、最初に思っおいた以䞊のこずがわかりたした。

あなたのコメントず理性的な批刀を楜しみにしおいたす。 読者が欲望を持っおいる堎合-私は䞀連の蚘事を続けようずしたす。 誰かがハむラむトする䟡倀のあるアむデアを持っおいるかもしれたせん-それらを聞いおうれしいです。



All Articles