実験の目的:LED1/LED2/LED3の3つのライトの動作を実現すること
1. 回路図を解析する
1. アイデア
回路図を分析すると、次のことがわかります。
ネット番号 == ピン番号
LED1 == PE10
LED2 ===> PF10
LED3 ===> PE8
2.動作原理:
1を書き込む: LEDライトがオン、0を書き込む: LEDライトがオフ
次に、ブロック図
1. A7 コアと GPIO コントローラー: 内部バス通信を通じて、バスが AHB4 バスであることをチップのマニュアルで確認してください。
2、(コア外部の特殊機能レジスタ):チップメーカーが工場出荷時にチップ内部の一端のアドレス空間に固定され、アドレスが固定されます。
3. A7 コアは、アセンブリ命令 LDR/STR を通じて特殊機能デバイスを制御します。
4. ブロック図に従って分析します。
RCC の章 == GPIOE および GPIOF グループ コントローラーを有効にする
GPIO の章 == 1) GPIO ピンの初期化、2) ピン出力の High および Low レベル
3、RCCの章を分析する
1. バス接続を決定する
チップのマニュアルを確認してください: GPIO は AHB4 バスを介して RCC に接続されています
2. ベースアドレス
GPIOF:0x50007000
GPIOE:0x50006000
RCC: 0x50000000
3. RCC_MP_AHB4ENSETR レジスタを分析する
機能: GPIO グループレジスタを有効にする
アドレス: 0x50000000 + 0xA28 = 0x50000A28
疑似コード: RCC_MP_AHB4ENSETR[4] = 1 === GPIOE
RCC_MP_AHB4ENSETR [5] = 1 === GPIOF
4 番目に、GPIO の章を分析します。
1。概要
2. ブロック図
1. GPIOx_MODER レジスタを分析する
機能: GPIO ピン モード (入力、出力、多重化、シミュレーション) を設定して、この実験でハイ レベルとロー レベルを出力し、出力を選択します。
アドレス: 0x50006000 + 0x00 = 0x50006000
0x50007000 + 0x00 = 0x50007000
疑似コード: GPIOE_MODER[21:20] = 01 ==== LED1
GPIOF_MODER [21:20] = 01 ==== LED2
GPIOE_MODER [17:16] = 01 ==== LED3
2. GPIOx_OTYPER レジスタを分析する
プッシュプル出力タイプ:PMOS管とNMOS管の両方が動作可能
オープンドレイン出力タイプ:NMOS真空管のみ動作可能
機能: GPIO ピンの出力タイプをプッシュプル出力に設定します。
アドレス: 0x50006000 + 0x04 = 0x50006004
0x50007000 + 0x04 = 0x50007004
疑似コード: GPIOE_OTYPER[10] = 0 ==== LED1
GPIOF_OTYPER [10] = 0 ==== LED2
GPIOE_OTYPER [8] = 01 ==== LED3
3. GPIOx_OSPEEDR レジスタを分析する
機能: GPIO ピンの出力レートを設定します (低速、中速、高速、高速)。
アドレス: 0x50006000 + 0x08 = 0x50006008
0x50007000 + 0x08 = 0x50007008
疑似コード: GPIOE_OSPEEDR[21:20] = 01 ==== LED1
GPIOF_OSPEEDR [21:20] = 01 ==== LED2
GPIOE_OSPEEDR [17:16] = 01 ==== LED3
4. GPIOx_PUPDR レジスタを分析する
機能: GPIO ピンにプルアップ抵抗とプルダウン抵抗 (プルアップ抵抗とプルダウン抵抗、プルアップ、プルダウン、予約) が必要かどうかを設定します。この実験では禁止されています。
アドレス: 0x50006000 + 0x0C = 0x5000600C
0x50007000 + 0x0C = 0x5000700C
疑似コード: GPIOE_PUPDR[21:20] = 00 ====LED1
GPIOF_PUPDR [21:20] = 00 ====LED2
GPIOE_PUPDR [17:16] = 00 ====LED3
5. GPIOx_ODR レジスタを分析する
機能: 端子出力のハイ/ローレベルを設定 1 を書き込む: 出力がハイレベル、LED が点灯 0 を書き込む: 出力がローレベル、LED が消灯
アドレス: 0x50006000 + 0x14 = 0x50006014
0x50007000 + 0x14 = 0x50007014
疑似コード: GPIOE_ODR[10] = 1 / 0 ====LED1
GPIOF_ODR [10] = 1 / 0 ====LED2
GPIOE_ODR [8] = 1 / 0 ====LED3
五、レジスター包装
1. シングルレジスタパッケージ
1、在汇编语言中0x50000A28代表一块地址空间,但是在C语言中表示十六进制数,在C语言中,如何将0x50000A28表示一块地址空间的
(volatile unsigned int*)0x50000A28 ====> ldr r0,=0x50000A28
2、如何取出0x50000A28这块地址空间中的内容
(*(volatile unsigned int*)0x50000A28) ====> ldr r1,[r0]
3、将0x50000A28这块地址空间中的第4位进行置1,保证其他位不变
(*(volatile unsigned int*)0x50000A28) = (*(volatile unsigned int*)0x50000A28) | (0x1 << 4); ====> orr r1,r1,#(0x1 << 4) str r1,[r0]
4、用宏定义如何对寄存器进行封装
#define RCC_MP_AHB4_ENSETR (*(volatile unsigned int*)0x50000A28)
RCC_MP_AHB4_ENSETR = RCC_MP_AHB4_ENSETR | (0x1 << 4);
RCC_MP_AHB4_ENSETR |= (0x1 << 4);
5、将GPIOE/GPIOF寄存器进行封装
#define GPIOE_MODER (*(volatile unsigned int*)0x50006000)
#define GPIOE_OTYPER (*(volatile unsigned int*)0x50006004)
#define GPIOE_OSPEEDR (*(volatile unsigned int*)0x50006008)
#define GPIOE_PUPDR (*(volatile unsigned int*)0x5000600C)
#define GPIOE_ODR (*(volatile unsigned int*)0x50006014)
2. 構造体パッケージレジスタ
typedef struct{
volatile unsigned int MODER; //MODER
volatile unsigned int OTYPER; //OTYPER
volatile unsigned int OOSPEEDR; //OSPEEDR
volatile unsigned int PUPDR; //PUPDR
volatile unsigned int IDR; //IDR
volatile unsigned int ODR; //ODR
}gpio_t;
#define GPIOE ((gpio_t*)0x50006000) 注释:GPIOE ===> 0x50006000
#define GPIOF ((gpio_t*)0x50007000) 注释:GPIOF ===> 0x50007000
访问结构体成员:GPIOE->MODER