0702_ARM6

练习:

中断实验

main.c

cpp 复制代码
#include "key.h"
int main()
{
    //初始化rcc gpio
    hal_key_rcc_gpio_init();
    //初始化exti
    hal_key_exti_init();
    //初始化gic
    hal_key_gic_init();
    
    while(1){
        
    }
    return 0;
}

key.c

cpp 复制代码
#include "key.h"

//GPIOF初始化
void hal_key_rcc_gpio_init(){
    //1.rcc初始化使能GPIOF控制器
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    //2.GPIO模式设置
    //将PF9引脚设置为输入模式
    GPIOF->MODER &= ~(0x3<<18);
    //将PF7引脚设置为输入模式
    GPIOF->MODER &= ~(0x3<<14);
    //将PF8引脚设置为输入模式
    GPIOF->MODER &= ~(0x3<<16);
}

//EXTI初始化
void hal_key_exti_init(){
    //PF9
    //1.设置PF9外部中断选择寄存器进行连接
    EXTI->EXTICR3 &= ~(0xff<<8);
    EXTI->EXTICR3 |= (0x05<<8);
    //2.设置PF9对应EXTI编号下降沿触发
    EXTI->FTSR1 |= (0x1<<9);
    //3.设置PF9对应EXTI层中断不屏蔽
    EXTI->C1EMR1 |= (0x1<<9);

    //PF7
    //1.设置PF7外部中断选择寄存器进行连接
    EXTI->EXTICR2 &= ~(0xff<<24);
    EXTI->EXTICR2 |= (0x05<<24);
    //2.设置PF7对应EXTI编号下降沿触发
    EXTI->FTSR1 |= (0x1<<7);
    //3.设置PF7对应EXTI层中断不屏蔽
    EXTI->C1EMR1 |= (0x1<<7);

    //PF8
    //1.设置PF8外部中断选择寄存器进行连接
    EXTI->EXTICR3 &= ~(0xff);
    EXTI->EXTICR3 |= (0x05);
    //2.设置PF8对应EXTI编号下降沿触发
    EXTI->FTSR1 |= (0x1<<8);
    //3.设置PF8对应EXTI层中断不屏蔽
    EXTI->C1EMR1 |= (0x1<<8);
}

//GIC初始化
void hal_key_gic_init(){
    //1.使能GICD组0
    GICD->CTRL |= 0x1;

    //PF9
    //GICD
    //1.设置PF9对应中断号99使能
    GICD->ISENABLER[3] |= (0x1<<3);
    //2.设置GICD层中断优先级
    GICD->IPRIORITYR[24] &= ~(0x1f<<27);
    //GICD->IPRIORITYR[24] |= (0x1<<27);
    //3.设置GICD层中断分配
    GICD->ITARGETSR[24] &= ~(0x3<<24);
    GICD->ITARGETSR[24] |= (0x1<<24);
    
    //PF7
    //GICD
    //1.设置PF7对应中断号97使能
    GICD->ISENABLER[3] |= (0x1<<1);
    //2.设置GICD层中断优先级
    GICD->IPRIORITYR[24] &= ~(0x1f<<11);
    //GICD->IPRIORITYR[24] |= (0x1<<11);
    //3.设置GICD层中断分配
    GICD->ITARGETSR[24] &= ~(0x3<<8);
    GICD->ITARGETSR[24] |= (0x1<<8);

    //PF8
    //GICD
    //1.设置PF8对应中断号98使能
    GICD->ISENABLER[3] |= (0x1<<2);
    //2.设置GICD层中断优先级
    GICD->IPRIORITYR[24] &= ~(0x1f<<19);
    //GICD->IPRIORITYR[24] |= (0x1<<19);
    //3.设置GICD层中断分配
    GICD->ITARGETSR[24] &= ~(0x3<<16);
    GICD->ITARGETSR[24] |= (0x1<<16);

    //2.设置GICC层组0使能
    GICC->CTRL |= 0x1;
    //3.设置GICC层中断优先级
    GICC->PMR |= (0xf<<3);
}

key.h

cpp 复制代码
#ifndef __KEY_H__
#define  __KEY_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"
extern  void do_irq(void);
// GPIOF初始化
void hal_key_rcc_gpio_init();
// EXTI初始化
void hal_key_exti_init();
// GIC初始化
void hal_key_gic_init();

#endif
相关推荐
大聪明-PLUS2 天前
Linux 中 timeout、watch 和 at 的指南:管理命令执行时间
linux·嵌入式·arm·smarc
奔跑吧 android2 天前
【瑞芯微】【rk3128】【移植 qt 5.12.9】
qt·arm·瑞芯微·rk3128
大聪明-PLUS4 天前
Linux 上的 GitOps:使用 Git 进行无缝基础设施管理
linux·嵌入式·arm·smarc
大聪明-PLUS4 天前
嵌入式 Linux 初学者指南 – 第 2 部分
linux·嵌入式·arm·smarc
普中科技7 天前
【普中STM32F1xx开发攻略--标准库版】-- 第 13 章 STM32 位带操作
stm32·单片机·嵌入式硬件·arm·gpio·普中科技·位带操作
大聪明-PLUS8 天前
io_uring:Linux 上的高性能异步 I/O
linux·嵌入式·arm·smarc
普中科技8 天前
【普中STM32F1xx开发攻略--标准库版】-- 第 12 章 STM32 时钟系统
stm32·单片机·嵌入式硬件·arm·时钟树·普中科技
大聪明-PLUS8 天前
从 C 到 C++20 协程编写方法的演变。第一部分:函数 + 宏 = 协程
linux·嵌入式·arm·smarc
大聪明-PLUS9 天前
3 个诊断 Linux 服务器的脚本
linux·嵌入式·arm·smarc
大聪明-PLUS11 天前
使用 GitLab CI/CD 为 Linux 创建 RPM 包(一)
linux·嵌入式·arm·smarc