按键中断实验

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;

}

相关推荐
星河单片机31 分钟前
STM32驱动WaterSensor水位传感器+OLED显示完整原理与实验
stm32·单片机·嵌入式硬件
子文雨1 小时前
基于 uC3845 与 ATtiny13 双芯片架构的 8.4V/2.5Ah 锂电池智能充电器设计
单片机·嵌入式硬件·算法
快秃头的码农2 小时前
esp32-s3移植lvgl总结
嵌入式硬件·esp32-s3
恒锐丰科技林技术员3 小时前
EG1191 宽压降压 DC‑DC 芯片解析:高性价比工业电源方案
经验分享·嵌入式硬件·硬件工程
智购科技无人售货机工厂店3 小时前
2026自动售货机大屏交互设计原则:从信息层级到视觉动线的工程实践~YH
运维·python·单片机·嵌入式硬件·自动化·交互
艾芯微科技6 小时前
SKY13370‑374LF|0.5‑6GHz SPDT 射频开关,WLAN/LTE 射频前端实用器件
网络·单片机·嵌入式硬件·集成测试·51单片机
HUI-4748 小时前
EG1131|SOT23‑6 30V/1.5A 电流模式同步降压 DC‑DC,小体积消费类电源优选
嵌入式硬件·硬件工程
天空'之城8 小时前
单片机基础核心知识点汇总(三十)
单片机·嵌入式硬件
笨笨饿8 小时前
#137_死机恢复现场_Armino平台AP系统swd调试
git·python·stm32·单片机·嵌入式硬件·物联网·vim
linnux领域8 小时前
面包板供电“插哪都不亮“?一个暗断点引发的排查——硬件新手三板斧
单片机·嵌入式硬件·esp32·arduino·面包板·硬件入门