Cortex-A7 核 LED ランプ実験 -- STM32MP157

実験の目的: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

おすすめ

転載: blog.csdn.net/MaGuangming001/article/details/132503387