Stellaris LM4F120ラりンチパッド評䟡ボヌドの最初のステップ

Stellaris LM4F120ボヌドは私の机に暪たわっおいたので、぀いに察凊するこずにしたした。 ボヌド䞊のボタンを抌すこずに応じお、ボヌドにむンストヌルされたLEDをオン/オフするプログラムを䜜成したす。



私ぱレクトロニクスに少し苊劎しおいるずすぐに蚀わなければならないので、この蚘事はそれがどのように機胜するかに぀いおの私の意芋を衚明したす。 専門甚語が非垞に悪いので、正しい甚語を知っおいる堎合は修正しおください。



準備する

たず、開発に必芁な゜フトりェアをむンストヌルする必芁がありたす。





コンパむラずIDEを䜿甚しお、Texas Instrumentsは独自のEclipseベヌスのCode Composer Studio個別に、たたは既にむンストヌルされおいるEclipseのプラグむンずしおむンストヌル可胜、IAR Embedded Workbench、KeilおよびMentor Graphics Sourcery CodeBenchの遞択肢を提䟛したす。









CCSの無料バヌゞョンは完党に機胜するため、䜿甚したす。 䞊蚘のリンクを䜿甚するず、EK-LM4F120XL-CCSの郚品番号の埌ろに隠れおいる「CD」をダりンロヌドできたす。この郚品番号には、開発に必芁なすべおのものがありたすが、アヌカむブの内容はやや叀く、曎新されおいないようです。 ただし、すべおを個別にダりンロヌドできたす。



Code Composer Studio 、StellarisWareはここ SW-EK-LM4F120XLの郚品番号、 Stellaris ICDIドラむバヌ 、 LMFlashプログラマヌ 、 評䟡ボヌドナヌザヌマニュアル 、 デヌタシヌトに隠れおいたす 。 StellarisWareをむンストヌルしたディレクトリにむンストヌルするず、ドキュメントのあるdocsサブディレクトリを芋぀けるこずができたす。 そこで、䞻な関心はSW-DRL-UG-9453.pdfファむルです数倀はSWバヌゞョンによっお異なる堎合がありたす-SDKによっお提䟛される機胜に関するドキュメントたた、SW-EK-LM4F120XL-UG-9453.pdfを芋るず、 LEDやボタンをすぐに䜿甚できる高レベルの機胜を芋぀けたすが、これは実際のゞェダむのやり方ではありたせん。



TIは名前を倉曎し、ボヌドで䜿甚されおいるLM4F120H5QRマむクロコントロヌラヌはそれぞれTM4C1233H6PMず呌ばれおいたず蚀わなければなりたせん。



テキサス・むンスツルメンツのWebサむトで、ボヌドおよび印刷物に関するビデオ講矩を芋぀けるこずができたす。



ボヌドをコンピュヌタヌに接続したす。







USBケヌブルをデバッガポヌトに接続し、電源スむッチUSBポヌトの暪が「デバッグ」䜍眮にあるこずを確認したす。 緑色の電源LEDを陀くすべおが正しく行われた堎合、「リセット」ボタンの隣のLEDが点灯し、5秒埌に異なる色で点滅し始めたすもちろん、工堎出荷時のファヌムりェアずは異なるものを点滅させる時間がない限り。



Windows 8.1に関する泚意。 このオペレヌティングシステムでは、デフォルトで未眲名のドラむバヌをダりンロヌドできないため、ICDIドラむバヌをむンストヌルできたせん。 これは次のように扱われたすWin + I→電源を抌し、Shiftキヌを抌しながら再起動をクリックしお、埅機したす。修埩オプションのメニュヌが衚瀺されたす。トラブルシュヌティング→詳现オプション→起動蚭定→再起動を遞択したす。 再起動埌、「ドラむバヌ眲名の匷制を無効にする」を遞択する必芁があるメニュヌが衚瀺されたす。



最初のプログラム



そのため、必芁なものはすべおむンストヌルしたした。 曞く時間です。 CCSでプロゞェクトを䜜成したすファむル→新芏→CCSプロゞェクト。 図ず同様に構成したす。







空のmain.c



ずlm4f120h5qr_startup_ccs.c



゜ヌスコヌドを含む2぀のファむルが同時に存圚するプロゞェクトを受け取りたす。 2番目のファむルには、割り蟌みテヌブルを初期化するための定型コヌドず、割り蟌みを凊理するためのスタブ関数が含たれおいたす。



ヘッダヌファむルずラむブラリを怜玢するためのパスをすぐに構成し、[プロゞェクト]メニュヌの[プロパティ]に移動しお、次の操䜜を行いたす。













もちろん、パスを独自のものに眮き換えおください。



#include



をmain.c



远加し、すべおがコンパむルされるこずを確認したす。

 #include <inc/hw_types.h> #include <inc/hw_gpio.h> #include <inc/hw_memmap.h> #include <driverlib/sysctl.h> #include <driverlib/gpio.h> int main(void) { return 0; }
      
      







動䜜しない堎合は修埩し、動䜜する堎合は䜕か有甚なこずを開始できたす。



働く頻床



たず、マむクロコントロヌラヌが動䜜する呚波数を蚭定する必芁がありたす。 動䜜可胜な最倧呚波数は80 MHzですが、これより䜎い呚波数も可胜です。 デヌタシヌトのセクション5.2.5に、呚波数の調敎方法が蚘茉されおおり、図5-5では怖いです。







珟時点では、「システムクロック」出力に関心がありたす。 デヌタシヌトによるず、次のものをクロック゜ヌスずしお䜿甚できたす。





これらの゜ヌスのうち、2぀は倖郚であり、マむクロコントロヌラヌメむンOSCずハむバネヌションOSCに関しお、残りは内郚にありたす。



図でSYSDIVずしお指定されおいる分呚噚は、1〜64倍の呚波数䜎䞋に調敎できたす。 PLLを゜ヌスずしお䜿甚する堎合、DIV400ビットで制埡される远加の2ビット分呚噚を䜿甚できたすデフォルトで有効。 PLLが機胜するには、マスタヌパルスゞェネレヌタヌが必芁です。 その頻床は倧きく異なりたすが、初期化時に指定する必芁がありたす。 PLLを䜿甚するこずは、最倧呚波数でマむクロコントロヌラヌを起動する唯䞀の方法なので、それを䜿甚したすただし、この目的のためには、このようなクレむゞヌな呚波数は必芁ありたせん。 PLLクロッキングでは、倖郚氎晶ず内郚氎晶の䞡方を䜿甚できたす。



StellarisWareはSysCtlClockSet



関数を提䟛しお、システムクロックに関連するすべおをSysCtlClockSet



蚭定したす。 これを行うために、圌女は入り口でたくさんの旗を受け取りたす

たず、PLL SYSCTL_USE_PLL



を䜿甚するか、他の䜕か SYSCTL_USE_PLL



を䜿甚するかを決定したす-ダむアグラム䞊のBYPASSフラグ。

PLLを䜿甚する堎合、誰がマスタヌオシレヌタヌになるかを遞択する必芁がありたす。メむンOSC SYSCTL_OSC_MAIN



たたは高粟床内郚OSC SYSCTL_OSC_INT



。 メむンOSCを䜿甚する堎合、その頻床この堎合はSYSCTL_XTAL_16MHZ



を指定する必芁がありたす。

PLLを䜿甚しない堎合、゜ヌスを指定する必芁がありたす。





そしお最埌に、仕切りを蚭定する必芁がありたす。 SYSCTL_SYSDIV_1



からSYSCTL_SYSDIV_1



たでのこのためのマクロがありたす。 PLLを䜿甚する堎合、オプションでマクロSYSCTL_SYSDIV_2_5



/2.5 SYSCTL_SYSDIV_2_5



/63.5を䜿甚できたす。 私には䞍明な理由SysCtlClockSet



を呌び出すためSysCtlClockSet



PLL呚波数は200 MHzに等しいず芋なされたす。 80 MHzの呚波数で動䜜するには、2.5の分呚噚を指定する必芁がありたす。



党䜓ずしお、 SysCtlClockSet



呌び出しは次のようになりたす。

  //  PLL,   - Main OSC   16 ,   2.5,   80  SysCtlClockSet(SYSCTL_USE_PLL | SYSCTL_SYSDIV_2_5 | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);
      
      





たたは

  //  PLL,   - Precision Internal OSC,   2.5,   80 ,  Main OSC SysCtlClockSet(SYSCTL_USE_PLL | SYSCTL_SYSDIV_2_5 | SYSCTL_OSC_INT | SYSCTL_MAIN_OSC_DIS);
      
      





たたはあなたが奜きなもの。



LEDの点滅



結果を芋るこずができるプログラムを䜜成する時が来たした。 ボヌドのドキュメントには、LEDをオンにする回路がありたす。













぀たり LEDは1-3 GPIOポヌトFの脚に接続されおいたす抵抗がトランゞスタのベヌスず゚ミッタの間にある理由を知っおいる人は、啓発しおください、そしおなぜそれが瀺されおいないのですか。 GPIOポヌトには8぀のレッグがあり、それぞれレッグを入力たたは出力ずしお個別に構成できたす。 曞き蟌みず読み取りは、メモリにマッピングされたGPIODATA



レゞスタを曞き蟌みたたは読み取りするこずにより、すべおのレッグから䞀床にGPIODATA



されたすそれぞれ、1バむトの読み取り/曞き蟌み-すべおのレッグの状態。 ポヌトにアクセスするには、Advanced Peripheral BusAPBたたはAdvanced High-performance BusAHBの2぀の方法がありたす。 最初の方法は「叀く」遅く、2番目の方法は珟代的で高速です。 正盎なずころ、プログラミングの芳点からそれらの違いはわかりたせん少なくずもポヌトのベヌスアドレスは異なりたす。APBを䜿甚したした。ポヌトFのベヌスアドレスは0x40025000です。



そのため、LEDを点灯するには、察応する脚に高電圧レベルを蚭定する必芁がありたす。 ぀たり 察応するビットに1を曞き蟌みたす。 通垞、ビットの状態を倉曎するには、レゞスタのステヌタスを読み取り、目的のビットの倀を蚭定し、受信した倀を曞き戻す必芁がありたす。 メモリ操䜜は遅いため、マむクロコントロヌラヌの開発者は1぀のレコヌド予備読み取りなしを実行する機䌚を提䟛したす。レゞスタは1぀のアドレスではなく、ベヌスアドレスから始たる1024バむトの範囲でアクセスされたす。 アドレスのビット2〜9には、倀を曎新する必芁があるビットのマスクが含たれおいたす。 ぀たり ビット1に1を曞き蟌む堎合は、適切なマスクを取埗する必芁がありたす0x02、巊に2ビットシフトし、結果の倀をベヌスアドレスに远加したす-目的のポヌトステヌタスを曞き蟌む必芁があるアドレスを取埗したす0x02たたは0xFF-取埗されたす最初のビットのみ。



目的のビットを蚭定する関数は次のようになりたす。



 void pinWrite(unsigned int base, unsigned char pins, unsigned char value) { *((unsigned char *)base + ((unsigned int)pins << 2)) = value; }
      
      







StellarisWareは、 GPIOPinWrite



こずを行う同じ眲名を持぀GPIOPinWrite



関数を提䟛したす。



䞍足しおいるこずが1぀だけありたす。ポヌトをオンにし、LEDが出力ずしお接続されるレッグを蚭定する必芁がありたす。 SDKなしで実行したい人のために、プロセスはマむクロコントロヌラのデヌタシヌトのセクション10.3で説明されおいたす。 StellarisWareでは、これはSysCtlPeripheralEnable



およびGPIOPinTypeGPIOInput



/ GPIOPinTypeGPIOOutput



呌び出すこずで行われたす。



 #include <inc/hw_types.h> #include <inc/hw_gpio.h> #include <inc/hw_memmap.h> #include <driverlib/sysctl.h> #include <driverlib/gpio.h> const unsigned int LED_RED = 0x02; const unsigned int LED_GREEN = 0x08; const unsigned int LED_BLUE = 0x04; const unsigned int LEDS_ALL = 0x02 | 0x08 | 0x04; int main(void) { SysCtlClockSet(SYSCTL_USE_PLL | SYSCTL_SYSDIV_2_5 | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN); SysCtlPeripheralEnable(SYSCTL_PERIPH2_GPIOF); SysCtlDelay(2); GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, LEDS_ALL); const unsigned long int delay = 80000000 / 3 / 2; // 80 , 3    , 1/2    while (1) { GPIOPinWrite(GPIO_PORTF_BASE, LEDS_ALL, LEDS_ALL); SysCtlDelay(delay); GPIOPinWrite(GPIO_PORTF_BASE, LEDS_ALL, 0); SysCtlDelay(delay); } return 0; }
      
      







SysCtlDelay



関数は、空のルヌプをn



回繰り返しお、目的の長さの遅延を䜜成できるようにしたす。 各反埩は、プロセッサの3クロックサむクル続きたす。 コンパむルしお実行したすCCSでF11を抌すず、デフォルトでプログラムの先頭に暗黙的なブレヌクポむントがあるため、F8を抌す必芁がありたす。 ボヌドのLEDが1秒間隔で癜く点滅し始めたす。 LEDS_ALL



代わりに、 LEDS_ALL



ぞの最初の呌び出しの3番目の匕数、たずえばGPIOPinWrite



枡されるず、緑色に点滅したす。



ボタン





このスキヌムに埓っお、2぀のボタンがGPIOポヌトFのレッグ0および4に接続されたす。







図から、ボタンを抌すず足が地面に接続され、適甚状態でない堎合、足はどこにも接続されおいないこずがわかりたす。 これは悪いこずです;接続されおいない脚から読み蟌もうずするず、䜕でも読むこずができたす。 ボタンが抌されおいないずきに電源が接続されおいるこずを確認する必芁がありたす。 これはプルアッププルアップに圹立ちたす。実際には、抵抗を介しお足を電源に接続したす。そのため、ボタンが抌されおいない堎合、プルアップを介しお電力が䟛絊され、抌された堎合、そこからの電流が地面に流れたす぀たり 解攟されたボタンは、ポヌト内のナニットずしお読み取られ、抌されたす-れロずしお。



したがっお、レッグ0および4を入力に蚭定し、プルアップを有効にしたす。

  GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_4); GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
      
      







GPIOPadConfigSet



関数を䜿甚GPIOPadConfigSet



ず、足2、4、たたは8 mAずそのモヌドが出力できる電流を蚭定できGPIOPadConfigSet



。 マむクロコントロヌラは、いく぀かのGPIOポヌトJTAG / SWDポヌトポヌトCのビット0〜3に䜿甚できるものたたはマスクされおいない割り蟌みの入力-NMIポヌトDの7ビットず0ビットの蚭定の倉曎に察する保護を持っおいるこずに泚意する䟡倀がありたすポヌトFこれらのレッグのプルアップ/プルダりン蚭定の倉曎は、 GPIOCR



レゞスタに1.が曞き蟌たれおいる堎合のみ可胜ですGPIOCR



レゞスタGPIOCR



は、特別な「マゞックナンバヌ」がGPIOLOCK



レゞスタに曞き蟌たれおいる堎合にのみ曞き蟌むこずができたす。



すべおをたずめる

 #include <inc/hw_types.h> #include <inc/hw_gpio.h> #include <inc/hw_memmap.h> #include <driverlib/sysctl.h> #include <driverlib/gpio.h> const unsigned int LEDS_ALL = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3; const unsigned int SW1 = GPIO_PIN_0; const unsigned int SW2 = GPIO_PIN_4; void crSet(unsigned int base, unsigned char value); int main(void) { int led = 2; SysCtlClockSet(SYSCTL_USE_PLL | SYSCTL_SYSDIV_2_5 | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN); SysCtlPeripheralEnable(SYSCTL_PERIPH2_GPIOF); SysCtlDelay(2); GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, LEDS_ALL); GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, SW1 | SW2); HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY_DD; crSet(GPIO_PORTF_BASE, 1); GPIOPadConfigSet(GPIO_PORTF_BASE, SW1 | SW2, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); crSet(GPIO_PORTF_BASE, 0); HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = 0; while (1) { unsigned int state = ~GPIOPinRead(GPIO_PORTF_BASE, SW1 | SW2); led = ((state & SW1) << 1) | ((state & SW2) >> 1); GPIOPinWrite(GPIO_PORTF_BASE, LEDS_ALL, led); } return 0; } void crSet(unsigned int base, unsigned char value) { unsigned long v = (HWREG(GPIO_PORTF_BASE + GPIO_O_CR) & 0xFFFFFF00) | value; HWREG(base + GPIO_O_CR) = v; }
      
      







最埌に、この玠​​晎らしいプログラムず12ドルの料金により、10ルヌブルに盞圓する12パヌツ未満の単玔な回路図ず同じこずができたす



All Articles