按键中断实验

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->ICPENDR[3] |= (0x1<<3);

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

break;

case 97://key2

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

GICD->ICPENDR[3] |= (0x1<<1);

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

break;

case 98://key3

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

GICD->ICPENDR[3] |= (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->ISENABLER[3] |= (0X1<<2);

GICD->IPRIORITYR[24] &= (~(0X1F<<19));

GICD->ITARGETSR[24] &= (~(0X3<<16));

GICD->ITARGETSR[24] |= (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->ISENABLER[3] |= (0X1<<1);

GICD->ISENABLER[3] |= (0X1<<3);

GICD->IPRIORITYR[24] &= (~(0X1F<<11));

GICD->IPRIORITYR[24] &= (~(0X1F<<27));

GICD->ITARGETSR[24] &= (~(0X3<<8));

GICD->ITARGETSR[24] |= (0X1<<8);

GICD->ITARGETSR[24] &= (~(0X3<<24));

GICD->ITARGETSR[24] |= (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;

}

相关推荐
螺丝钉的扭矩一瞬间产生高能蛋白2 小时前
STM32电机控制基础知识
stm32·单片机·嵌入式硬件·嵌入式软件·直流有刷电机控制·定时器互补输出·定时器死区控制刹车输入
Blossom.1183 小时前
用一颗MCU跑通7B大模型:RISC-V+SRAM极致量化实战
人工智能·python·单片机·嵌入式硬件·opencv·机器学习·risc-v
hazy1k4 小时前
K230基础-录放音频
人工智能·stm32·单片机·嵌入式硬件·音视频·k230
SundayBear13 小时前
基于STM32的RT-Thread移植
单片机·嵌入式硬件
R6bandito_14 小时前
STM32中printf的重定向详解
开发语言·经验分享·stm32·单片机·嵌入式硬件·mcu
清风66666614 小时前
基于单片机的元胞自动机仿真系统设计
单片机·嵌入式硬件·毕业设计·课程设计
千千道15 小时前
利用keil +RASC给瑞萨RA8D1编译烧写程序
单片机·嵌入式硬件·mcu·物联网
武文斌7715 小时前
项目学习总结:LVGL图形参数动态变化、开发板的GDB调试、sqlite3移植、MQTT协议、心跳包
linux·开发语言·网络·arm开发·数据库·嵌入式硬件·学习
充哥单片机设计15 小时前
【STM32项目开源】基于STM32的智能家居安防系统
stm32·嵌入式硬件·智能家居
点灯小铭16 小时前
基于单片机的N型热电偶PID锅炉温度控制系统
单片机·嵌入式硬件·毕业设计·课程设计