ARMday7

stm32mp157AAA三个按键中断实现led灯亮灭

key_it.h

复制代码
#ifndef __KEY_IT_H__
#define __KEY_IT_H__
#include"stm32mp1xx_gpio.h"
#include"stm32mp1xx_gic.h"
#include"stm32mp1xx_exti.h"
#include"stm32mp1xx_rcc.h"
#define RCC_GPIO (*(unsigned int*)0x50000a28)

void all_led_init();
void led1_on();
void led1_off();
void led2_on();
void led2_off();
void led3_on();
void led3_off();
void key1_it_config();
void key2_it_config();
void key3_it_config();


#endif

led.c

复制代码
#include "key_it.h"
void all_led_init()
{
    RCC_GPIO |= (0X3<<4);//时钟使能
    GPIOE->MODER &=(~(0X3<<20));//设置PE10输出
    GPIOE->MODER |= (0X1<<20);
    //设置PE10为推挽输出
    GPIOE->OTYPER &=(~(0x1<<10));
    //PE10为低速输出
    GPIOE->OSPEEDR &= (~(0x3<<20));
    //设置无上拉下拉
    GPIOE->PUPDR &= (~(0x3<<20));
 
    //LED2
    GPIOF->MODER &=(~(0X3<<20));//设置Pf10输出
    GPIOF->MODER |= (0X1<<20);
    //设置Pf10为推挽输出
    GPIOF->OTYPER &=(~(0x1<<10));
    //Pf10为低速输出
    GPIOF->OSPEEDR &= (~(0x3<<20));
    //设置无上拉下拉
    GPIOF->PUPDR &= (~(0x3<<20));
 
    //LED3
    GPIOE->MODER &=(~(0X3<<16));//设置PE8输出
    GPIOE->MODER |= (0X1<<16);
    //设置PE8为推挽输出
    GPIOE->OTYPER &=(~(0x1<<8));
    //PE8为低速输出
    GPIOE->OSPEEDR &= (~(0x3<16));
    //设置无上拉下拉
    GPIOE->PUPDR &= (~(0x3<<16));
}
void led1_on()
{
    GPIOE->ODR |= (0x1<<10);
}
 
void led1_off()
{
    GPIOE->ODR &= (~(0x1<<10));
}
void led2_on()
{
    GPIOF->ODR |= (0x1<<10);
}
 
void led2_off()
{
    GPIOF->ODR &= (~(0x1<<10));
}
void led3_on()
{
    GPIOE->ODR |= (0x1<<8);
}
 
void led3_off()
{
    GPIOE->ODR &= (~(0x1<<8));
    
}

key_it.c

复制代码
#include"key_it.h"
void key1_it_config()
{
    //使能GPIOF时钟
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    //设置PF9管脚为输入
    GPIOF->MODER &= (~(0x3<<18));
    //设置PF9作为EXTI9事件的输入
    EXTI->EXTICR3 &= (~(0x1f<<8));
    EXTI->EXTICR3 |= (0x05<<8);
    //设置下降沿使能检测EXTI9事件
    EXTI->FTSR1 |= (0x1<<9);
    //设置EXTI9事件不屏蔽
    EXTI->C1IMR1 |= (0x1<<9);
    //GICD使能EXTI9(99号)中断
    GICD->ISENABLER[3] |= (0x1<<3);
    //GICD 设置99号中断的优先级
    GICD->IPRIORITYR[24] &= (~(0x1f<<27));
    //选择CPU0处理当前中断
    GICD->ITARGETSR[24] |= (0x1<<24);
    //全局使能组0中断被转发到GICC
    GICD->CTRL |= (0X1);
    //设置中断的优先级掩码
    GICC->PMR |= (0x1f<<3);
    //允许组0中断被CPU处理
    GICC->CTRL |= (0x1);
}
void key2_it_config()
{
     //使能GPIOF时钟
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    //设置PF7管脚为输入
    GPIOF->MODER &= (~(0x3<<14));
    //设置PF7作为EXTI7事件的输入
    EXTI->EXTICR2 &= (~(0x1f<<24));
    EXTI->EXTICR2 |= (0x05<<24);
    //设置下降沿使能检测EXTI7事件
    EXTI->FTSR1 |= (0x1<<7);
    //设置EXTI7事件不屏蔽
    EXTI->C1IMR1 |= (0x1<<7);
    //GICD使能EXTI7(97号)中断
    GICD->ISENABLER[3] |= (0x1<<1);
    //GICD 设置97号中断的优先级
    GICD->IPRIORITYR[24] &= (~(0x1f<<11));
    //选择CPU0处理当前中断
    GICD->ITARGETSR[24] |= (0x1<<8);
    //全局使能组0中断被转发到GICC
    GICD->CTRL |= (0X1);
    //设置中断的优先级掩码
    GICC->PMR |= (0x1f<<3);
    //允许组0中断被CPU处理
    GICC->CTRL |= (0x1);
}
void key3_it_config()
{
     //使能GPIOF时钟
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    //设置PF8管脚为输入
    GPIOF->MODER &= (~(0x3<<16));
    //设置PF8作为EXTI8事件的输入
    EXTI->EXTICR3 &= (~(0x1f));
    EXTI->EXTICR3 |= (0x05);
    //设置下降沿使能检测EXTI8事件
    EXTI->FTSR1 |= (0x1<<8);
    //设置EXTI8事件不屏蔽
    EXTI->C1IMR1 |= (0x1<<8);
    //GICD使能EXTI8(98号)中断
    GICD->ISENABLER[3] |= (0x1<<2);
    //GICD 设置98号中断的优先级
    GICD->IPRIORITYR[24] &= (~(0x1f<<19));
    //选择CPU0处理当前中断
    GICD->ITARGETSR[24] |= (0x1<<16);
    //全局使能组0中断被转发到GICC
    GICD->CTRL |= (0X1);
    //设置中断的优先级掩码
    GICC->PMR |= (0x1f<<3);
    //允许组0中断被CPU处理
    GICC->CTRL |= (0x1);
}

do_irq.c

复制代码
#include "key_it.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void)
{
    int irqno = (GICC->IAR & 0x3ff);
    switch (irqno)
    {
    case 99: // key1
        printf("KEY1_INT\n");
        led1_on();
        led2_off();
        led3_off();
        // 清除GICD的中断排队标志
        GICD->ICPENDR[3] |= (0x1<<3);
        // 清除exti的事件触发标志
        EXTI->FPR1 |= (0x1<<9);
        break;
    case 97: // KEY2
        printf("KEY2_INT\n");
        led1_off();
        led2_on();
        led3_off();
        // 清除GICD的中断排队标志
         GICD->ICPENDR[1] |= (0x1);
        // 清除exti的事件触发标志
         EXTI->FPR1 |= (0x1<<7);
        break;
    case 98: // key3
        printf("KEY3_INT\n");
        led1_off();
        led2_off();
        led3_on();
        // 清除GICD的中断排队标志
         GICD->ICPENDR[2] |= (0x1<<2);
        // 清除exti的事件触发标志
         EXTI->FPR1 |= (0x1<<8);
        break;
    }
    // 清除中断号
    GICC->EOIR = irqno;
}

main.c

复制代码
#include "key_it.h"

 

void delay(int ms)

{

  int i,j;

  for(i=0;i<ms;i++)

  {

    for(j=0;j<2000;j++);

  }

}

 

int main()

{

  all_led_init();

  key1_it_config();

  key2_it_config();

  key3_it_config();

    while (1)

    {

        printf("do main...\n");

        delay(1000);

    }

}

运行结果:

相关推荐
悠哉悠哉愿意6 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
Lester_11016 天前
STM32霍尔传感器输入口设置为复用功能输入口时,还能用GPIO函数直接读取IO的状态吗
stm32·单片机·嵌入式硬件·电机控制
LCG元6 天前
低功耗显示方案:STM32L0驱动OLED,动态波形绘制与优化
stm32·嵌入式硬件·信息可视化
三佛科技-187366133976 天前
120W小体积碳化硅电源方案(LP8841SC极简方案12V10A/24V5A输出)
单片机·嵌入式硬件
z20348315206 天前
STM32F103系列单片机定时器介绍(二)
stm32·单片机·嵌入式硬件
Alaso_shuang6 天前
STM32 核心输入、输出模式
stm32·单片机·嵌入式硬件
脚后跟6 天前
AI助力嵌入式物联网项目全栈开发
嵌入式硬件·物联网·ai编程
2501_918126916 天前
stm32死锁是怎么实现的
stm32·单片机·嵌入式硬件·学习·个人开发
z20348315206 天前
STM32F103系列单片机定时器介绍(一)
stm32·单片机
星马梦缘6 天前
驱动层开发——蜂鸣器驱动
stm32·单片机·嵌入式硬件·hal·驱动