按键中断实验

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;

}

相关推荐
2301_793121049 小时前
基于单片机的水平角度仪系统设计
单片机·嵌入式硬件
KaifuZeng10 小时前
通信与接口协议面试十、PCIe
单片机·嵌入式硬件·面试·通信与接口协议
lzx1864884370210 小时前
【AH8966】可替代 KP3211 非隔离 AC110220V转12V 0.5A 降压转换芯片
人工智能·单片机·嵌入式硬件·集成测试·硬件工程·ic
csg110711 小时前
PIC单片机防破解:从硬件到软件的全面防护
单片机·嵌入式硬件·物联网·自动化
电化学仪器白超11 小时前
低阻域 ADC 与参考源选型理论分析
人工智能·python·单片机·嵌入式硬件·自动化
bu_shuo13 小时前
STM32-BOOT的三种启动方式
stm32·单片机·嵌入式硬件
YYRAN_ZZU13 小时前
Lattice 自定义IP业务逻辑核
嵌入式硬件·fpga开发
AI的探索之旅14 小时前
从 Ubuntu 14.04 到 24.04:TI AM335x 开发环境完整迁移与 Agent 接管方案
linux·数据库·嵌入式硬件·ubuntu·postgresql
ACP广源盛1392462567314 小时前
GSV6155 @ACP#工业车规 DP1.4 重定时器 Retimer
大数据·人工智能·分布式·嵌入式硬件
sramdram15 小时前
低功耗MCU芯片电机控制专用
单片机·嵌入式硬件·mcu·低功耗mcu·mcu芯片