標準外任库終局在替全線:時計からGPIOまでの一度完了した通話 – Zw-awa
コードが次の行で初期化されるとき、チップ内でいくつのことが起こっているでしょうか?単一の構成テーブルから実際のレジスタ変更まで、中央が機能を備えたテーブルです。
クラシック三问
Q: STM32規格とは何ですか?
A: C 関数パッケージ レジスタ操作の公式ソフトウェア ライブラリのセットです。プロジェクトでソフトウェア ライブラリを使用できるようにします。
Q: 標準の外任库が必要なのはなぜですか?
A: チップとインターフェイスを読み取るのが初めてです。
Q: 標準的な外任库の一般的な使用シナリオは?
A: F1 シリーズの作業でクロック、GPIO、タイマー、文字列、ADC、I2C、SPI、CAN を設定します。
STM32 Standard Library Worksを初めて開くと、まったくわかりません Library ディレクトリ内の 10 個のドキュメントを読み取る必要があります。stm32f10x_gpio.c こちら、自画像 led.c そこには、main.c 里また直前実行計画。
その時私が最も困っているのは関数パラメータではなく、それらの間の関係です:我写的GPIO代咠, stm32f10x_gpio.c あなたたちの関係は何ですか?
レジスタの特定の実現は、最初に個別の電子イメージ領域に配置されます。ここでは、標準ライブラリはブラック ボックスになり、何を受信するか、何を実行するか、ハードウェアが何を返すかを観察するだけです。
先画一个地図を使用する
想是一外上外报影可,「使用機能」が 1 つだけ見つかりません。
找到外设
-> 打开外设时钟
-> 准备初始化配置
-> 调用初始化函数
-> 使用读写或控制函数
-> 观察引脚、屏幕、串口或电机的反馈
これは一連の要件ではありません。ここでの各ステップは、「チップにはこのモジュールへの電源が供給されていますか?」という特定の質問に答えることです。
ライブラリの標準構成方法: 1 つの構造、複数のオプションが利用可能
標準外刻库对外外刻店是是是:構成構造の定義を、それぞれ事前定義された名前で指定します。
GPIO の下の例。GPIO_InitTypeDef これは GPIO の構成構造であり、3 つのレベルがあります。
| 格(メンバー名) | これが答えです | 阿格能品名 | 一緒にいられない |
|---|---|---|---|
GPIO_Pin |
用哪几根電影 | GPIO_Pin_0 ~ GPIO_Pin_15(GPIO_Pin_All 是全16根) |
できる |
GPIO_Mode |
この役割は役割を果たします | 入出力 | できない |
GPIO_Speed |
出力はどれくらい速いですか? | GPIO_Speed_2MHz / GPIO_Speed_10MHz / GPIO_Speed_50MHz |
できない |
左边那一列ですメンバー、右側の那一列です库里定義名落ちた小行里は一行:
gpio.GPIO_Pin = GPIO_Pin_13;
等号の左はメンバー、右側は定義された名前です。それらの名前はほぼ同じです。同じです。それぞれの記事がこの写法を繰り返した後、最初にこれら 2 つの作品を分離します。
これらの名前は 2 つのタイプに分類されます。GPIO_Pin_0 これがクラスです宏: 単一の名前は 1 つの文字列を表します。コードが書かれるとき、名前が書かれ、コンパイラーはコンパイラーの前に名前をそれが表すものに変更できます (変更方法は標準ライブラリを参照してください)。GPIO_Mode_Out_PP、GPIO_Speed_2MHz その 2 つのカテゴリは、枚下常量——C 语语里用 enum 電気効果の一列の値は、電気効果に名前を付けることもできます。このグループは、プラスチックの中にあるいくつかの名前のみを持つことができ、1 つの番号を超えることはできません。(不可说不可编一吧、これは内部関数とレジスタと互換性があるため、对成了、那可以、可件销了、それはさらに面倒です。前提はあなたが何をしているかを知っているということです。標準ライブラリは抽象的な値を具体的な言葉に変換するのに役立ちます。これは作業するときに役立ちます)
なぜだけ? GPIO_Pin これは格能拼は電影ですか? ピン配置宏代表は「第几位は 1」であるため、
| 写法 | それは表します | 意味 |
|---|---|---|
GPIO_Pin_0 |
0x0001 |
第 0 位は 1、第 0 号電影を選択可能 |
GPIO_Pin_13 |
0x2000 |
第 13 位は 1、第 13 号の電影を選択可能 |
GPIO_Pin_1 与 GPIO_Pin_11 一緒に |
0x0802 |
第 1 位と第 11 位 第 1 位、両根電影用 |
それで GPIO_Pin 那一塹壕の就报力劈開」の動的なカテゴリー。GPIO_Pin_1 | GPIO_Pin_11しかし。 GPIO_Mode 和 GPIO_Speed それは「なりなょ里挑戦一个」、みたみみします。
この書込み会電子ダウンロード会電子の初期化は、次の式で行われます。TIM_TimeBaseInitTypeDef、USART_InitTypeDef、I2C_InitTypeDef—— グリッドと名前の前了、アクションは変更なし: 構成オブジェクトを宣言し、グリッドを埋め、そのアドレスを初期化関数に渡します。
電影先看一电影:这张图像十要旅場,電影去用那在外任,何が起こるでしょう。
初期化する理由
PC13 にローレベルを出力させたいのですが、最初の行は理解しやすいです。
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
ただし、この文では GPIOC のみが使用されています。 GPIOC のクロックがオンになっているかどうかはチップに通知されません。また、GPIOC が使用されているかどうか、入力、出力、または再利用機能であるかどうかも通知されません。
したがって、モジュールの使用前に初期化が行われます。
モジュールはエンジニアリングディレクトリから見つかります
独自に作成したエントリ コードのみが使用されます。
#include "stm32f10x.h"
#include "led.h"
int main(void)
{
LED_Init();
while (1)
{
LED_On();
LED_Off();
LED_Toggle();
}
}
LED_Init() の声明 led.h,士热発信在 led.c開ける led.c、会議ビデオ小は入電影画像:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_Init(GPIOC, &gpio);
これは 2 つのコード層の関係です。モジュール自体が「PC13 の外部 LED を初期化したい」と決定し、標準ライブラリは「GPIOC クロックを開く方法、GPIOC を設定する方法」という一般的な機能を提供する責任を負います。stm32f10x_gpio.c 私はあなたの LED を知りませんし、あなたが小型車を作りたいのかも知りません。 GPIO のみを認識します。
第一步:時計を開けてください
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC クロック制御モジュールです。GPIOC ターゲットですENABLE 最初に GPIOC を GPIOA にすると、電気的老能能力が設定されますが、後で GPIOC を接続すると、パネルは「通信可能メッセージ」を介さずに自動的にデザインを理解します。
時計機能は、「この外部設定が完了した」ことではなく、「この外部設定が動作することを許可されていない」ことによって解決されます。これら 2 つの状態が混在することはありません。
第 2 ステップ: GPIO に動作方法を指示する
GPIO_InitTypeDef gpio;
gpio.GPIO_Pin = GPIO_Pin_13;
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
gpio.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &gpio);
この構成は GPIOC に次のように指示します。PC13 を使用し、それを出力として設定し、出力エッジ機能を 2MHz に設定します。GPIO_Init() 電気的に影響を与える GPIO モジュールの 1 つです。
1 つの入力を 1 回だけ変更して、出力を再度観察できます。
- 握り
GPIO_Pin_13改成GPIO_Pin_12,コードは通常どおり名線可能ですが、PC13 の接続 LED は変化しません。 - 握り
GPIO_Mode_Out_PP入力モードが変更されました。PC13 はアクティブではなくなりました。 - 握り
GPIO_Speed_2MHz改成GPIO_Speed_50MHz,LED は跟着变亮にはなりません;(後の全回線:手机里PC13出力時は 2 MHz のみ許可されます。この変更は仕様であり、明るさの変化を確認するためにのみ使用します。看完记回曗改GPIO_Speed_2MHz)) - 握り
GPIOC異なるポートを変更すると、オブジェクトの構成とオブジェクトの実際の動作が一致しない場合も、この現象は解消されます。
ボックスの入力が変化すると、ハードウェアの出力も変化します。ライブラリ関数内のレジスタコードを一行ずつ知る必要がないので、まずは「ハードウェアの動作に対応するパラメータ」の感覚を確立することができます。
第三步:初期化完了後、使用可能になります
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
GPIO_SetBits(GPIOC, GPIO_Pin_13);
GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13);
ResetBits 低レベル出力、SetBits ハイレベルを出力し、ReadInputDataBit 入力レベルの読み取り。 これらは使用される関数であり、初期化関数ではありません。
現在の実験では、外部 LED の長い脚は PC13、短い脚は床、高点が点灯します。GPIO_SetBits() ここの「开灯」に相当します。GPIO_ResetBits() 「ランプ」を発行しました。株式会社がこれ以上の目的で使用できないように設定できます。led.c で LED_On() 和 LED_Off()、技術は電気効果電気効果の上海の設計。
头文件和源文字了ダウンロード
自由写的上海电影纸には通常、次の一般的なエントリのみを含める必要があります。
#include "stm32f10x.h"
//keil5中右键可以快速填入
前処理のプロセスが定義されている USE_STDPERIPH_DRIVER、それで stm32f10x.h 引き続き含める stm32f10x_conf.h;それでも時間 stm32f10x_conf.h また以上完了 GPIO、RCC、TIM、USART などled.c 里只写 #include "stm32f10x.h" GPIO ファイルは失われません。これは安全性の向上のための最新技術です。
ソースファイルは、電気効果である。ソースファイルは、会議名とチャネル南から送信される。 led.c 1 つの GPIO レジスタ操作を再実装する必要はありません。必要なのは、入力全体を含め、パラメーターを準備して、標準ライブラリによって提供されるブラック ボックス インターフェイスを使用することだけです。.c ドキュメントが機能していません #include 一 .c 書類。
関数が宣言されていない場合、ドキュメントがチェックされ、プロジェクトが設定されます。 stm32f10x_gpio.c 就从第一行全線上读,先进口追一小段车一小段安全電影电影电影电影,就少了
最後に彼はこう言いました
タイマーには独自のクロック機能、時間基準構造の構成、およびスタートアップ機能があり、文字列にはウェーブ レート、データ ビット、および受信制御があり、I2C にはアドレス、速度、および応答があります。
標準の外刻の値は、ハンドル分位電影包成の黑電のブラックボックスを使用します。ハードウェア境界とブラック ボックスの入出力はまだ自分で見ることができます。
電影は一つだけLEDを点灯します。それまでは、RCC_APB2PeriphClockCmd、GPIO_Init 和 GPIO_ResetBits それはもはや空に現れる機能ではなく、同じモジュールを使用してマップ上で異なるステップを実行します。