ARM的三个按键实验

main.c

#include "key_inc.h"

//封装延时函数

void delay(int ms)

{

    int i,j;

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

    {

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

        {}

    }

}



int main()

{

   //按键中断初始化

   key1_it_config();

   key2_it_config();

   key3_it_config();

    while(1)

    {

        printf("in main pro\n");

        delay(1000);

    }

    return 0;

}

src/do_irq.c

#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_exti.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void) 
{
    //irq中断处理代码
    unsigned int irqno = GICC->IAR&0x3ff;
    switch(irqno)
    {
    case 99:
        printf("key1_intc\n");
        //清除GICD中断排队标志
        GICD->ICPENDR[3] |= (0X1<<3);
        //清除EXTI中断触发标志
        EXTI->FPR1 |= (0X1<<9);
        break;

    case 98:
        printf("key2_intc\n");
        //清除GICD中断排队标志
        GICD->ICPENDR[3] |= (0X1<<2);
        //清除EXTI中断触发标志
        EXTI->FPR1 |= (0X1<<8);
        break;

    case 97:
        printf("key2_intc\n");
        //清除GICD中断排队标志
        GICD->ICPENDR[3] |= (0X1<<1);
        //清除EXTI中断触发标志
        EXTI->FPR1 |= (0X1<<7);
        break;

    default:
        break;
    }
    //清除IAR寄存器中的中断号
    GICC->EOIR |= irqno;
}

src/key_inc.c

#include "key_inc.h"

void key1_it_config()
{
    //使能GPIOF的外设时钟
    RCC->MP_AHB4ENSETR |=(0X1<<5);
    //PF9设置为输入模式
    GPIOF->MODER &=(~(0x3<<18));
    //设置由PF9管脚产生EXTI9事件
    EXTI->EXTICR3 &= (~(0xff<<8));
    EXTI->EXTICR3 |= (0X05<<8);
    //通过下降沿检测EXTI9事件是否产生
    EXTI->FTSR1 |= (0X1<<9);
    //取消EXTI9中断屏蔽
    EXTI->C1IMR1 |= (0X1<<9);
    //设置EXTI9中断全局使能
    GICD->ISENABLER[3] |=(0X1<<3);
    //设置中断优先级
    GICD->IPRIORITYR[24] |= (~(0x1f<<27));
    //设置CPUO处理当前中断
    GICD->ITARGETSR[24] |= (0X1<<24);
    //设置组0中断可以被转发到GICC层
    GICD->CTRL |=0X1;
    //设置中断优先级掩码
    GICC->PMR |= (0x1f<<3);
    //设置组0中断交给指定处理器处理
    GICC->CTRL |= 0X1;
}

void key2_it_config()
{
    //使能GPIOF的外设时钟
    RCC->MP_AHB4ENSETR |=(0X1<<5);
    //PF9设置为输入模式
    GPIOF->MODER &=(~(0x3<<14));
    //设置由PF9管脚产生EXTI9事件
    EXTI->EXTICR3 &= (~(0xff<<24));
    EXTI->EXTICR3 |= (0X05<<24);
    //通过下降沿检测EXTI9事件是否产生
    EXTI->FTSR1 |= (0X1<<7);
    //取消EXTI9中断屏蔽
    EXTI->C1IMR1 |= (0X1<<7);
    //设置EXTI9中断全局使能
    GICD->ISENABLER[3] |=(0X1<<1);
    //设置中断优先级
    GICD->IPRIORITYR[24] |= (~(0x1f<<11));
    //设置CPUO处理当前中断
    GICD->ITARGETSR[24] |= (0X1<<8);
    //设置组0中断可以被转发到GICC层
    GICD->CTRL |=0X1;
    //设置中断优先级掩码
    GICC->PMR |= (0x1f<<3);
    //设置组0中断交给指定处理器处理
    GICC->CTRL |= 0X1;
}

void key3_it_config()
{
    //使能GPIOF的外设时钟
    RCC->MP_AHB4ENSETR |=(0X1<<5);
    //PF9设置为输入模式
    GPIOF->MODER &=(~(0x3<<16));
    //设置由PF9管脚产生EXTI9事件
    EXTI->EXTICR3 &= (~(0XFF<<0));
    EXTI->EXTICR3 |= (0X05<<0);
    //通过下降沿检测EXTI9事件是否产生
    EXTI->FTSR1 |= (0X1<<8);
    //取消EXTI9中断屏蔽
    EXTI->C1IMR1 |= (0X1<<8);
    //设置EXTI9中断全局使能
    GICD->ISENABLER[3] |=(0X1<<2);
    //设置中断优先级
    GICD->IPRIORITYR[24] |= (~(0x1f<<19));
    //设置CPUO处理当前中断
    GICD->ITARGETSR[24] |= (0X1<<16);
    //设置组0中断可以被转发到GICC层
    GICD->CTRL |=0X1;
    //设置中断优先级掩码
    GICC->PMR |= (0X1F<<3);
    //设置组0中断交给指定处理器处理
    GICC->CTRL |= 0X1;
}

include/key_inc.h

#ifndef _KEY_INC_H__
#define _KEY_INC_H
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
void key1_it_config();
void key2_it_config();
void key3_it_config();
#endif

相关推荐

  1. ARM按键实验

    2024-03-25 17:16:06       19 阅读
  2. ARM 小灯闪烁

    2024-03-25 17:16:06       17 阅读
  3. ARM按键中断

    2024-03-25 17:16:06       30 阅读
  4. ARM_day7:按键中断

    2024-03-25 17:16:06       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-25 17:16:06       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-25 17:16:06       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-25 17:16:06       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-25 17:16:06       18 阅读

热门阅读

  1. bert-base-chinese另外的加载方法.txt

    2024-03-25 17:16:06       20 阅读
  2. 抖店好不好做?新手小白怎么做?教你从0到1!

    2024-03-25 17:16:06       15 阅读
  3. 宝塔部署项目

    2024-03-25 17:16:06       21 阅读
  4. nicerefresh--自动刷新Spring中@Value的值

    2024-03-25 17:16:06       15 阅读
  5. MySQL索引

    2024-03-25 17:16:06       14 阅读
  6. 蓝桥杯竞赛规则及说明【C/C++】

    2024-03-25 17:16:06       28 阅读
  7. GOF23种设计模式

    2024-03-25 17:16:06       19 阅读
  8. 稀碎从零算法笔记Day24-LeetCode:存在重复元素

    2024-03-25 17:16:06       18 阅读
  9. 记一次Qt多线程槽函数无法触发异常排查

    2024-03-25 17:16:06       18 阅读
  10. 2024蓝桥杯每日一题(树状数组)

    2024-03-25 17:16:06       16 阅读
  11. 渗透测试-ssh私钥泄露知识记录

    2024-03-25 17:16:06       15 阅读