2017-08-23 3 views
2

一般に、STラインの言語/用語/用語については少し混乱しています。同じシリーズの別のSTMFxシリーズにプロジェクトを移植する方法

少し背景:私は、AVRプラットフォームを使用している義務的なカルトコースを通してFWについて知っているすべてを学んだEEです。それを愛し、非常にシンプルで使いやすい。 唯一のデータシートを通して簡単に見て、バンあなたは抽象化しています!マクロ、ポンド定義など...それはとても簡単でした! main.cとMakefileを書き、コンパイルして、avr-dudeで消してください...人生は良いです。

次に、私はSTM32 ARMコアと聖なる煙草の虐殺者に歩いて行きました... STDPerifieralライブラリ、HAL層、CubeMX、アセンブリスタートアップファイル、CMSIS、IDE固有のプロジェクトファイル、 STM32F4 ...私はすぐに圧倒されました!

私の本当の問題は、このSTM32F411ディスカバリーボードを手に入れたことと、20x4キャラクターLCDを稼働させる必要があることです。私はgithubの上でまともな探して、プロジェクトのカップルを見つけたなど:

https://stm32f4-discovery.net/2014/06/library-16-interfacing-hd44780-lcd-controller-with-stm32f4/

https://github.com/EarToEarOak/STM32F4-HD44780

https://github.com/6thimage/hd44780

https://github.com/mirkoggl/STM32F4_LiquidCrystal

しかし、私はこれらのいずれかを取得する方法を見つけ出すことはできません正しくコンパイルされます。 私はCubeMxを使ってMakefileを作成しています。これは主にリンカ・スクリプトと必要な.sファイルを作成するためですが、自分でこれを行う方法についての経験やアイディアは全くありません。それがCubeMXの中毒です。

私は、CubeMXとさまざまなオンラインプロジェクトコードによってMCU固有の生成コードを接着して、多くの競合が発生していると考えています...オンラインプロジェクトでは、またはメークファイルが見つけることができないものを参照していて、それは物事がレールから外れるところです。 例えば、これらのプロジェクトのいくつかはstm32f4xx.hファイルを呼び出していますが、CubeMXはそれを生成コードに含めません。

私はシステム内の他の場所に移動し、そのファイルを./Incフォルダにコピーしなければなりませんでしたが、それは実際には後ろ向きです...そして、それでもビルドしませんでした。

私はここに水の上に私の頭を維持するつもりならば、私はSTM32 12段階のリハビリプログラムか何かにAVRを必要とする...

ので、大きな問題は次のとおりです。

あなたは最初のgit clone xxxxからこれらのプロジェクトの1つを取り出し、arm-none-eabiとMakefilesのみを使用してSTM32F411ディスカバリーボードで実行するようにビルドしてください... IDEは許可されていません。

そして、8ビットAVRの開発とSTM32F4の開発で最も重要な違いは何ですか? 限られた経験と私が作っている初心者の間違いで、私は最も安全な道はCubeMXでプロジェクトを作って、すべてが少なくとも書き込みを設定できるようにしてから、ハンド?しかし、それは私がIDEとしてUnixを使用している場合、これらのデバイスとの純然たるワークフローがどんなものであるべきかについて、私が根本的に誤解していることを解決しません。

ありがとうございます!

+0

ほとんどの組み込みプロジェクトの問題は、エレクトロニクスジャーナルなどで見つかったいくつかのメーカープロジェクトからのhelloworld.cのポートとして開始されることです。ハードウェアの移植性の考え方に基づいて構築されることは決してありません。これは、単調な作業であり、単一のプロジェクトでは決して報酬を得られないためです。また、ケイ素のベンダーは、そのようなアイデアを持った図書館を作ることはしません。 – Vroomfondel

答えて

4

非常に広い質問です。最初にあなたのavrの経験を正確に書いてください。もしあなたがmain.cで始まったら、誰かがブートストラップを含むあなたのためのサンドボックス/ツール環境を構築しました。 avrは腕よりもハーバード・アイですので、実際には誰かがあなたのために仕事をしなくても本当にビルドするのはPITA以上です。

経験が全く同じにはならない理由はありません。あなたは、プログラムのその周辺機器用のレジスタでいくつかの周辺機器ポーク用のレジスタについて読まれたavrドキュメントを取り、それを動作させることができます。あなたは最初の文書を読んで、周辺機器のレジスタを読んで、あなたのプログラムのその周辺機器のレジスタを突き止めて動作させることができます。

あなたのavrのためのarduinoのようないくつかのライブラリを取ることができます、API呼び出しを読んで、いくつかの呼び出しを行うプログラムを書き、デバイスをプログラムします。あなたのstチップのためにいくつかのライブラリを取ることができ、同じことをする、apiの呼び出しは同じではないでしょう。 arduinoライブラリは、atmelや他のいくつかの当事者によって作られた他のavrライブラリと同じapi呼び出しではありません。あなたはmbed.orgに飛び乗って、あなたの、あるいはいくつかのstチップと、働くバイナリのapi呼び出しを書くことができます。

すべてのmcuチップベンダーは、誰もがベアメタルの方法で(ベアメタルではなく、単にシステムのように)APIを呼び出しているわけではありませんので、ライブラリを提供する必要があります。彼らはこの日と年齢で生き残れなかった。同様に、ライブラリが変わるように、いくつかの新しい名前で新しいほうがいいのです。 ARMは素晴らしいですが、同時に王室のPITAです。なぜなら彼らはチップをコアではなく、コアはさまざまなものに囲まれているからです。同じcortex-m4コアを使用する大量のcortex-m4ソリューションがありますが、チップベンダー固有のものがすべて異なっているため、それらのすべてで動作する1つのcortex-m4プログラムを書くことはできません(大規模なif-あなたがそれに合うようにすることができれば、プログラムはうまくいくでしょう)。 ARMは同じように見えるマジックレイヤーを作ろうとしており、ベンダーもドラッグされているので、このCMSISとMBEDはこの問題を解決するためのARM主導の概念です。 AVRはこの問題を抱えておらず、コアとチップのベンダーは同じです。今ではいくつかの異なるAVRコアがありますが、同じ周辺機器を使用していても、すべてのデバイスで動作するバイナリを作成できない場合や、別のバイナリ(xmega)が別の(xmega)これは、たとえ周辺機器が同じであってもavrコアの実装が異なるためです。 avrの問題はアームの問題よりはるかに小さいですが、すべてが1つの会社に含まれています。周辺機器が変化しても、同じアームコアを使用している場合と比べて、ほぼ同じ程度に変化することはありません(または、少なくとも同じ名前です。アームソースには、変更が容易な項目があります。 16ビットのフェッチや32ビットのフェッチなどの浮動小数点がなくても、そのコアのtrmに文書化されています。

STのような会社の中ではちょうどcortex-msだけで、さまざまな周辺機器を作成しています。タイマー、gpio、uart、pll/clockなど多数のタイマーがあります。 cortex-m3からcortex-m0への移行が、異なるGPIO周辺機器を使用し始めたことがわかりますが、他のいくつかのものは同じかもしれません。現在のところ、ST社のcortex-m3、cortex-m0、cortex-m0 +、cortex-m4およびcortex-m7ベースのデバイスがあり、1つの製品ラインをミックスしてマッチさせる周辺機器には、 cortex-m3製品ではなく、最初の皮質-m0製品に近いgpioです。そして彼らは、彼らが作成したそれぞれの新しい家族を周辺のプールから混ぜ合わせているように見える。だから私は特定のチップのコードを持っているかもしれない。しかし、それを別のst stm32ファミリに移動して、おそらくuartコードは動作しますが、gpio doesntは、その最初のプログラムをとり、それを別のファミリに移します。おそらくgpioの動作とUartのdoesnt。あなたが別の周辺機器のそれぞれに独自のライブラリを持っていたら、ミックスと一致することを、そのライブラリがあることを行うにしよう、と共通っぽい理想的なコードポートが少し良くすることを呼んでいますが、ために構築する必要がありますを使用することができます異なるチップをリンクさせて、完璧ではありません。

はまた、そのことが比較的古代のあるatmega328p非常に人気のおかげでAVR-フリークその前に、おそらくアルドゥイーノとすると言う何歳に見えます。その時から、すべてのstm32が作成され、さまざまな理由でサイズ/スピード/社内政治/ etcなどの異なる周辺機器の選択肢が作成されました。上記のすべての皮質のバリエーションは、atmega328pが変更されなかった時間の中で、mcu世界内のさまざまなターゲットユースケースで作成されました。

ですから、1つのAVR文書と1つのAVRを取り、やや作業ツールチェーンを持っている場合、あなたはAVRのドキュメントから直接プログラムを書くことができます。あなたは1つのSTM32のチップのために1つのSTM32の文書を取る場合は、単にアーム用のgccクロスコンパイラ(アームなし - EABI、腕-のlinux-gnueabi、など)のいずれかについて、取るために非常に簡単です、あなた自身のブートストラップとリンカスクリプトを実行しますcortex-mでは、stm32のドキュメントとarmドキュメントから直接プログラムを書くことができますが、どちらも問題はありません。異なるstm32チップで繰り返す、皮質mベースのnxpチップで繰り返す、皮質mベースのtiチップで繰り返す。

2つのチップの1つのプログラムを書きたいと思っていますが、2つのチップを見て共通点と異なる点を見て、違いやif-then-elseを避けるか、リンク時if-then-else解。

私は、チップベンダーのライブラリが、ドキュメントとプログラミングレジスタを読み込むだけではなく、使いにくいことがわかりました。 YMMV。古いライブラリと新しいライブラリを引き続き使用して、レジスタに直接アクセスして最適なものを見つけることをお勧めします。腕はavrsの周りに同様の価格、力などで円を描くので、これらの他の部分を使用しようとする価値があります。 avr、msp430などは、cortex-mベースの製品にもなっているので、専門的には1つまたは複数のものを掘り下げてください。例えばので

void PUT32 (unsigned int, unsigned int); 
unsigned int GET32 (unsigned int); 
void dummy (unsigned int); 

#define RCCBASE 0x40023800 
#define RCC_AHB1ENR (RCCBASE+0x30) 

#define GPIOABASE 0x40020000 
#define GPIOA_MODER  (GPIOABASE+0x00) 
#define GPIOA_OTYPER (GPIOABASE+0x04) 
#define GPIOA_OSPEEDR (GPIOABASE+0x08) 
#define GPIOA_PUPDR  (GPIOABASE+0x0C) 
#define GPIOA_BSRR  (GPIOABASE+0x18) 

#define STK_CSR 0xE000E010 
#define STK_RVR 0xE000E014 
#define STK_CVR 0xE000E018 


static void led_init (void) 
{ 
    unsigned int ra; 

    ra=GET32(RCC_AHB1ENR); 
    ra|=1<<0; //enable GPIOA 
    PUT32(RCC_AHB1ENR,ra); 

    ra=GET32(GPIOA_MODER); 
    ra&=~(3<<10); //PA5 
    ra|=1<<10; //PA5 
    PUT32(GPIOA_MODER,ra); 

    ra=GET32(GPIOA_OTYPER); 
    ra&=~(1<<5); //PA5 
    PUT32(GPIOA_OTYPER,ra); 

    ra=GET32(GPIOA_OSPEEDR); 
    ra|=3<<10; //PA5 
    PUT32(GPIOA_OSPEEDR,ra); 
    //pupdr 
    ra=GET32(GPIOA_PUPDR); 
    ra&=~(3<<10); //PA5 
    PUT32(GPIOA_PUPDR,ra); 
} 

static void led_on (void) 
{ 
    PUT32(GPIOA_BSRR,((1<<5)<<0)); 
} 

static void led_off (void) 
{ 
    PUT32(GPIOA_BSRR,((1<<5)<<16)); 
} 

void do_delay (unsigned int sec) 
{ 
    unsigned int ra,rb,rc,rd; 

    rb=GET32(STK_CVR); 
    for(rd=0;rd<sec;) 
    { 
     ra=GET32(STK_CVR); 
     rc=(rb-ra)&0x00FFFFFF; 
     if(rc>=16000000) 
     { 
      rb=ra; 
      rd++; 
     } 
    } 
} 

int notmain (void) 
{ 
    unsigned int rx; 

    led_init(); 

    PUT32(STK_CSR,0x00000004); 
    PUT32(STK_RVR,0xFFFFFFFF); 
    PUT32(STK_CSR,0x00000005); 

    for(rx=0;rx<5;rx++) 
    { 
     led_on(); 
     while(1) if(GET32(STK_CVR)&0x200000) break; 
     led_off(); 
     while(1) if((GET32(STK_CVR)&0x200000)==0) break; 
    } 

    while(1) 
    { 
     led_on(); 
     do_delay(10); 
     led_off(); 
     do_delay(1); 
    } 
    return(0); 
} 

notmain.c PA5のLED

flash.s

.thumb 


.thumb_func 
.global _start 
_start: 
stacktop: .word 0x20001000 
.word reset 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 
.word hang 

.thumb_func 
reset: 
    bl notmain 
    b hang 
.thumb_func 
hang: b . 

.align 

.thumb_func 
.globl PUT16 
PUT16: 
    strh r1,[r0] 
    bx lr 

.thumb_func 
.globl PUT32 
PUT32: 
    str r1,[r0] 
    bx lr 

.thumb_func 
.globl GET32 
GET32: 
    ldr r0,[r0] 
    bx lr 

.thumb_func 
.globl dummy 
dummy: 
    bx lr 

.end 

とstm32f411ための単純な主導ウインカは

MEMORY 
{ 
    rom : ORIGIN = 0x08000000, LENGTH = 0x1000 
    ram : ORIGIN = 0x20000000, LENGTH = 0x1000 
} 

SECTIONS 
{ 
    .text : { *(.text*) } > rom 
    .rodata : { *(.rodata*) } > rom 
    .bss : { *(.bss*) } > ram 
} 
をflash.ldその後、

compil e

arm-none-eabi-as --warn --fatal-warnings -mcpu=cortex-m4 flash.s -o flash.o 
arm-none-eabi-gcc -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding -mthumb -mcpu=cortex-m4 -c notmain.c -o notmain.o 
arm-none-eabi-ld -o notmain.elf -T flash.ld flash.o notmain.o 
arm-none-eabi-objdump -D notmain.elf > notmain.list 
arm-none-eabi-objcopy notmain.elf notmain.bin -O binary 

は、arm-whatever-linux-gnueabiに置き換えられ、ビルドされて実行されます。

ので、歴史的に、私は個人的にそれを避けるため、彼らは(メイン参照余分なもの)を追加し、いくつかのツールチェーンがあります。私はmcus/etcのフラッシュを起動しないでください.dataをコピーする必要はありませんし、.bssが0であると仮定していません。使用する前に初期化します。だから私はブートストラップで不正行為をすることができますが、Cssをより純粋にしたい場合には、bssのオフセットとサイズ、そして.dataのオフセットとサイズとデスティネーションを次のレベルに引き上げる少し複雑なリンカスクリプトの例がたくさんあります。私はまた、ロードとストアのために使用される命令を制御することを好むが、コンパイラが正しく選択するいくつかの/多くの希望は、失敗を見た。 YMMV。だから、たくさんの個人的なスタイルがありますが、stm32f11のドキュメントを読んでそれらのアドレスとレジスタを見てください。たとえあなたが自分のコードやスタイルを完全に嫌っていても、そのペリフェラルを使うのがいかに簡単か分かります。同様にタイマはアームのドキュメントにあります。最近では、一部のベンダーが独自のバージョンのアーム・ドキュメントを変更された形式で持っているため、アーム情報の多くはカバーされていますが、まだまだギャップがあります。

一般的なルールとして、チップベンダのドキュメントから、あなたのチップにあるアームコアを調べます。その後、アームサイトに行き、そのコア(この場合はcortex-m4)のテクニカルリファレンスマニュアル(TRM)を探してください。このドキュメントではarmv7-mというアーキテクチャーについてarmv7-mのアーキテクチャーリファレンスマニュアルを入手しています。これらの3つの文書はあなたの主要な情報源です。最初の皮質-m4の後ではおそらくチップベンダーの99%の時間をチップベンダーが必要としています。また、cpuidのレジスタやチップID、またはそのドキュメントを呼び出してそれをチップ/アームコアから読み込んだものと比較してください。時にはアームコアの異なるバージョン(r1p3はリビジョン1.3を意味します)がありますが、まれですが、リビジョン間の変更が発生すると、古いコアに対して最新のドキュメントを使用すると微妙な違いが生じることがあります。 ARMベースのチップはATmベースのチップよりも速く/改良されています。最初のまたは2番目の後にそれを掛けてください...

たとえば、PIC32を使用する場合は、pic32ドキュメント用の同様のストーリーマイクロチップであり、次にコアドキュメント用のmipsをオフにしますマイクチップがその周辺機器を(今の彼らが所有している)atmel、ti、st、nxpなどの半分のものとして文書化したかったのです。もう一つは、プロセッサコアを買って自分のものを取り巻くように混ぜることです。 pic32sはこのようにプログラムするのは苦痛で、本当にマイクロチップのツールチェーンに埋め込まれたライブラリが必要で、さらにパワーを使うなど、mipsベースではアームベースでは競争できないはずの理由はありませんが... mipsやchipベンダーやコンビネーションはそこに不備があります。

+0

申し訳ありませんオラフは別の人に、魚を与えるよりもむしろ魚を育てるように教えました。 (私はあまりにも魚を与えたが)。 –

+0

これに「どのようにこれらのうちの1つを取るか...」を追加します。私はチップを自分のSPIコントローラまたはi2cコードを貼り付けて貼り付けた後、HD44780用のチップドキュメントからプロトコルが何であるかを見てそれに応じて修正し、コードを取って、誰かがこれらのLCDドライバある範囲の制御を持ち、init orderとこのサードパーティレポが使用する値の両方を使用/調べる傾向があります。彼らのピクセルサイズが違っていて、動作していないことがわかりました。コントラストの設定を上/下などにする必要があるかもしれませんが、それは始点です。 –

+0

... lcdドライバのドキュメントは良い/ initの順序と値の使用例があり、ドキュメントから直接推測するのに長い時間を費やすことができます。通常は、調整する必要があり、第三者の図書館は、そのもので作られたすべてのパネルを含むことができず、作者が持っていてテストしたものだけを含むことはできません。 –

関連する問題