ARM作业2

.设置按键中断,按键1按下,LED亮,再按一次,灭

按键2按下,蜂鸣器响。再按一次,不响

按键3按下,风扇转,再按一次,风扇停

头文件key_it.h

cs 复制代码
#ifndef __KEY_IT_H__
#define __KEY_IT_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"
void key_it_config();
void key3_it_config();
void all_led_init();
void buzzer_init();
void fan_init();
#endif

源文件key_it.c

cs 复制代码
#include"key_it.h"

void key3_it_config()
{
    //RCC使能GPIOF时钟
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    GPIOF->MODER &= (~(0x3<<16));
    EXTI->EXTICR3 &=(~(0xFF<<0));
    EXTI->EXTICR3 |= (0x5<<0);
    EXTI->FTSR1 |= (0x1<<8);
    EXTI->C1IMR1 |= (0x1<<8);
    GICD->ISENABLER[3] |= (0X1<<2); 
    GICD->IPRIORITYR[24] &= (~(0X1F<<19)); 
    GICD->ITARGETSR[24]  &= (~(0X3<<16));
    GICD->ITARGETSR[24] |= (0X1<<16);
}
void key_it_config()
{
    //RCC使能GPIOF时钟
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    //设置PF9 PF7 PF8GPIO输入
    //PF9
    GPIOF->MODER &= (~(0x3<<18));
    //PF8
    // GPIOF->MODER &= (~(0x3<<16));
    //pf7
    GPIOF->MODER &= (~(0x3<<14));
    //设置PF9 PF7 PF8产生EXTI事件 EXTI_EXTICRx
    //pf7
    EXTI->EXTICR2 &=(~(0xFF<<24));
    EXTI->EXTICR2 |= (0x5<<24);
    //pf8
    // EXTI->EXTICR3 &=(~(0xFF<<0));
    // EXTI->EXTICR3 |= (0x5<<0);
    //pf9
    EXTI->EXTICR3 &=(~(0xFF<<8));
    EXTI->EXTICR3 |= (0x5<<8);
    //设置事件触发方式为下降沿触发EXTI_FTSR1
    //pf7
    EXTI->FTSR1 |= (0x1<<7);
    //pf8
    // EXTI->FTSR1 |= (0x1<<8);
    //pf9
    EXTI->FTSR1 |= (0x1<<9);
    //设置EXTI事件触发不屏蔽EXTI_IMR1
    //PF7
    EXTI->C1IMR1 |= (0x1<<7);
    //PF8
    // EXTI->C1IMR1 |= (0x1<<8);
    //PF9
    EXTI->C1IMR1 |= (0x1<<9);
    //使能中断能转发到特定的CPU接口层GICD_ISENABLERx
    //PF7 97号中断
    GICD->ISENABLER[3] |= (0X1<<1); 
    //PF78 98号中断
    // GICD->ISENABLER[3] |= (0X1<<2); 
    //PF9 99号中断
    GICD->ISENABLER[3] |= (0X1<<3); 
    // GICD_ISENABLERx设置中断优先级
    //PF7
    GICD->IPRIORITYR[24] &= (~(0X1F<<11)); 
    //PF8
    // GICD->IPRIORITYR[24] &= (~(0X1F<<19)); 
    //PF9
    GICD->IPRIORITYR[24] &= (~(0X1F<<27)); 
    //设置当前中断被转发到哪一个CPU处理GICD_ITARGETSRx
    //pf7 97中断
    GICD->ITARGETSR[24]  &= (~(0X3<<8));
    GICD->ITARGETSR[24] |= (0X1<<8);
    //pf8 98中断
    // GICD->ITARGETSR[24]  &= (~(0X3<<16));
    // GICD->ITARGETSR[24] |= (0X1<<16);
    //pf9 99中断
    GICD->ITARGETSR[24]  &= (~(0X3<<24));
    GICD->ITARGETSR[24] |= (0X1<<24);
    //使能组0转发中断GICD_CTLR
    GICD->CTRL |= 0X1;
    //设置中断优先级掩码GICC_PMR
    GICC->PMR |= (0x1F<<3);

    //使能CPU可以处理组0转发的中断GICC_CTLR
    GICC->CTRL |= 0X1;    
}

void all_led_init()
{
    //RCC使能
    RCC->MP_AHB4ENSETR |= (0x3<<4);
    //设置PE10 PF10 PE8为输出
    GPIOE->MODER &= (~(0X3<<20));
    GPIOE->MODER |= (0X1<<20);
        //设置推挽输出
    GPIOE->OTYPER &= (~(0X1<<10));
     //设置三个管脚低速输出
    GPIOE->OSPEEDR &= (~(0X3<<20));
     //设置三个管脚输出时无上拉电阻和下拉电阻
    GPIOE->PUPDR &= (~(0X3<<20));
}
void buzzer_init()
{
    //RCC使能
    RCC->MP_AHB4ENSETR |= (0x1<<1);
    //设置PE10 PF10 PE8为输出
    GPIOB->MODER &= (~(0X3<<12));
    GPIOB->MODER |= (0X1<<12);
        //设置推挽输出
    GPIOB->OTYPER &= (~(0X1<<6));
     //设置三个管脚低速输出
    GPIOB->OSPEEDR &= (~(0X3<<12));
     //设置三个管脚输出时无上拉电阻和下拉电阻
    GPIOB->PUPDR &= (~(0X3<<12));
}
void fan_init(){
    //RCC使能
    RCC->MP_AHB4ENSETR  |= (0x1<<4);
    //设置PE9为输出
    GPIOE->MODER &= (~(0X3<<18));
    GPIOE->MODER |= (0X1<<18);
    //设置推挽输出
    GPIOE->OTYPER &= (~(0X1<<9));
    //设置三个管脚低速输出
    GPIOE->OSPEEDR &= (~(0X3<<18));
    //设置三个管脚输出时无上拉电阻和下拉电阻    
    GPIOE->PUPDR &= (~(0X3<<18));
}

do_irq.c

cs 复制代码
#include "key_it.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void) 
{
    int irqno;//保存中断号
    irqno=GICC->IAR & 0X3FF;
    switch(irqno)
    {
        case 99://key1
            //按键1中断处理
            printf("KEY1 INT\n");
			GPIOE->ODR ^=(0X1<<10);
    //清除挂起中断标志位GICD_ICPENDRx
        GICD->ICPENDR[3] |= (0x1<<3);
    //清除中断触发标志位EXTI_FPR1
        EXTI->FPR1 |= (0x1<<9);
            break;
        case 97://key2
            //按键2中断处理
            printf("KEY2 INT\n");
			GPIOB->ODR ^=(0x1<<6);
    //清除挂起中断标志位GICD_ICPENDRx
    GICD->ICPENDR[3] |= (0x1<<1);
    //清除中断触发标志位EXTI_FPR1
    EXTI->FPR1 |= (0x1<<7);
            break;
        case 98://key3
            //按键3中断处理
            printf("KEY3 INT\n");
			GPIOE->ODR ^=(0x1<<9);
    //清除挂起中断标志位GICD_ICPENDRx
    GICD->ICPENDR[3] |= (0x1<<2);
    //清除中断触发标志位EXTI_FPR1
    EXTI->FPR1 |= (0x1<<8);
            break;
    }
    //清除处理完的中断号GICC_EOIR
    GICC->EOIR =irqno;
}

main.c

cs 复制代码
#include "uart.h"
#include "key_it.h"
int main()
{
	all_led_init();
    uart4_init();//串口初始化
    //中断初始化
    key_it_config();
    key3_it_config();
	buzzer_init();
	fan_init();
    while(1)
    {
        //保证主程序不结束
    }
    return 0;
}

现象

相关推荐
海绵宝宝de派小星3 小时前
MCP与A2A协议深度解析:Agent时代的“TCP/IP“如何诞生
arm开发·网络协议·tcp/ip·ai
Zephyrus_20237 小时前
LSM6DSV16X驱动移植+调试
c语言·arm开发
瑞禧生物tech8 小时前
四臂聚乙二醇-磷脂 4-Arm PEG-DSPE 反应原理解析
arm开发
振南的单片机世界9 小时前
地址总线定“找谁”,数据总线定“搬多少”
arm开发·stm32·单片机
有想法的py工程师1 天前
手工处理 Oracle Cloud ARM 实例在线 DD Rocky Linux 10报错
linux·arm开发·oracle
带土11 天前
2. ARM处理器概论
arm开发
大阳1231 天前
ARM.7(UART,I2C)
arm开发·单片机·嵌入式硬件·i2c·at24c02
secondyoung3 天前
Cortex-R52学习:MPU内存保护机制
arm开发·单片机·学习·arm·mpu
szxinmai主板定制专家3 天前
基于 ARM+FPGA精密多轴实时运动控制卡设计方案,适用于半导体设备等高精度领域(一)
arm开发·人工智能·嵌入式硬件·fpga开发·架构·语音识别
你疯了抱抱我3 天前
【Mac】安装并配置HomeBrew;ARM GCC;make;OpenOCD
arm开发·macos