ARM第四次

main.c

cpp 复制代码
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "motor.h"
#include "fan.h"
#include "key.h"

int main()
{
	LED1_Init();
	LED2_Init();
	LED3_Init();
	BEEP_Init();
	Motor_Init();
	Fan_Init();
	key1_Init();
	key2_Init();
	key3_Init();
	while (1)
	{
		
	}
	return 0;
}

key.c

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

void key1_Init(void)
{
    //使能GPIOF外设时钟
    RCC->MP_AHB4ENSETR |= (0X1<<5);
    //将GPIOF_PIN9设置为输入
    GPIOF->MODER &= (~(0X3<<18));
    //让GPIOF_PIN9产生EXTI9事件
    EXTI->EXTICR3 &= (~(0XFF<<8));
    EXTI->EXTICR3 |= (0x5<<8);
    //使用下降沿检测EXTI9事件
    EXTI->FTSR1 |= (0X1<<9);
    //取消EXTI9事件的屏蔽
    EXTI->C1IMR1 |= (0X1<<9);
    //使能99号中断
    GICD->ISENABLER[3] |= (0X1<<3);
    //设置99号中断的中断优先级
    GICD->IPRIORITYR[24] &= (~(0X1F<<27));
    //设置99号中断的目标处理器
    GICD->ITARGETSR[24] &= (~(0X3<<24));
    GICD->ITARGETSR[24] |= (0X1<<24);
    //全局使能组0中断被转发到GICC层
    GICD->CTRL |= (0X1);
    //设置中断优先级的掩码
    GICC->PMR |= (0X1F<<3);
    //全局使能组0中断被转发给处理器
    GICC->CTRL |= (0X1);
}

void key2_Init(void)
{
    //使能GPIOF外设时钟
    RCC->MP_AHB4ENSETR |= (0X1<<5);
    //将GPIOF_PIN7设置为输入
    GPIOF->MODER &= (~(0X3<<14));
    //让GPIOF_PIN7产生EXTI7事件
    EXTI->EXTICR2 &= (~(0XFF<<24));
    EXTI->EXTICR2 |= (0x5<<24);
    //使用下降沿检测EXTI7事件
    EXTI->FTSR1 |= (0X1<<7);
    //取消EXTI7事件的屏蔽
    EXTI->C1IMR1 |= (0X1<<7);
    //使能97号中断
    GICD->ISENABLER[3] |= (0X1<<1);
    //设置97号中断的中断优先级
    GICD->IPRIORITYR[24] &= (~(0X1F<<11));
    //设置97号中断的目标处理器
    GICD->ITARGETSR[24] &= (~(0X3<<8));
    GICD->ITARGETSR[24] |= (0X1<<8);
    //全局使能组0中断被转发到GICC层
    GICD->CTRL |= (0X1);
    //设置中断优先级的掩码
    GICC->PMR |= (0X1F<<3);
    //全局使能组0中断被转发给处理器
    GICC->CTRL |= (0X1);
}

void key3_Init(void)
{
     //使能GPIOF外设时钟
    RCC->MP_AHB4ENSETR |= (0X1<<5);
    //将GPIOF_PIN8设置为输入
    GPIOF->MODER &= (~(0X3<<16));
    //让GPIOF_PIN8产生EXTI8事件
    EXTI->EXTICR3 &= (~(0XFF));
    EXTI->EXTICR3 |= (0x5);
    //使用下降沿检测EXTI8事件
    EXTI->FTSR1 |= (0X1<<8);
    //取消EXTI8事件的屏蔽
    EXTI->C1IMR1 |= (0X1<<8);
    //使能98号中断
    GICD->ISENABLER[3] |= (0X1<<2);
    //设置98号中断的中断优先级
    GICD->IPRIORITYR[24] &= (~(0X1F<<19));
    //设置98号中断的目标处理器
    GICD->ITARGETSR[24] &= (~(0X3<<16));
    GICD->ITARGETSR[24] |= (0X1<<16);
    //全局使能组0中断被转发到GICC层
    GICD->CTRL |= (0X1);
    //设置中断优先级的掩码
    GICC->PMR |= (0X1F<<3);
    //全局使能组0中断被转发给处理器
    GICC->CTRL |= (0X1);
}

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"

void key1_Init(void);
void key2_Init(void);
void key3_Init(void);

#endif

do_irq.c

cpp 复制代码
#include "key.h"
#include "led.h"
#include "beep.h"
#include "fan.h"
#include "motor.h"
#include "delay.h"

extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void) 
{
    static int flag1=1;
    static int flag2=1;
    static int flag3=1;
    //获取中断号
    unsigned int irqnumb=(GICC->IAR&0X3FF);
    switch (irqnumb)
    {
        case 99:{
                    //进行中断处理
                    if (flag1==1)
                    {
                        LED1_ON();
                        LED2_ON();
                        LED3_ON();
                        printf("LED1打开\n");
                        printf("LED2打开\n");
                        printf("LED3打开\n");
                        flag1=0;
                    }
                    else if (flag1==0)
                    {
                        LED1_OFF();
                        LED2_OFF();
                        LED3_OFF();
                        printf("LED1关闭\n");
                        printf("LED2关闭\n");
                        printf("LED3关闭\n");
                        flag1=1;
                    }
                    //清除GICD中的中断排队标志
                    GICD->ICPENDR[3] |= (0X1<<3);
                    //清除EXTI中的事件挂起标志
                    EXTI->FPR1 |= (0x1<<9);
                    break;
                }
        case 98:{
                //进行中断处理
                if (flag2==1)
                {
                    BEEP_Open();
                    printf("BEEP打开\n");
                    flag2=0;
                }
                else if (flag2==0)
                {
                    BEEP_Close();
                    printf("BEEP关闭\n");
                    flag2=1;
                }
                //清除GICD中的中断排队标志
                GICD->ICPENDR[3] |= (0X1<<2);
                //清除EXTI中的事件挂起标志
                EXTI->FPR1 |= (0x1<<8);
                break;
                }
        case 97:{
                //进行中断处理
                if (flag3==1)
                {
                    Fan_Open();
                    Motor_Open();
                    printf("FAN打开\n");
                    printf("Motor打开\n");
                    flag3=0;
                }
                else if (flag3==0)
                {
                    Fan_Close();
                    Motor_Close();
                    printf("FAN关闭\n");
                    printf("Motor关闭\n");
                    flag3=1;
                }
                //清除GICD中的中断排队标志
                GICD->ICPENDR[3] |= (0X1<<1);
                //清除EXTI中的事件挂起标志
                EXTI->FPR1 |= (0x1<<7);
                break;
                }   
    }
    //清除IAR保存的中断号
    GICC->EOIR |= irqnumb;
}
相关推荐
爱网络爱Linux15 分钟前
【系列】每天一个 Linux 命令(53)startx 命令
linux·rhce·rhca·linux运维·linux命令大全·红帽认证
ZhengEnCi31 分钟前
L2A-一个域名如何访问多台云服务器-子域名、路径前缀与Nginx反向代理选型指南
linux·人工智能
M78佐菲43 分钟前
51单片机学习笔记:ds18b20要点整理
linux·笔记·嵌入式硬件·学习·51单片机
lsswear1 小时前
Python 并发 线程
开发语言·python
郑州光合科技余经理1 小时前
国际版外卖系统:税率字段怎么和订单主流程解耦
android·java·开发语言·前端·后端·php·ai编程
高亦真1 小时前
今天是学习嵌入式的第37天
linux·学习·算法
软件课代表CiCi1 小时前
运行库是什么?电脑缺运行库怎么办?c++运行库缺失修复全攻略
开发语言·c++·windows·电脑·dll修复·dll丢失·运行库
Ivanqhz2 小时前
MLIR OpBuilder
开发语言·python·mlir
一个有温度的技术博主2 小时前
Linux 核心命令速查指南:从文件操作到系统运维
linux·服务器
小小的木头人2 小时前
Docker 环境下迁移 containerd 数据目录:从 `/var/lib/containerd` 到 `/data/containerd`
linux·docker