ARM_day7:按键中断

这篇具有很好参考价值的文章主要介绍了ARM_day7:按键中断。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现三个按键中断,按键按下时,LED灯亮 

mykey.h
#ifndef __MYKEY_H__
#define __MYKEY_H__

#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_exti.h"

void key1_int_config();
void key2_int_config();
void key3_int_config();

void led_init();
void LED1_CTRL(int flag);
void LED2_CTRL(int flag);
void LED3_CTRL(int flag);

#endif
mykey.c
#include "mykey.h"

void key1_int_config()
{
    //使能GPIOF外设时钟
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    //设置PF9为输入
    GPIOF->MODER &= (~(0x3<<18));
    //设置PF9产生EXTI9事件
    EXTI->EXTICR3 &= (~(0xff<<8));
    EXTI->EXTICR3 |= (0x5<<8);
    //设置下降沿检测PF9事件
    EXTI->FTSR1 |= (0x1<<9);
    //取消EXTI9事件的屏蔽
    EXTI->C1IMR1 |= (0x1<<9);
    //全局使能99号中断
    GICD->ISENABLER[3] |= (0x1<<3);
    //设置99号中断的优先级
    GICD->IPRIORITYR[24] &= (~(0x1f<<27));  //00000
    //设置99号中断的目标处理器
    GICD->ITARGETSR[24] |= (0x1<<24);   //交给处理器0处理
    //允许组0中断被转发到GICC层
    GICD->CTRL |= 0x1;
    //设置中断优先级掩码
    GICC->PMR |= (0x1f<<3);     //掩码为11111
    //允许组0中断被转发给处理器
    GICC->CTRL |= 0x1;
}
void key2_int_config()
{
    //使能GPIOF外设时钟
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    //设置PF8为输入
    GPIOF->MODER &= (~(0x3<<16));
    //设置PF8产生EXTI8事件
    EXTI->EXTICR3 &= (~(0xff));
    EXTI->EXTICR3 |= (0x5);
    //设置下降沿检测PF8事件
    EXTI->FTSR1 |= (0x1<<8);
    //取消EXTI8事件的屏蔽
    EXTI->C1IMR1 |= (0x1<<8);
    //全局使能98号中断
    GICD->ISENABLER[3] |= (0x1<<2);
    //设置98号中断的优先级
    GICD->IPRIORITYR[24] &= (~(0x1f)<<19);  //00000
    //设置98号中断的目标处理器
    GICD->ITARGETSR[24] |= (0x1<<16);   //交给处理器0处理
    //允许组0中断被转发到GICC层
    GICD->CTRL |= 0x1;
    //设置中断优先级掩码
    GICC->PMR |= (0x1f<<3);     //掩码为11111
    //允许组0中断被转发给处理器
    GICC->CTRL |= 0x1;
}
void key3_int_config()
{
    //使能GPIOF外设时钟
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    //设置PF7为输入
    GPIOF->MODER &= (~(0x3<<14));
    //设置PF7产生EXTI7事件
    EXTI->EXTICR2 &= (~(0xff<<24));
    EXTI->EXTICR2 |= (0x5<<24);
    //设置下降沿检测PF7事件
    EXTI->FTSR1 |= (0x1<<7);
    //取消EXTI7事件的屏蔽
    EXTI->C1IMR1 |= (0x1<<7);
    //全局使能97号中断
    GICD->ISENABLER[3] |= (0x1<<1);
    //设置97号中断的优先级
    GICD->IPRIORITYR[24] &= (~(0x1f)<<11);  //00000
    //设置97号中断的目标处理器
    GICD->ITARGETSR[24] |= (0x1<<8);   //交给处理器0处理
    //允许组0中断被转发到GICC层
    GICD->CTRL |= 0x1;
    //设置中断优先级掩码
    GICC->PMR |= (0x1f<<3);     //掩码为11111
    //允许组0中断被转发给处理器
    GICC->CTRL |= 0x1;
}
main.c
#include "mykey.h"

//手动封装一个延时函数
void delay(int ms)
{
	int i,j;
	for(i=0;i<ms;i++)
	{

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

		}
	}

}
int main()
{
	//按键中断初始化
	key1_int_config();
	key2_int_config();
	key3_int_config();
	//led灯初始化
	led_init();
	while(1)
	{

	}
	return 0;
}
do_irq.c
#include "mykey.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void)
{
    // 获取中断号
    unsigned int irqno = (GICC->IAR & 0x3ff);
    switch (irqno)
    {
    case 99:
        // 中断处理逻辑
        LED1_CTRL(1);
        LED2_CTRL(0);
        LED3_CTRL(0);
        // 清除GICD的中断标志
        GICD->ICPENDR[3] |= (0x1 << 3);
        // 清除EXTI中的中断触发标志
        EXTI->FPR1 |= (0x1 << 9);
        break;
    case 98:
        // 中断处理逻辑
        LED1_CTRL(0);
        LED2_CTRL(1);
        LED3_CTRL(0);
        // 清除GICD的中断标志
        GICD->ICPENDR[3] |= (0x1 << 2);
        // 清除EXTI中的中断触发标志
        EXTI->FPR1 |= (0x1 << 8);
        break;
    case 97:
        // 中断处理逻辑
        LED1_CTRL(0);
        LED2_CTRL(0);
        LED3_CTRL(1);
        // 清除GICD的中断标志
        GICD->ICPENDR[3] |= (0x1 << 1);
        // 清除EXTI中的中断触发标志
        EXTI->FPR1 |= (0x1 << 7);
        break;
    default:
        break;
    }
    // 清除IAR寄存器中保存的中断号
    GICC->EOIR = irqno;
}
 

文章来源地址https://www.toymoban.com/news/detail-855694.html

到了这里,关于ARM_day7:按键中断的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ARM实验6-基于中断的按键处理程序实验

    一、实验名称:基于中断的按键处理程序实验 二、实验目的:         1.掌握ARM处理器的中断处理过程。         2.掌握ARM处理器中断服务程序的编写方法。         3.通过该编程实验,进一步巩固和强化学生ARM汇编编程的能,ARM应用程序框架,培养学生实际应用的

    2024年02月08日
    浏览(43)
  • 【ARM】Day8 中断

    1. 思维导图 2. 实验要求: 实现KEY1/LEY2/KE3三个按键,中断触发打印一句话,并且灯的状态取反 key1 ---- LED3灯状态取反 key2 ---- LED2灯状态取反 key3 ---- LED1灯状态取反 key3.h led.h key3.c led.c do_irq.c main.c 运行结果:

    2024年02月11日
    浏览(41)
  • 驱动开发 day8 (设备树驱动,按键中断实现led亮灭)

    //编译驱动  (注意Makefile的编译到移植到开发板的内核)         make arch=arm //清除编译生成文件         make clean ****************************************** //安装驱动         insmod mycdev.ko //卸载驱动         rmmod mycdev   需要在内核路径/arch/arm/boot/dts/  修改 stm32mp157a-fsmp1a-dts 文件 *

    2024年02月14日
    浏览(41)
  • L16物联网ARM开发--开发环境搭建及平台及GPIO口操作平台介绍(day2、3)

    目录 一、MDK-ARM环境介绍及安装 二、STM32Cube简介及安装   STM32CubeMX安装 加载固件库 ​编辑  三、 STM32F0存储器映射 四、STM32启动文件分析 略 五、GPIO的基本概念及寄存器介绍1 1、GPIO接口简介  2、GPIO功能复用  3、GPIO寄存器介绍  GPIO工作原理框图: 五、点亮LED寄存器版(

    2024年02月01日
    浏览(53)
  • ARM按键控制灯光

    uartt.c main.c uartt.h

    2024年02月04日
    浏览(35)
  • ARM裸机 - 中断处理编程实战_arm断电文件内容丢失

    #define exception_vector_table_base 0xD0037400 #define exception_reset (exception_vector_table_base + 0x00) #define exception_undef (exception_vector_table_base + 0x04) #define exception_sotf_int (exception_vector_table_base + 0x08) #define exception_prefetch (exception_vector_table_base + 0x0C) #define exception_data (exception_vector_table_base + 0x10) #de

    2024年04月16日
    浏览(80)
  • 【ARM】-异常与中断

    中断(Interrupt)机制,即处理器在顺序执行程序指令流的过程中突然被别的请求打断而中止执行当前的程序,转而去处理别的事情,待其处理完了别的事情,然后重新回到之前程序中断的点继续执行之前的程序指令流,其要点如下 中断请求、中断源 打断处理器执行程序指令流的

    2024年02月12日
    浏览(38)
  • ARM 中断实验

    key.h key.c do_irq.c  main.c  

    2024年02月11日
    浏览(39)
  • ARM中断实验

    main.c do_irq.c key_inc.c

    2024年03月26日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包