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日
    浏览(43)
  • 驱动开发 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日
    浏览(55)
  • 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中断实验

    main.c do_irq.c key_inc.c

    2024年03月26日
    浏览(46)
  • ARM软中断流程详解

    中断流程:①发生中断操作。②程序跳转至相应中断处理函数。③保存现场、处理功能、恢复现场。④程序跳转正常模式继续运行 注:本文将以软中断swi 2指令,在SVC与user两种模式的切换做详细解释。 先来看发生中断时候的特定函数 这里我们先开辟两个空间,存放发生中断后

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

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

    2024年02月11日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包