按键抬起时,PF9引脚输入高电平,按键按下时,PF9引脚输入低电平。
- KEY1--》PF9--》EXTI9---》EXTI9对应的输入事件的编号,需要查看数据手册的21.3章节的表118,如下图所示,
- 可知EXTI9对应的输入事件的编号位输入事件9号。
-
- EXTI_FTSR1[9]写1,使能下降沿触发中断。及当有下降沿时就认为是一个中断信号。
- KEY1--》PF9--》EXTI9---》EXTI9对应的输入事件的编号,需要查看数据手册的21.3章节的表118,
- 可知EXTI9对应的输入事件的编号位输入事件9号。
-
- EXTI_FPR1[9]写1,清除下降沿中断挂起标志位。
- EXTI中总共有16个EXTI,从EXTI0-EXTI9,EXTI_EXTICR寄存器的每8位管理一个EXTI外设,
- 几个寄存器最多管理4个EXTI,因此需要4个寄存器工程管理16个EXTI。
-
- KEY1--> PF9 ---> EXTI9 ---》EXTI_EXTICR3[15:8] ---> 写0x5,将PF9连接到EXTI9上
- KEY1--》PF9--》EXTI9---》EXTI9对应的输入事件的编号,需要查看数据手册的21.3章节的表118,
- 可知EXTI9对应的输入事件的编号为输入事件9号。
-
- EXTI_C1IMR1[9]写1,不屏蔽中断信号。
GICD_CTLR : GICD层全局使能寄存器
GICD_ISENABLER : GICD层中断设置使能寄存器
GICD_ICPENDR :GICD层中断清除挂起寄存器
GICD_IPRIORITYR : GICD层中断优先级设置寄存器
GICD_ITARGETSR : GICD层中断目标分配寄存器
GICC_CTLR : GICC层全局使能寄存器
GICC_PMR : GICC层优先级屏蔽寄存器
GICC_IAR : GICC层中断应答寄存器
GICC_EOIR :GICC层中断处理结束寄存器
每个中断外设都有一个唯一的中断号,通过查看芯片手册的21.2章节的表117,如下图所示:
KEY1 ---》 PF9 ---》 EXTI9 ----》中断号:99
- 前提:KEY1 ---》 PF9 ---》 EXTI9 ----》中断号:99
-
- GICD_ISENABLER : GICD层中断设置使能寄存器
-
- GICD_ISENABLER寄存器的每1位管理一个中断号,一个寄存器最多管理32个中断号。
- GIC控制器支持16个SGIs,16个PPIs, 256个SPIs, GIC控制器总共支持288个中断号,
- GICD_ISENABLER寄存器要想管理288个中断号,最少需要9(288/32)个寄存器。
-
- 99号中断对应GICD_ISENABLER寄存器的哪一个,哪一位?
- 99 / 32 = 3 ...... 3
- 商对应着寄存器的编号,余数对应操作寄存器的位。
-
- GICD_ISENABLER3[3] 写1, 使能99号中断
- 前提:KEY1 ---》 PF9 ---》 EXTI9 ----》中断号:99
-
- GICD_ICPENDR :GICD层中断清除挂起寄存器
-
- GICD_ICPENDR寄存器的每1位管理一个中断号,一个寄存器最多管理32个中断号。
- GIC控制器支持16个SGIs,16个PPIs, 256个SPIs, GIC控制器总共支持288个中断号,
- GICD_ICPENDR寄存器要想管理288个中断号,最少需要9(288/32)个寄存器。
-
- 99号中断对应GICD_ICPENDR寄存器的哪一个,哪一位?
- 99 / 32 = 3 ...... 3
- 商对应着寄存器的编号,余数对应操作寄存器的位。
-
- GICD_ICPENDR3[3]
- 写1, 清除99号中断挂起标志位
- 写0,没有影响
-
- 读0:表示99号中断没有发生
- 读1:表示99号中断发生
- 前提:KEY1 ---》 PF9 ---》 EXTI9 ----》中断号:99
-
- GICD_IPRIORITYR : GICD层中断优先级设置寄存器
-
- GICD_IPRIORITYR寄存器的每8(5位有效位+3位保留位)位管理一个中断号,一个寄存器最多管理4个中断号。
- GIC控制器支持16个SGIs,16个PPIs, 256个SPIs, GIC控制器总共支持288个中断号,
- GICD_IPRIORITYR寄存器要想管理288个中断号,最少需要72(288/4)个寄存器。
-
- 99号中断对应GICD_IPRIORITYR寄存器的哪一个,哪5位?
- 99 / 4 = 24 ...... 3
- 商对应着寄存器的编号,(余数*8+3) 对应操作寄存器的最低位。
-
- GICD_IPRIORITYR24[31:27] 设置中断的优先等级,数越小,优先级越高
-
- 前提:KEY1 ---》 PF9 ---》 EXTI9 ----》中断号:99
-
- GICD_ITARGETSR : GICD层中断目标分配寄存器
-
- GICD_ITARGETSR寄存器的每8(6位保留位+2位有效位)位管理一个中断号,一个寄存器最多管理4个中断号。
- GIC控制器支持16个SGIs,16个PPIs, 256个SPIs, GIC控制器总共支持288个中断号,
- GICD_ITARGETSR寄存器要想管理288个中断号,最少需要72(288/4)个寄存器。
-
- 99号中断对应GICD_ITARGETSR寄存器的哪一个,哪2位?
- 99 / 4 = 24 ...... 3
- 商对应着寄存器的编号,(余数*8) 对应操作寄存器的最低位。
-
- GICD_ITARGETSR24[25:24] 分配中断到不同的CPU接口中
-
- 写01 : 分配给CPU接口0
- 写10 : 分配给CPU接口1
- 写11 : 分配给CPU接口0和CPU接口1
-
- 这个寄存器的每1位管理一个CPU核,STM32MP1处理器有两个CPU核,因此需要两位即可
-
- 如果一个中断信号的优先级值高于GICC_PMR寄存器字段中的值,则对应的中断将会被转发到CPU中,
- 中断信号的优先级通过GICD_IPRIORITYR寄存器进行配置。
-
-
- 假设中断信号的优先级为10, GICC_PMR[7:3]为20, 此中断信号被转发到CPU中。
- 假设中断信号的优先级为20, GICC_PMR[7:3]为10, 此中断信号不被转发到CPU中。
- #include "../include/interrupt.h"
-
- void hal_gpio_IT_init(gpio_t *gpios, unsigned int pins)
- {
- // 1. 使用GPIOF控制器的时钟
- RCC->MP_AHB4ENSETR = 0xFF;
- // 2. 设置PF9引脚为输入的功能
- gpios->MODER &= ~(0x3 << (pins * 2));
- }
- // KEY1->PF9->EXTI9-->输入事件编号为:9
- void hal_exti_IT_init(input_event_t input_event,
- gpio_exti_t gpio_exti, trigger_t trigger)
- {
- // 1. 设置PF9连接到EXTI9上 EXTI_EXTICR3[15:8] = 0x5
- switch (input_event / 4)
- {
- case 0:
- EXTI->EXTICR1 &= ~(0xFF << (input_event % 4 * 8));
- EXTI->EXTICR1 |= (gpio_exti << (input_event % 4 * 8));
- break;
- case 1:
- EXTI->EXTICR2 &= ~(0xFF << (input_event % 4 * 8));
- EXTI->EXTICR2 |= (gpio_exti << (input_event % 4 * 8));
- break;
- case 2:
- EXTI->EXTICR3 &= ~(0xFF << (input_event % 4 * 8));
- EXTI->EXTICR3 |= (gpio_exti << (input_event % 4 * 8));
- break;
- case 3:
- EXTI->EXTICR4 &= ~(0xFF << (input_event % 4 * 8));
- EXTI->EXTICR4 |= (gpio_exti << (input_event % 4 * 8));
- break;
- }
- // 2. 设置KEY1按键为下降沿检测 EXTI_FTSR1[9] = 0x1
- if (trigger != RISING_TRIGGER)
- {
- EXTI->FTSR1 |= (0x1 << input_event);
- }
- else
- {
- EXTI->RTSR1 |= (0x1 << input_event);
- }
- // 3. 使能EXTI9中断 EXTI_C1IMR1[9] = 0x1
- EXTI->C1IMR1 |= (0x1 << input_event);
- }
- // KEY1->PF9->EXTI9-->中断号为99
- void hal_gic_IT_init(unsigned int it_id, unsigned int pri)
- {
- // 1. 设置GICD层的中断使能 GICD_ISENABLER3[3] = 0x1
- GICD->ISENABLER[it_id / 32] |= (0x1 << (it_id % 32));
- // 2. 设置GICD层的中断优先级 GICD_IPRIORITYR24[31:27] = 自己定义 范围0-31
- GICD->IPRIORITYR[it_id / 4] &= ~(0x1F << (it_id % 4 * 8 + 3));
- GICD->IPRIORITYR[it_id / 4] |= (pri << (it_id % 4 * 8 + 3));
- // 3. 设置GICD层中断目标分配 GICD_ITARGETSR24[25:24] = 0x1
- GICD->ITARGETSR[it_id / 4] &= ~(0x3 << (it_id % 4 * 8));
- GICD->ITARGETSR[it_id / 4] |= (0x3 << (it_id % 4 * 8));
- // 4. 设置GICD层全局中断使能 GICD_CTLR[0] = 0x1
- GICD->CTRL |= (0x1 << 0);
- // 5. 设置GICC层中断优先级屏蔽 GICC_PMR[7:3] = 0x1F 自己也可以给其他值
- GICC->PMR |= (0x1F << 3);
- // 6. 设置GICC层全局中断使能 GICC_CTLR[0] = 0x1
- GICC->CTRL |= (0x1 << 0);
- }
-
- void hal_clear_exti_IT(input_event_t input_event, trigger_t trigger)
- {
- if (trigger != RISING_TRIGGER)
- {
- EXTI->FPR1 |= (0x1 << input_event);
- }
- else
- {
- EXTI->RPR1 |= (0x1 << input_event);
- }
- }
-
- void hal_clear_gic_IT(unsigned int it_id)
- {
- GICD->ICPENDR[it_id / 32] |= (0x1 << (it_id % 32));
- }
- #ifndef __INTERRUPT_H__
- #define __INTERRUPT_H__
-
- #include "stm32mp1xx_gpio.h"
- #include "stm32mp1xx_rcc.h"
- #include "stm32mp1xx_exti.h"
- #include "stm32mp1xx_gic.h"
- #include "gpio.h"
- typedef enum
- {
- INPUT_ENENT_0 = 0,
- INPUT_ENENT_1,
- INPUT_ENENT_2,
- INPUT_ENENT_3,
- INPUT_ENENT_4,
- INPUT_ENENT_5,
- INPUT_ENENT_6,
- INPUT_ENENT_7,
- INPUT_ENENT_8,
- INPUT_ENENT_9,
- INPUT_ENENT_10,
- INPUT_ENENT_11,
- INPUT_ENENT_12,
- INPUT_ENENT_13,
- INPUT_ENENT_14,
- INPUT_ENENT_15,
- } input_event_t;
-
- typedef enum
- {
- RISING_TRIGGER = 0,
- FALLING_TRIGGER,
- } trigger_t;
- typedef enum
- {
- GPIOA_EXTI = 0,
- GPIOB_EXTI,
- GPIOC_EXTI,
- GPIOD_EXTI,
- GPIOE_EXTI,
- GPIOF_EXTI,
- GPIOG_EXTI,
- GPIOH_EXTI,
- GPIOI_EXTI,
- GPIOJ_EXTI,
- } gpio_exti_t;
-
- void hal_gpio_IT_init(gpio_t *gpios, unsigned int pins);
-
- void hal_exti_IT_init(input_event_t input_event,
- gpio_exti_t gpio_exti, trigger_t trigger);
-
- void hal_gic_IT_init(unsigned int it_id, unsigned int pri);
-
- void hal_clear_exti_IT(input_event_t input_event, trigger_t trigger);
-
- void hal_clear_gic_IT(unsigned int it_id);
- #endif
- #ifndef __GPIO_H__
- #define __GPIO_H__
- #include "stm32mp1xx_gpio.h"
-
- // 1. 封装RCC_MP_AHB4ENSETR寄存器,封装GPIOE,GPIOF寄存器
- #define RCC_MP_AHB4ENSETR (*(volatile unsigned int *)0x50000A28)
-
- // 2. 封装LED灯控制的函数
- #define GPIO_PIN_0 0U
- #define GPIO_PIN_1 1U
- #define GPIO_PIN_2 2U
- #define GPIO_PIN_3 3U
- #define GPIO_PIN_4 4U
- #define GPIO_PIN_5 5U
- #define GPIO_PIN_6 6U
- #define GPIO_PIN_7 7U
- #define GPIO_PIN_8 8U
- #define GPIO_PIN_9 9U
- #define GPIO_PIN_10 10U
- #define GPIO_PIN_11 11U
- #define GPIO_PIN_12 12U
- #define GPIO_PIN_13 13U
- #define GPIO_PIN_14 14U
- #define GPIO_PIN_15 15U
- typedef enum
- {
- GPIO_INPUT = 0,
- GPIO_OUTPUT,
- GPIO_AF,
- GPIO_ANALOG,
- } gpio_mode_t; // gpio引脚模式的枚举类型
-
- typedef enum
- {
- GPIO_PP = 0,
- GPIO_OD,
- } gpio_type_t; // gpio引脚的类型
-
- typedef enum
- {
- GPIO_LOW_SPEED = 0,
- GPIO_MEDIUM_SPEED,
- GPIO_HIGH_SPEED,
- GPIO_VERY_HIGH_SPEED,
- } gpio_speed_t; // gpio引脚的速度
-
- typedef enum
- {
- GPIO_NO_PUPD = 0,
- GPIO_UP,
- GPIO_DOWN,
- } gpio_pupd_t;
-
- typedef enum
- {
- GPIO_RESET = 0,
- GPIO_SET,
- } gpio_statues_t;
-
- typedef struct
- {
- unsigned int pins; // 哪个引脚
- gpio_mode_t mode; // 引脚的模式
- gpio_type_t type; // 引脚的类型
- gpio_speed_t speed; // 引脚的速度
- gpio_pupd_t pupd; // 引脚的上拉和下拉
- } gpio_init_t; // gpio引脚初始化的结构体
-
- /*
- 功能:GPIO引脚的初始化
- 参数:
- gpios : 哪个组的gpio引脚
- gpio_init : 引脚初始化的结构体
- */
- void hal_gpio_init(gpio_t *gpios, gpio_init_t *gpio_init);
- /*
- 功能:写gpio引脚的状态函数
- 参数:
- gpios : 哪个组的gpio引脚
- pins : 哪个引脚
- statues : 引脚的状态
- */
- void hal_gpio_write(gpio_t *gpios, unsigned int pins, gpio_statues_t statues);
-
- /*
- 功能:读gpio引脚状态的函数
- 参数:
- gpios : 哪个组的gpio引脚
- pins : 哪个引脚
- 返回值:
- statues : 引脚的状态
- */
- gpio_statues_t hal_gpio_read(gpio_t *gpios, unsigned int pins);
-
- void hal_gpio_toggle(gpio_t *gpios, unsigned int pins);
- #endif
- #ifndef __STM32MP1xx_GPIO_H__
- #define __STM32MP1xx_GPIO_H__
-
- typedef struct {
- volatile unsigned int MODER; // 0x00
- volatile unsigned int OTYPER; // 0x04
- volatile unsigned int OSPEEDR; // 0x08
- volatile unsigned int PUPDR; // 0x0C
- volatile unsigned int IDR; // 0x10
- volatile unsigned int ODR; // 0x14
- volatile unsigned int BSRR; // 0x18
- volatile unsigned int LCKR; // 0x1C
- volatile unsigned int AFRL; // 0x20
- volatile unsigned int AFRH; // 0x24
- volatile unsigned int BRR; // 0x28
- volatile unsigned int res;
- volatile unsigned int SECCFGR; // 0x30
-
- }gpio_t;
-
- #define GPIOA ((gpio_t *)0x50002000)
- #define GPIOB ((gpio_t *)0x50003000)
- #define GPIOC ((gpio_t *)0x50004000)
- #define GPIOD ((gpio_t *)0x50005000)
- #define GPIOE ((gpio_t *)0x50006000)
- #define GPIOF ((gpio_t *)0x50007000)
- #define GPIOG ((gpio_t *)0x50008000)
- #define GPIOH ((gpio_t *)0x50009000)
- #define GPIOI ((gpio_t *)0x5000A000)
- #define GPIOJ ((gpio_t *)0x5000B000)
- #define GPIOK ((gpio_t *)0x5000C000)
- #define GPIOZ ((gpio_t *)0x54004000)
-
-
- #endif // __STM32MP1xx_GPIO_H__
- #ifndef __STM32MP1XX_RCC_H__
- #define __STM32MP1XX_RCC_H__
-
- typedef struct {
- volatile unsigned int TZCR; // 0x000
- volatile unsigned int res1[2]; // 0x004-0x008
- volatile unsigned int OCENSETR; // 0x00C
- volatile unsigned int OCENCLRR; // 0x010
- volatile unsigned int res2[1]; // 0x014
- volatile unsigned int HSICFGR; // 0x018
- volatile unsigned int CSICFGR; // 0x01C
- volatile unsigned int MPCKSELR; // 0x020
- volatile unsigned int ASSCKSELR; // 0x024
- volatile unsigned int PCK12SELR; // 0x028
- volatile unsigned int MPCKDIVR; // 0x02C
- volatile unsigned int AXIDIVR; // 0x030
- volatile unsigned int res3[2];
- volatile unsigned int APB4DIVR; // 0x03C
- volatile unsigned int APB5DIVR; // 0x040
- volatile unsigned int RTCDIVR; // 0x044
- volatile unsigned int MSSCKSELR; // 0x048
- volatile unsigned int res4[13];
- volatile unsigned int PLL1CR; // 0x080
- volatile unsigned int PLL1CFGR1; // 0x084
- volatile unsigned int PLL1CFGR2; // 0x088
- volatile unsigned int PLL1FRACR; // 0x08C
- volatile unsigned int PLL1CSGR; // 0x090
- volatile unsigned int PLL2CR; // 0x094
- volatile unsigned int PLL2CFGR1; // 0x098
- volatile unsigned int PLL2CFGR2; // 0x09C
- volatile unsigned int PLL2FRACR; // 0x0A0
- volatile unsigned int PLL2CSGR; // 0x0A4
- volatile unsigned int res5[6];
- volatile unsigned int I2C46CKSELR; // 0x0C0
- volatile unsigned int SPI6CKSELR; // 0x0C4
- volatile unsigned int UART1CKSELR; // 0x0C8
- volatile unsigned int RNG1CKSELR; // 0x0CC
- volatile unsigned int CPERCKSELR; // 0x0D0
- volatile unsigned int STGENCKSELR; // 0x0D4
- volatile unsigned int DDRITFCR; // 0x0D8
- volatile unsigned int res6[9];
- volatile unsigned int MP_BOOTCR; // 0x100
- volatile unsigned int MP_SREQSETR; // 0x104
- volatile unsigned int MP_SREQCLRR; // 0x108
- volatile unsigned int MP_GCR; // 0x10C
- volatile unsigned int MP_APRSTCR; // 0x110
- volatile unsigned int MP_APRSTSR; // 0x114
- volatile unsigned int res7[10];
- volatile unsigned int BDCR; // 0x140
- volatile unsigned int RDLSICR; // 0x144
- volatile unsigned int res8[14];
- volatile unsigned int APB4RSTSETR; // 0x180
- volatile unsigned int APB4RSTCLRR; // 0x184
- volatile unsigned int APB5RSTSETR; // 0x188
- volatile unsigned int APB5RSTCLRR; // 0x18C
- volatile unsigned int AHB5RSTSETR; // 0x190
- volatile unsigned int AHB5RSTCLRR; // 0x194
- volatile unsigned int AHB6RSTSETR; // 0x198
- volatile unsigned int AHB6RSTCLRR; // 0x19C
- volatile unsigned int TZAHB6RSTSELR;// 0x1A0
- volatile unsigned int TZAHB6RSTCLRR;// 0x1A4
- volatile unsigned int res9[22];
- volatile unsigned int MP_APB4ENSETR;// 0x200
- volatile unsigned int MP_APB4ENCLRR;// 0x204
- volatile unsigned int MP_APB5ENSETR;// 0x208
- volatile unsigned int MP_APB5ENCLRR;// 0x20C
- volatile unsigned int MP_AHB5ENSETR;// 0x210
- volatile unsigned int MP_AHB5ENCLRR;// 0x214
- volatile unsigned int MP_AHB6ENSETR;// 0x218
- volatile unsigned int MP_AHB6ENCLRR;// 0x21C
- volatile unsigned int MP_TZAHB6ENSELR;// 0x220
- volatile unsigned int MP_TZAHB6ENCLRR;// 0x224
- volatile unsigned int res10[22];
- volatile unsigned int MC_APB4ENSETR; // 0x280
- volatile unsigned int MC_APB4ENCLRR; // 0x284
- volatile unsigned int MC_APB5ENSETR; // 0x288
- volatile unsigned int MC_APB5ENCLRR; // 0x28C
- volatile unsigned int MC_AHB5ENSETR; // 0x290
- volatile unsigned int MC_AHB5ENCLRR; // 0x294
- volatile unsigned int MC_AHB6ENSETR; // 0x298
- volatile unsigned int MC_AHB6ENCLRR; // 0x29C
- volatile unsigned int res11[24];
- volatile unsigned int MP_APB4LPENSETR; // 0x300
- volatile unsigned int MP_APB4LPENCLRR; // 0x304
- volatile unsigned int MP_APB5LPENSETR; // 0x308
- volatile unsigned int MP_APB5LPENCLRR; // 0x30C
- volatile unsigned int MP_AHB5LPENSETR; // 0x310
- volatile unsigned int MP_AHB5LPENCLRR; // 0x314
- volatile unsigned int MP_AHB6LPENSETR; // 0x318
- volatile unsigned int MP_AHB6LPENCLRR; // 0x31C
- volatile unsigned int MP_TZAHB6LPENSETR; // 0x320
- volatile unsigned int MP_TZAHB6LPENCLRR; // 0x324
- volatile unsigned int res12[22];
- volatile unsigned int MC_APB4LPENSETR; // 0x380
- volatile unsigned int MC_APB4LPENCLRR; // 0x384
- volatile unsigned int MC_APB5LPENSETR; // 0x388
- volatile unsigned int MC_APB5LPENCLRR; // 0x38C
- volatile unsigned int MC_AHB5LPENSETR; // 0x390
- volatile unsigned int MC_AHB5LPENCLRR; // 0x394
- volatile unsigned int MC_AHB6LPENSETR; // 0x398
- volatile unsigned int MC_AHB6LPENCLRR; // 0x39C
- volatile unsigned int res13[24];
- volatile unsigned int BR_RSTSCLRR; // 0x400
- volatile unsigned int MP_GRSTCSETR; // 0x404
- volatile unsigned int MP_RSTSR; // 0x408
- volatile unsigned int MP_IWDGFZSETR; // 0x40C
- volatile unsigned int MP_IWDGFZCLRR; // 0x410
- volatile unsigned int MP_CIER; // 0x414
- volatile unsigned int MP_CIFR; // 0x418
- volatile unsigned int PWRLPDLYCR; // 0x41C
- volatile unsigned int MP_RSTSS; // 0x420
- volatile unsigned int res14[247];
- volatile unsigned int MCO1CFGR; // 0x800
- volatile unsigned int MCO2CFGR; // 0x804
- volatile unsigned int OCRDYR; // 0x808
- volatile unsigned int DBGCFGR; // 0x80C
- volatile unsigned int res15[4];
- volatile unsigned int RCK3SELR; // 0x820
- volatile unsigned int RCK4SELR; // 0x824
- volatile unsigned int TIMG1PRER; // 0x828
- volatile unsigned int TIMG2PRER; // 0x82C
- volatile unsigned int MCUDIVR; // 0x830
- volatile unsigned int APB1DIVR; // 0x834
- volatile unsigned int APB2DIVR; // 0x838
- volatile unsigned int APB3DIVR; // 0x83C
- volatile unsigned int res16[16];
- volatile unsigned int PLL3CR; // 0x880
- volatile unsigned int PLL3CFGR1; // 0x884
- volatile unsigned int PLL3CFGR2; // 0x888
- volatile unsigned int PLL3FRACR; // 0x88C
- volatile unsigned int PLL3CSGR; // 0x890
- volatile unsigned int PLL4CR; // 0x894
- volatile unsigned int PLL4CFGR1; // 0x898
- volatile unsigned int PLL4CFGR2; // 0x89C
- volatile unsigned int PLL4FRACR; // 0x8A0
- volatile unsigned int PLL4CSGR; // 0x8A4
- volatile unsigned int res17[6];
- volatile unsigned int I2C12CKSELR; // 0x8C0
- volatile unsigned int I2C35CKSELR; // 0x8C4
- volatile unsigned int SAI1CKSELR; // 0x8C8
- volatile unsigned int SAI2CKSELR; // 0x8CC
- volatile unsigned int SAI3CKSELR; // 0x8D0
- volatile unsigned int SAI4CKSELR; // 0x8D4
- volatile unsigned int SPI2S1CKSELR; // 0x8D8
- volatile unsigned int SPI2S23CKSELR; // 0x8DC
- volatile unsigned int SPI45CKSELR; // 0x8E0
- volatile unsigned int UART6CKSELR; // 0x8E4
- volatile unsigned int UART24CKSELR; // 0x8E8
- volatile unsigned int UART35CKSELR; // 0x8EC
- volatile unsigned int UART78CKSELR; // 0x8F0
- volatile unsigned int SDMMC12CKSELR; // 0x8F4
- volatile unsigned int SDMMC3CKSELR; // 0x8F8
- volatile unsigned int ETHCKSELR; // 0x8FC
- volatile unsigned int QSPICKSELR; // 0x900
- volatile unsigned int FMCCKSELR; // 0x904
- volatile unsigned int res18[1];
- volatile unsigned int FDCANCKSELR; // 0x90C
- volatile unsigned int res19[1];
- volatile unsigned int SPDIFCKSELR; // 0x914
- volatile unsigned int CECCKSELR; // 0x918
- volatile unsigned int USBCKSELR; // 0x91C
- volatile unsigned int RNG2CKSELR; // 0x920
- volatile unsigned int DSICKSELR; // 0x924
- volatile unsigned int ADCCKSELR; // 0x928
- volatile unsigned int LPTIM45CKSELR; // 0x92C
- volatile unsigned int LPTIM23CKSELR; // 0x930
- volatile unsigned int LPTIM1CKSELR; // 0x934
- volatile unsigned int res20[18];
- volatile unsigned int APB1RSTSETR; // 0x980
- volatile unsigned int APB1RSTCLRR; // 0x984
- volatile unsigned int APB2RSTSETR; // 0x988
- volatile unsigned int APB2RSTCLRR; // 0x98C
- volatile unsigned int APB3RSTSETR; // 0x990
- volatile unsigned int APB3RSTCLRR; // 0x994
- volatile unsigned int AHB2RSTSETR; // 0x998
- volatile unsigned int AHB2RSTCLRR; // 0x99C
- volatile unsigned int AHB3RSTSETR; // 0x9A0
- volatile unsigned int AHB3RSTCLRR; // 0x9A4
- volatile unsigned int AHB4RSTSETR; // 0x9A8
- volatile unsigned int AHB4RSTCLRR; // 0x9AC
- volatile unsigned int res21[20];
- volatile unsigned int MP_APB1ENSETR; // 0xA00
- volatile unsigned int MP_APB1ENCLRR; // 0xA04
- volatile unsigned int MP_APB2ENSETR; // 0xA08
- volatile unsigned int MP_APB2ENCLRR; // 0xA0C
- volatile unsigned int MP_APB3ENSETR; // 0xA10
- volatile unsigned int MP_APB3ENCLRR; // 0xA14
- volatile unsigned int MP_AHB2ENSETR; // 0xA18
- volatile unsigned int MP_AHB2ENCLRR; // 0xA1C
- volatile unsigned int MP_AHB3ENSETR; // 0xA20
- volatile unsigned int MP_AHB3ENCLRR; // 0xA24
- volatile unsigned int MP_AHB4ENSETR; // 0xA28
- volatile unsigned int MP_AHB4ENCLRR; // 0xA2C
- volatile unsigned int res22[2];
- volatile unsigned int MP_MLAHBENSETR; // 0xA38
- volatile unsigned int MP_MLAHBENCLRR; // 0xA3C
- volatile unsigned int res23[16];
- volatile unsigned int MC_APB1ENSETR; // 0xA80
- volatile unsigned int MC_APB1ENCLRR; // 0xA84
- volatile unsigned int MC_APB2ENSETR; // 0xA88
- volatile unsigned int MC_APB2ENCLRR; // 0xA8C
- volatile unsigned int MC_APB3ENSETR; // 0xA90
- volatile unsigned int MC_APB3ENCLRR; // 0xA94
- volatile unsigned int MC_AHB2ENSETR; // 0xA98
- volatile unsigned int MC_AHB2ENCLRR; // 0xA9C
- volatile unsigned int MC_AHB3ENSETR; // 0xAA0
- volatile unsigned int MC_AHB3ENCLRR; // 0xAA4
- volatile unsigned int MC_AHB4ENSETR; // 0xAA8
- volatile unsigned int MC_AHB4ENCLRR; // 0xAAC
- volatile unsigned int MC_AXIMENSETR; // 0xAB0
- volatile unsigned int MC_AXIMENCLRR; // 0xAB4
- volatile unsigned int MC_MLAHBENSETR; // 0xAB8
- volatile unsigned int MC_MLAHBENCLRR; // 0xABC
- volatile unsigned int res24[16];
- volatile unsigned int MP_APB1LPENSETR; // 0xB00
- volatile unsigned int MP_APB1LPENCLRR; // 0xB04
- volatile unsigned int MP_APB2LPENSETR; // 0xB08
- volatile unsigned int MP_APB2LPENCLRR; // 0xB0C
- volatile unsigned int MP_APB3LPENSETR; // 0xB10
- volatile unsigned int MP_APB3LPENCLRR; // 0xB14
- volatile unsigned int MP_AHB2LPENSETR; // 0xB18
- volatile unsigned int MP_AHB2LPENCLRR; // 0xB1C
- volatile unsigned int MP_AHB3LPENSETR; // 0xB20
- volatile unsigned int MP_AHB3LPENCLRR; // 0xB24
- volatile unsigned int MP_AHB4LPENSETR; // 0xB28
- volatile unsigned int MP_AHB4LPENCLRR; // 0xB2C
- volatile unsigned int MP_AXIMLPENSETR; // 0xB30
- volatile unsigned int MP_AXIMLPENCLRR; // 0xB34
- volatile unsigned int MP_MLAHBLPENSETR; // 0xB38
- volatile unsigned int MP_MLAHBLPENCLRR; // 0xB3C
- volatile unsigned int res25[16];
- volatile unsigned int MC_APB1LPENSETR; // 0xB80
- volatile unsigned int MC_APB1LPENCLRR; // 0xB84
- volatile unsigned int MC_APB2LPENSETR; // 0xB88
- volatile unsigned int MC_APB2LPENCLRR; // 0xB8C
- volatile unsigned int MC_APB3LPENSETR; // 0xB90
- volatile unsigned int MC_APB3LPENCLRR; // 0xB94
- volatile unsigned int MC_AHB2LPENSETR; // 0xB98
- volatile unsigned int MC_AHB2LPENCLRR; // 0xB9C
- volatile unsigned int MC_AHB3LPENSETR; // 0xBA0
- volatile unsigned int MC_AHB3LPENCLRR; // 0xBA4
- volatile unsigned int MC_AHB4LPENSETR; // 0xBA8
- volatile unsigned int MC_AHB4LPENCLRR; // 0xBAC
- volatile unsigned int MC_AXIMLPENSETR; // 0xBB0
- volatile unsigned int MC_AXIMLPENCLRR; // 0xBB4
- volatile unsigned int MC_MLAHBLPENSETR; // 0xBB8
- volatile unsigned int MC_MLAHBLPENCLRR; // 0xBBC
- volatile unsigned int res26[16];
- volatile unsigned int MC_RSTSCLRR; // 0xC00
- volatile unsigned int res27[4];
- volatile unsigned int MC_CIER; // 0xC14
- volatile unsigned int MC_CIFR; // 0xC18
- volatile unsigned int res28[246];
- volatile unsigned int VERR; // 0xFF4
- volatile unsigned int IDR; // 0xFF8
- volatile unsigned int SIDR; // 0xFFC
- }rcc_t;
-
- #define RCC ((rcc_t *)0x50000000)
-
- #endif // __STM32MP1XX_RCC_H__
- #ifndef __STM32MP1XX_EXTI_H__
- #define __STM32MP1XX_EXTI_H__
-
- typedef struct{
- volatile unsigned int RTSR1; // EXTI rising trigger selection register
- volatile unsigned int FTSR1; // EXTI falling trigger selection register
- volatile unsigned int SWIER1; // EXTI software interrupt event register
- volatile unsigned int RPR1; // EXTI rising edge pending register
- volatile unsigned int FPR1; // EXTI falling edge pending register
- volatile unsigned int TZENR1; // EXTI TrustZone enable register
- volatile unsigned int RES1[2];
- volatile unsigned int RTSR2; // EXTI rising trigger selection register
- volatile unsigned int FTSR2; // EXTI falling trigger selection register
- volatile unsigned int SWIER2; // EXTI software interrupt event register
- volatile unsigned int RPR2; // EXTI rising edge pending register
- volatile unsigned int FPR2; // EXTI falling edge pending register
- volatile unsigned int TZENR2; // EXTI TrustZone enable register
- volatile unsigned int RES2[2];
- volatile unsigned int RTSR3; // EXTI rising trigger selection register
- volatile unsigned int FTSR3; // EXTI falling trigger selection register
- volatile unsigned int SWIER3; // EXTI software interrupt event register
- volatile unsigned int RPR3; // EXTI rising edge pending register
- volatile unsigned int FPR3; // EXTI falling edge pending register
- volatile unsigned int TZENR3; // EXTI TrustZone enable register
- volatile unsigned int RES3[2];
- volatile unsigned int EXTICR1; // EXTI external interrupt selection register 1
- volatile unsigned int EXTICR2; // EXTI external interrupt selection register 2
- volatile unsigned int EXTICR3; // EXTI external interrupt selection register 3
- volatile unsigned int EXTICR4; // EXTI external interrupt selection register 4
- volatile unsigned int RES4[4];
- volatile unsigned int C1IMR1; // EXTI CPU1 wakeup with interrupt mask register
- volatile unsigned int C1EMR1; // EXTI CPU1 wakeup with event mask register
- volatile unsigned int RES5[2];
- volatile unsigned int C1IMR2; // EXTI CPU1 wakeup with interrupt mask register
- volatile unsigned int C1EMR2; // EXTI CPU1 wakeup with event mask register
- volatile unsigned int RES6[2];
- volatile unsigned int C1IMR3; // EXTI CPU1 wakeup with interrupt mask register
- volatile unsigned int C1EMR3; // EXTI CPU1 wakeup with event mask register
- volatile unsigned int RES7[6];
- volatile unsigned int C2IMR1; // EXTI CPU2 wakeup with interrupt mask register
- volatile unsigned int C2EMR1; // EXTI CPU2 wakeup with event mask register
- volatile unsigned int RES8[2];
- volatile unsigned int C2IMR2; // EXTI CPU2 wakeup with interrupt mask register
- volatile unsigned int C2EMR2; // EXTI CPU2 wakeup with event mask register
- volatile unsigned int RES9[2];
- volatile unsigned int C2IMR3; // EXTI CPU2 wakeup with interrupt mask register
- volatile unsigned int C2EMR3; // EXTI CPU2 wakeup with event mask register
- volatile unsigned int RES10[2];
- }exti_t;
-
- #define EXTI ((exti_t*)0x5000D000)
-
- #endif //__STM32MP1XX_EXTI_H__
- #ifndef __STM32MP1XX_GIC_H__
- #define __STM32MP1XX_GIC_H__
-
-
- typedef struct {
- volatile unsigned int CTRL;
- volatile unsigned int TYPER;
- volatile unsigned int IIDR;
- volatile unsigned int RES1[29];
- volatile unsigned int IGROUPR[9];
- volatile unsigned int RES2[23];
- volatile unsigned int ISENABLER[9];
- volatile unsigned int RES3[23];
- volatile unsigned int ICENABLER[9];
- volatile unsigned int RES4[23];
- volatile unsigned int ISPENDR[9];
- volatile unsigned int RES5[23];
- volatile unsigned int ICPENDR[9];
- volatile unsigned int RES6[23];
- volatile unsigned int ISACTIVER[9];
- volatile unsigned int RES7[23];
- volatile unsigned int ICACTIVER[9];
- volatile unsigned int RES8[23];
- volatile unsigned int IPRIORITYR[72];
- volatile unsigned int RES9[184];
- volatile unsigned int ITARGETSR[72];
- volatile unsigned int RES10[184];
- volatile unsigned int ICFGR[18];
- volatile unsigned int RES11[46];
-
- }gicd_t;
- #define GICD ((gicd_t*)0xA0021000)
-
-
- typedef struct {
- volatile unsigned int CTRL;
- volatile unsigned int PMR;
- volatile unsigned int BRR;
- volatile unsigned int IAR;
- volatile unsigned int EOIR;
- volatile unsigned int RPR;
- volatile unsigned int HPPIR;
- volatile unsigned int ABPR;
- volatile unsigned int AIAR;
- volatile unsigned int AEOIR;
- volatile unsigned int AHPPIR;
- volatile unsigned int RES1[41];
- volatile unsigned int APR0;
- volatile unsigned int RES2[3];
- volatile unsigned int NSAPR0;
- volatile unsigned int RES3[6];
- volatile unsigned int IIDR;
- volatile unsigned int RES4[960];
- volatile unsigned int DIRDIR;
-
- }gicc_t;
- #define GICC ((gicc_t*)0xA0022000)
-
- #endif // __STM32MP1XX_GIC_H__