記事ディレクトリ
1. 実験原理
1. STM32F103C8T6 の概要
STM32F103C8T6 は、STMicroelectronics (ST) が発売した ARM Cortex-M コア STM32 シリーズをベースとした 32 ビット マイクロコントローラであり、ハードウェアは LQFP48 にパッケージ化されており、ST マイクロコントローラの STM32 シリーズに属します。プログラムメモリ容量は64KB、必要電圧は2V~3.6V、動作温度は-40℃~85℃です。
カーネル | コーテックス-M3 |
---|---|
閃光 | 64K×8ビット |
SRAM | 20K×8ビット |
GPIO | 37 個の GPIO、それぞれ PA0 ~ PA15、PB0 ~ PB15、PC13 ~ PC15、PD0 ~ PD1 |
ADC | 2 12bit ADC 合計 12 チャネル (外部チャネル: PA0 ~ PA7+PB0 ~ PB1、内部チャネル:) |
タイマー | 1. 4 つの 16 ビット タイマー/カウンター、それぞれ TIM1、TIM2、TM4 デッド ゾーン挿入付き TM1、PWM 制御モーターの生成によく使用されます |
通信シリアルポート | 2IIC、2SPI、3USART、1CAN |
2. アドレスマッピング
- M3 メモリ マッピング
LED ライト プログラムのマクロ定義は次のとおりです。
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define PERIPH_BASE ((uint32_t)0x40000000)
PERIPH_BASE ペリフェラル ベース アドレス: stm32 は 32 ビットであるため、マクロは 0x40000000 に展開され、uint32_t に変換されます。
APB2PERIPH_BASE バス ベース アドレス: マクロは PERIPH_BASE にオフセット アドレス 0x10000 を加えたものに展開されます。
2. レジスタのアドレス指定
- GPIOB ベース アドレス
GPIOB 関連のレジスタはすべて、0x4001 0C00 ~ 0x4001 0FFF の範囲内にあります。
- ポート入力レジスタのアドレス オフセット
格納データの場所: 0X40010C00+0X0x =
アドレス: GPIOC_BASE +0x0x
- データ
- アドレスマッピング
GPIO_TypeDef * GPIOx; //定义一个 GPIO_TypeDef 型结构体指针 GPIOx
GPIOx = GPIOA; //把指针地址设置为宏 GPIOA 地址
GPIOx->CRL = 0xffffffff; //通过指针访问并修改 GPIOA_CRL 寄存器
3. レジスタマッピング
-
アドレスが割り当てられた特定の関数でメモリ ユニットをエイリアスするプロセス (メモリ マッピングによって実装される) は、レジスタ マッピングと呼ばれます。
-
GPIOA->CRL=0x0000 0000, GPIOA の CRL レジスタが配置されているストレージ ユニットに 16 進数 0 が割り当てられていることを示します。これはメモリ レベルのマッピングであり、ペリフェラル
ベース アドレスは 0x40000000 にマッピングされます。上の図に。
#define PERIPH_BASE ((uint32_t)0x40000000)
ここで、ペリフェラルのベース アドレスは、APB2 バスの対応するペリフェラル領域に対して、アドレス オフセット 0x10000 だけオフセットされます。
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
ここで、APB2 ペリフェラル ベース アドレスは 0x0800 のアドレス オフセットによってオフセットされ、そのオフセットは GPIOA の対応する領域にオフセットされます。
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
4. GPIOポートの初期化設定
1. クロック構成
理由: stm32 は電力消費が強力で多くのことができますが、同時に電力消費が深刻になるため、この方法により電力消費が削減され、より長く使用できます。
クロック制御名は RCC と呼ばれ、AHB バスに属します。GPIOB は APB2 に属します。
GPIO 入力モード: 入力フローティング、入力プルアップ、入力プルダウン、アナログ入力;
出力モード: オープンドレイン出力、オープンドレイン多重化出力、プッシュプル出力、プッシュプル多重化出力。
2. 入出力モード
- 入力モード
フローティング入力モード:フローティング入力状態では、IO のレベル状態は完全に外部入力によって決まり、端子が停止している場合、ポートのレベル状態は不定になります。KEYキー認識が可能。
プルアップおよびプルダウン入力モード:内部にプルアップおよびプルダウン抵抗があり、外部回路が Low の場合、IO ポートはプルダウン モードに設定され、外部回路が Low の場合、IO ポートはプルダウン モードに設定されます。プルアップモードに設定されています。
アナログ入力モード:干渉を防ぐために内部 ADC 入力または DAC 出力として使用されます。 - 出力モード
プッシュプル出力モード:(最も一般的に使用される)
オープンドレイン出力モード:(一般的には使用されない)
プッシュプル、オープンドレイン多重化モード
3. 最大レートの設定
4.GPIOの初期化手順
- GPIOxポートのクロックを有効にする
- GPIOx ポートのどのビット、このビットの速度とモードを示します
- GPIOx 初期化関数を呼び出して初期化します。
- GPIO-SetBits 関数を呼び出して、対応するビットを設定します。
2. 原則
1. STM32 開発ボードには多くのレジスタが含まれており、水ランプの動作を実現するには、対応するピンを操作し、クロック イネーブル設定、ポート設定 (High または Low) レジスタ設定、およびポート出力レジスタ設定を実行する必要があります。対応するピン。
- クロックイネーブルを設定する
- 設定ポートの設定
- ポート出力レジスタの構成
- 書き込みプログラム
- 走る
2. 水ランプの動作用のピンは GPIO ポートにあります。AHBバスには RCC クロック制御が含まれており、GPIO は APB2 に属します。使用されるポートのリセットと時間制御は RCC
3 によって制御されます。レジスタ開始アドレス テーブル、RCC アドレス範囲のクエリ、制御されるレジスタは APB2 にあります。
4. ペリフェラル クロック イネーブル レジスタ、オフセットを 0x18、開始アドレス 0x4002 1000、レジスタ アドレスは 0x4002 1018 に
設定します。 5. マニュアル RCC_APB2ENR、ビット 3 は IOPBEN、名前は IO ポート B クロック イネーブルです。これが必要なものです。RCC_APB2ENR のビット 3 を 1 に割り当てると、GPIOB クロックがオンになります。
#define RCC_AP2ENR *((unsigned volatile int*)0x40021018) #时钟使能寄存器
RCC_AP2ENR|=1<<2;
6. ポート設定レジスタ (4 ビットごとにポートを設定)
- ピンを決める
- ポート構成下位レジスタ (CRL)オフセット アドレス 0x00
- ポート コンフィギュレーション上位レジスタ (CRH)オフセット アドレス 0x04
7. 対応するポート コンフィギュレータ GPIOA_CRL アドレスは、GPIOA のベース アドレス + 上位オフセットです。
プッシュプル出力を設定し、最大速度を 2Mhz に設定します。
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)
GPIOA_CRL=0x20000000; //PA7推挽输出,2Mhz
8. LED を点灯し、ロー レベルを出力するようにポート出力レジスタを設定します。アドレスのオフセットは 0x0C なので、このデータ レジスタのアドレスは0x4001 0C0Cとなり、8 番目のビットに 0 を書き込むだけです。デフォルトは 0 で、高電圧の割り当ては 1 です。
シフト動作:
#define GPIOA_ORD *((unsigned volatile int*)0x4001080C)
GPIOA_ORD|=1<<7; //设置初始灯为亮
9. 流水ランプを実現するには、ランプの数を増やし、遅延を追加するだけです。
三、ウォーターランプを実現するC言語
1. プロジェクトを作成します
2. STM32F103C8 開発ボードを選択します。
次のポップアップ ウィンドウが表示された場合は、選択せずに取り消し線を引いてください。
3. [Sources Group 1] を右クリックし、図に示す領域をクリックします。
4. c ファイルを追加し、main という名前を付けて、[追加] をクリックします。
5. 出力で [create hex file] を選択します。
6. 標準ライブラリのスタートアップ ファイルをプロジェクト パスにコピーします。
7. [Source Group 1] を右クリックし、下図の領域をクリックします。
8. コードを記述します
main.c に関数を記述します。
#define GPIOB_BASE 0x40010C00
#define GPIOC_BASE 0x40011000
#define GPIOA_BASE 0x40010800
#define RCC_APB2ENR (*(unsigned int *)0x40021018)
#define GPIOB_CRH (*(unsigned int *)0x40010C04)
#define GPIOC_CRH (*(unsigned int *)0x40011004)
#define GPIOA_CRL (*(unsigned int *)0x40010800)
#define GPIOB_ODR (*(unsigned int *)0x40010C0C)
#define GPIOC_ODR (*(unsigned int *)0x4001100C)
#define GPIOA_ODR (*(unsigned int *)0x4001080C)
void SystemInit(void);
void Delay_ms(volatile unsigned int);
void A_LED_LIGHT(void);
void B_LED_LIGHT(void);
void C_LED_LIGHT(void);
void Delay_ms( volatile unsigned int t)
{
unsigned int i;
while(t--)
for (i=0;i<800;i++);
}
void A_LED_LIGHT(){
GPIOA_ODR=0x0<<4; //PA4低电平
GPIOB_ODR=0x1<<9; //PB9高电平
GPIOC_ODR=0x1<<15; //PC15高电平
}
void B_LED_LIGHT(){
GPIOA_ODR=0x1<<4; //PA4高电平
GPIOB_ODR=0x0<<9; //PB9低电平
GPIOC_ODR=0x1<<15; //PC15高电平
}
void C_LED_LIGHT(){
GPIOA_ODR=0x1<<4; //PA4高电平
GPIOB_ODR=0x1<<9; //PB9高电平
GPIOC_ODR=0x0<<15; //PC15低电平
}
int main(){
int j=100;
// 开启时钟
RCC_APB2ENR |= (1<<3); // 开启 GPIOB 时钟
RCC_APB2ENR |= (1<<4); // 开启 GPIOC 时钟
RCC_APB2ENR |= (1<<2); // 开启 GPIOA 时钟
// 设置 GPIO 为推挽输出
GPIOB_CRH&= 0xffffff0f; //设置位 清零
GPIOB_CRH|=0x00000020; //PB9推挽输出
GPIOC_CRH &= 0x0fffffff; //设置位 清零
GPIOC_CRH|=0x30000000; //PC15推挽输出
GPIOA_CRL &= 0xfff0ffff; //设置位 清零
GPIOA_CRL|=0x00010000; //PA4推挽输出
// 3个LED初始化为不亮(即高点位)
GPIOB_ODR |= (1<<9);
GPIOC_ODR |= (1<<15);
GPIOA_ODR |= (1<<4);
while(j){
B_LED_LIGHT();
Delay_ms(1000000);
C_LED_LIGHT();
Delay_ms(1000000);
A_LED_LIGHT();
Delay_ms(1000000);
}
}
void SystemInit(){
}
9. プログラムをコンパイルする
10. 回路接続
設計したプログラムに従って回路を接続します。
USB to TTL モジュールおよび stm32f103c8t6 接続の場合:
GND — GND
3v3 — 3v3
TXD — A10
RXD — A9
合計回路:
赤—B9
緑—C15
黄—A4
図に示すように:
コンピューターに接続し、mcuisp を開き、HEX ファイルを stm32f103c8t6 にアップロードします:
書き込み操作の結果:
LEDランプ
4. まとめ
STM32F103 シリーズ チップのアドレス マッピングとレジスタ マッピングの原理を学習して理解し、GPIO ポート初期化設定の 3 つのステップ (クロック構成、入出力モード設定、最大レート設定) を理解し、STM32F103C8T6 を通じてシンプルなウォーター ランプを完成させます。
5. 参考文献
https://blog.csdn.net/qq_47281915/article/details/120812867
https://blog.csdn.net/weixin_47554309/article/details/120810913
https://blog.csdn.net/geek_monkey/article/details/ 86293880
https://blog.csdn.net/geek_monkey/article/details/86291377
https://blog.csdn.net/wangxuznb/article/details/50669333
https://blog.csdn.net/FRIGIDWINTER/article/details /106826511