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