按键中断实验

key.h

#include "key.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

if(GPIOE->ODR & (0x1<<10) != 0)

GPIOE->ODR &= (~(0x1<<10));

else

GPIOE->ODR |=(0x1<<10);

GICD->ICPENDR3 |= (0x1<<3);

EXTI->FPR1 |= (0x1<<9);

break;

case 97://key2

GPIOB->ODR |= (0x1<<6);

GICD->ICPENDR3 |= (0x1<<1);

EXTI->FPR1 |= (0x1<<7);

break;

case 98://key3

GPIOE->ODR |= (0x1<<9);

GICD->ICPENDR3 |= (0x1<<2);

EXTI->FPR1 |= (0x1<<8);

}

//清除处理完的中断号GICC_EOIR

GICC->EOIR =irqno;

}

key.h

#ifndef KEY_H

#define KEY_H

#include "stm32mp1xx_rcc.h"

#include "stm32mp1xx_gpio.h"

#include "stm32mp1xx_exti.h"

#include "stm32mp1xx_gic.h"

void mykey();

void key3_init();

void key12_init();

#endif

key.c

#include "key.h"

void mykey()

{

RCC->MP_AHB4ENSETR |= (0X3<<4);

RCC->MP_AHB4ENSETR |= (0x1<<1);

//led1灯初始

GPIOE->MODER &= (~(0X3<<20));

GPIOE->MODER |= (0x1<<20);

GPIOE->OTYPER &= (~(0X1<<10));

GPIOE->OSPEEDR &= (~(0X3<<20));

GPIOE->PUPDR &= (~(0X3<<20));

GPIOE->ODR |=(0x1<<10);

//蜂鸣器

GPIOB->MODER &= (~(0x1<<12));

GPIOB->MODER |= (0x1<<12);

GPIOB->OTYPER &= (~(0x1<<6));

GPIOB->OSPEEDR |= (~(0x3<<12));

GPIOB->PUPDR &= (~(0x3<<12));

GPIOB->ODR |= (~(0x1<<6));

//风扇

GPIOE->MODER &= (~(0x1<<18));

GPIOE->MODER |= (0x1<<18);

GPIOE->OTYPER &= (~(0x1<<9));

GPIOE->OSPEEDR |= (~(0x3<<18));

GPIOE->PUPDR &= (~(0x3<<18));

GPIOE->ODR &= (~(0x1<<9));

}

void key3_init()

{

//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->ISENABLER3 |= (0X1<<2);

GICD->IPRIORITYR24 &= (~(0X1F<<19));

GICD->ITARGETSR24 &= (~(0X3<<16));

GICD->ITARGETSR24 |= (0X1<<16);

}

void key12_init()

{

RCC->MP_AHB4ENSETR |= (0x1<<5);

GPIOF->MODER &= (~(0x3<<18));

GPIOF->MODER &= (~(0x3<<14));

EXTI->EXTICR2 &=(~(0xFF<<24));

EXTI->EXTICR2 |= (0x5<<24);

EXTI->EXTICR3 &=(~(0xFF<<8));

EXTI->EXTICR3 |= (0x5<<8);

EXTI->FTSR1 |= (0x1<<7);

EXTI->FTSR1 |= (0x1<<9);

EXTI->C1IMR1 |= (0x1<<7);

EXTI->C1IMR1 |= (0x1<<9);

GICD->ISENABLER3 |= (0X1<<1);

GICD->ISENABLER3 |= (0X1<<3);

GICD->IPRIORITYR24 &= (~(0X1F<<11));

GICD->IPRIORITYR24 &= (~(0X1F<<27));

GICD->ITARGETSR24 &= (~(0X3<<8));

GICD->ITARGETSR24 |= (0X1<<8);

GICD->ITARGETSR24 &= (~(0X3<<24));

GICD->ITARGETSR24 |= (0X1<<24);

GICD->CTRL |= 0X1;

GICC->PMR |= (0x1F<<3);

GICC->CTRL |= 0X1;

}

main.c

#include "key.h"

int main()

{

mykey();

key12_init();

key3_init();

for(;;);

return 0;

}

相关推荐
Zevalin爱灰灰8 小时前
能源与电源管理电路——防倒灌电路
单片机·嵌入式硬件·电源管理
无垠的广袤11 小时前
【工业树莓派 CM0 Dev Board】扩展板设计
linux·python·嵌入式硬件·pcb设计·模块化·传感器
嵌入式-老费11 小时前
esp32开发与应用(添加数据分区)
单片机·嵌入式硬件
嵌入式-老费12 小时前
esp32开发与应用(OTA升级)
嵌入式硬件
CYLAM202515 小时前
STC32G 单片机0.96“OLED 西历农历可调万年历 (1901-2100)
单片机·嵌入式硬件·stc32g·万年历·西历农历·0.96”oled 12864·4x4 矩阵键盘
Discipline~Hai15 小时前
ARM03-蜂鸣器和中断
c语言·arm开发·单片机·嵌入式硬件·嵌入式
KaifuZeng16 小时前
电源面试问题汇总一
单片机·嵌入式硬件·面试·电路
驱动探索者18 小时前
RISC-V PLIC 深度解析:从 Spec 到 Zephyr 驱动实现
单片机·嵌入式硬件·中断控制器
LCG元18 小时前
STM32 FreeRTOS 实战:任务调度 + 互斥锁 + 消息队列 + 串口命令解析器
stm32·单片机·嵌入式硬件
Hello_Damon_Nikola18 小时前
姿态式饮水量估算从原理到实战
嵌入式硬件