STM32 MCU と 51 MCU には大きな違いがあります。構造に大きな違いがあるだけでなく、STM32 の方が複雑です。動作に関しても、STM32 の方がはるかに複雑です。51 MCU では手書きコードでピンを直接操作できますが、ただし、STM32 MCU ピンを操作する前に、クロックの有効化や GPIO ピンの初期化など、多くの初期化作業が必要です。
以下に、STM32 シングルチップ マイコンの開発について簡単に紹介します。この記事はシミュレーションです。実際の STM32 シングルチップ マイコンは必要ありません。コンピュータに関連ソフトウェアをインストールして開発するだけで済みます。主にキールです。 mdkとプロテウス。
ここでインストールする keil は STM32 シングルチップマイコンをサポートするバージョンであり、mdk のインストールが必要です。これは、mdk、抽出コード: 1234 をサポートする keil ダウンロード リンクです。そのインストールとクラッキングは keil-51 と似ています。クラッキングでは keygen.exe を使用して登録コードを生成します。インストール後、STM32 マイクロコントローラーをサポートするパッケージもインストールする必要があります: Keil.STM32F1xx_DFP.1.0.5.pack、ダウンロード上記のリンクからパッケージをダウンロードします。次のように、オフラインでインストールできます。
keil ツールバーの [パック インストール] ボタンを選択し、ポップアップ ボックスで [ファイル] -> [インポート] を選択すると、ファイル選択ダイアログ ボックスが表示され、ダウンロードしたパック パッケージを選択すると、オフラインでインストールできます。
STM32 プロジェクトを構築するには標準ライブラリが必要です。同様に、先ほどのダウンロード リンクには STM32F10x_StdPeriph_Lib_V3.5.0.rar が含まれています。解凍後の構造は次のとおりです。
ここでは、標準ライブラリを使用して STM32 プロジェクトをビルドします。このプロジェクトには、プロジェクトに必要なヘッダー ファイルとソース ファイル、およびスタートアップ ファイルが含まれています。新しい STM プロジェクトを作成する前に、次のようなプロジェクト ファイル構造を準備します。
ここでのコアは、CMSIS という名前でも構いません。個人的な習慣によれば、文字通りコア ファイルを意味します。ここでは、標準ライブラリの core_cm3.h および core_cm3.c ファイルをコピーする必要があります。パスは STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport です。
Fwlibとはファームウェアライブラリの意味で、ここでは標準ライブラリのSTM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\srcのincフォルダとsrcフォルダをコピーします。
Project は keil プロジェクトを保存するために使用され、後で keil に新しいプロジェクトを作成する場合、ここで保存場所を指定します。
ユーザー、これがユーザー ファイルです。stm32f10x.h、system_stm32f10x.c、system_stm32f10x.h ファイルをコピーし、
STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template の下の stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h、system_stm32f10x.h (繰り返し)。
Startup スタートアップ ファイルが保存されているフォルダー。ここでは、STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm の下に s で終わるすべてのファイルをコピーします (実際には 1 つだけが使用されます)。
このようにして、プロジェクト フォルダーにファイルがないことを除いて、他の 4 つのディレクトリにファイルが存在します。
ケイル新築
keil-mdk を開き、新しいプロジェクトを作成し、その場所に準備したプロジェクト フォルダーを選択します。
次のウィザードでは、ビルド ターゲットのデバイスを選択します。ここでは STM32F103C8 を選択しますが、シミュレーションのニーズに応じて他のデバイスも使用できます。
この新しいプロジェクトにはコンテンツがないため、リセットする必要があります。ツールバーの「エンジニアリング項目の管理」ボタン (3 色のブロック) をクリックします。
Project Targets がプロジェクト名に変更され、
グループ ここに Core、Fwlib、Startup、User という 4 つのグループとその中のファイルを追加します。先ほどの Core、Fwlib、Startup、User フォルダー内のファイルを選択します。構造は次のとおりです。
また、ユーザー ディレクトリに main.c ファイルを手動で追加し、ユーザー グループを右クリックして [既存のファイルをグループに追加] を選択する必要もあります。
最終的なプロジェクト ファイル構造は次のとおりです。
main.c にコードを追加して、空のプロジェクトとしてコンパイルできるようにします。
#include "stm32f10x.h"
int main()
{
}
このとき、プロジェクトを直接コンパイルするとエラーが報告されますので、ヘッダファイルの検索範囲を設定する必要があります 具体的な操作は、ツールバーの魔法の杖(ターゲットのオプション)をクリックし、c/c++を選択しますポップアップ ボックスの [定義] に USE_STDPERIPH_DRIVER と入力し、その下にパスを含めます。 フォルダー Core、Fwlib/inc、ユーザー 3 つのディレクトリを選択し、手動で次を選択します。
最後に、正常にコンパイルできます。
シミュレーションには最後に HEX ファイルが必要なので、設定も必要です。[ターゲットのオプション] をクリックして出力に切り替え、[HEX ファイルの作成] チェックボックスをオンにします。
STM32 マイクロコントローラー照明のコードはやや複雑で、主にクロックをオンにしてピン レベルを設定する必要があります。
#include "stm32f10x.h"
void Delay()
{
unsigned int i, j;
for(i = 0; i < 2000; i++)
for(j = 0; j < 110; j++);
}
void LED_Config()
{
GPIO_InitTypeDef GPIO_InitStructure; // GPIO初始化结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //APB2时钟使能,这里单片机开启的是B口,所以对应RCC_APB2Periph_GPIOB,如果开启A口,这里对应RCC_APB2Periph_GPIOA
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // 管脚B5作为输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //时钟频率
GPIO_Init(GPIOB, &GPIO_InitStructure); // GPIO初始化,开启GPIOB,如果要开启A或者C,改变这里的GPIOA或者GPIOC
}
int main()
{
LED_Config();
while(1)
{
GPIO_SetBits(GPIOB, GPIO_Pin_5);
Delay();
GPIO_ResetBits(GPIOB, GPIO_Pin_5);
Delay();
}
}
コンパイルでエラーが報告されない場合は、シミュレーションを開始できます。proteus では、以下に示すように LED 設計図を構築します。
チップ STM32F103C8 を選択し、発光ダイオード LED-GREEN を見つけて、抵抗を追加し、接地します。シンプルな接続です。STM32 MCU は 51 MCU とは少し異なるようです。ここでは接続を処理し、メニュー バーの [デザイン] で [Power Rail Configuration] を選択し、GND と VCC/VDD の左側にリストされている部品を渡す必要があります。中央の [追加] をクリックすると、(右に移動) 矢印が右側に追加されます。
設定する必要があるもう 1 つの重要な場所があります。それは、マイクロコントローラーの水晶発振器周波数です。設定されていない場合は、エラーが報告されます。
0x40010C00 で非クロックペリフェラルのレジスタにアクセスすると BUS_FAULT が発生する [U1_CM3CORE]
この問題はシミュレーション中にのみ報告される可能性があり、コード内でクロック イネーブルを設定する必要があると記載されているところもありますが、ここでのコードは明らかに設定されています (RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); このコード ) 。この問題は非常に厄介です。最初、コードは main.c ファイルの内容を実行していないと思いました。実際にはそうではなく、水晶発振器の周波数ですが、周波数も設定されていません。 STM32CubeMX によって生成されたコードは問題なく実行されますが、これも非常に奇妙です。
ここでの 50MHz は、コードで設定されているクロック周波数 GPIO_Speed_50MHz です。
最後に、シミュレーションはエラーを報告しません。
ここでは標準ライブラリを利用してSTM32プロジェクトをビルドするため、標準ライブラリのヘッダファイルとソースファイルを追加します ここでは、プロジェクトの特性に合わせて、Core、Fwlib、Project、Startup、Userフォルダを新たに追加しますターゲットに設定されているグループ Core、Fwlib、Startup、および User は同じ意味を持ちませんが、名前は同じです 最後に、手動でファイルを追加する必要がありますこれらのグループに。