STM32F103C8T6 は流水ランプを実現します

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. アドレスマッピング

  1. 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

おすすめ

転載: blog.csdn.net/qq_55894922/article/details/127224824