ARM开发,stm32mp157a-A7核中断实验(实现按键中断功能)

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

1.实验目的:实现KEY1/LEY2/KE3三个按键,中断触发打印一句话,并且灯的状态取反;

key1 ----> LED3灯状态取反;

key2 ----> LED2灯状态取反;

key3 ----> LED1灯状态取反;

2.分析框图:

ARM开发,stm32mp157a-A7核中断实验(实现按键中断功能),ARM,arm开发,stm32,c语言

 3.代码:

---key.h头文件---
#ifndef __KEY_H__
#define __KEY_H__

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

typedef enum
{
	FALLING_TRI,  //下降沿触发方式
	RISING_TRI,  //上升沿触发方式
}trigger_t;

//中断RCC章节初始化 PF9 7 8
void hal_interrupt_rcc_init();

//EXTI初始化函数
//EXTI编号 GPIO组号 触发方式
void hal_exti_init(unsigned int extix,unsigned int groupx,trigger_t trix);

//GIC初始化函数
//中断号,中断优先级
void hal_gic_init(unsigned int interruptx,unsigned int priority);

//led初始化函数
void led_init(gpio_t* gpiox,unsigned int pin);


#endif
---key.c函数实现---
#include "key.h"

//中断RCC章节初始化 PF9 7 8
void hal_interrupt_rcc_init()
{
	//RCC章节初始化 PF9 [5]=1
	RCC->MP_AHB4ENSETR |= (0x1 << 5);
	
}

//EXTI初始化函数
//EXTI编号 GPIO组号 触发方式
void hal_exti_init(unsigned int extix,unsigned int groupx,trigger_t trix)
{
	//GPIO章节初始化 设置三个按键为输入模式
	GPIOF->MODER &= (~(0x3 << 2*extix));

	//EXTI章节初始化,引脚信号与EXTI连接
	//1.EXIT_EXTICR组 0x05
	EXTI->EXTICR[extix/4] &= (~(0xff << ((extix%4)*8)));
	EXTI->EXTICR[extix/4] |= (groupx << ((extix%4)*8));

	//2.EXTI_FTSR1 设置下降沿触发方式
	if(trix == FALLING_TRI)
		EXTI->FTSR1 |= (0x1 << extix);
	else
		EXTI->RTSR1 |= (0x1 << extix);
		
	//3.EXTI_IMR1 设置中断不屏蔽 =1
	EXTI->C1IMR1 |= (0x1 << extix);

}

//GIC初始化函数
//中断号,中断优先级
void hal_gic_init(unsigned int interruptx,unsigned int priority)
{
	//GICD初始化
	//1.GICD_CTRL 使能组0 [0]=1
	GICD->CTRL |= (0x1 << 0);

	//2.GICD_ISENABLER组 设置GICD层中断使能
	GICD->ISENABLER[interruptx/32] |= (0x1 << (interruptx % 32));

	//3.GICD_IPRIORITYR组 设置中断优先级  操作高5位
	GICD->IPRIORITYR[interruptx/4] &= (~(0x1f << (interruptx % 4 * 8 + 3)));
	GICD->IPRIORITYR[interruptx/4] |= (priority << (interruptx % 4  * 8 + 3));

	//4.GICD_ITARGETSR组 设置中断目标分配给CPU0
	GICD->ITARGETSR[interruptx/4] &= (~(0x3 << (interruptx % 4 * 8)));
	GICD->ITARGETSR[interruptx/4] |= (0x1 << (interruptx % 4 * 8));

	//GICC初始化
	//1.GICC_CTRL 设置GICC层组0使能 [0]=1
	GICC->CTRL |= (0x1 << 0);

	//2.GICC_PMR 设置GICC层中断优先级 
	GICC->PMR |= ((priority+1) << 3);
}

//led灯初始化
//参数1:GPIO组号
//参数2:引脚编号
void led_init(gpio_t* gpiox,unsigned int pin)
{
	//1输出模式 
	gpiox->MODER &= ~(0x3 << (pin*2));
	gpiox->MODER |= (0x1 << (pin*2));

	//2输出类型
	gpiox->OTYPER &= (~(0x1 << pin));

	//3输出速率
	gpiox->OSPEEDR &= ~(0x3 << (pin*2));
	
	//4拉电阻
	gpiox->PUPDR &= ~(0x3 << (pin*2));
}

---do_irq.c终端处理函数---
#include "key.h"

extern void printf(const char *fmt, ...);

//中断处理函数
void do_irq(void) 
{
	//1获取中断号 IAR[9:0]
	unsigned int num = 0;
	num = GICC->IAR & 0x3ff;
	
	//2判断中断号,并且打印一句话
	switch(num)
	{
	case 99:
		printf("KEY1按键中断,LED3灯取反\n");
		
		//led3灯状态取反
		GPIOE->ODR ^= (0x1 << 8);

		//3清除EXTI层中断挂起标志位 [9]=1
		//EXTI_FDR1 [9]=1
		EXTI->FPR1 |= (0x1 << 9);

		//4清除GICD层中断挂起标志位
		//GICD_ICPENDR3 [3]=1
		GICD->ICPENDR[3] |= (0x1 << 3);

		break;

	case 97:
		printf("KEY2按键中断,LED2灯取反\n");

		//led2灯状态取反
		GPIOF->ODR ^= (0x1 << 10);

		//清除EXTI层中断挂起标志位 [9]=1
		EXTI->FPR1 |= (0x1 << 7);
		GICD->ICPENDR[3] |= (0x1 << 1);
		
		break;

	case 98:
		printf("KEY3按键中断,LED1灯取反\n");	
	
		//led1灯状态取反
		GPIOE->ODR ^= (0x1 << 10);
	
		EXTI->FPR1 |= (0x1 << 8);
		GICD->ICPENDR[3] |= (0x1 << 2);
	
		break;
	}
	
	//5清楚获取到的中断号
	GICC->EOIR = num;

}
---main.c测试文件---
#include "key.h"

extern void printf(const char *fmt, ...);

void delay_ms(int ms)

{
	int i,j;
	for(i = 0; i < ms;i++)
		for (j = 0; j < 1800; j++);
}

#define GPIO_PIN10 10  //引脚编号
#define GPIO_PIN8 8
#define EXTI9 9   //EXTI编号
#define EXTI7 7
#define EXTI8 8
#define GPIOF_GROUP 0x05   //GPIOF组号
#define KEY1_ID 99   //中断号
#define KEY2_ID 97
#define KEY3_ID 98
#define KEY1_PRIORITY 9   //中断优先级
#define KEY2_PRIORITY 7
#define KEY3_PRIORITY 8

int main()
{
	//使能三盏灯PE10 PF10 PE8
	RCC->MP_AHB4ENSETR |= (0x3 << 4);

	//led初始化函数
	led_init(GPIOE,GPIO_PIN10);
	led_init(GPIOF,GPIO_PIN10);
	led_init(GPIOE,GPIO_PIN8);

	//中断RCC章节初始化 PF9 7 8
	hal_interrupt_rcc_init();

	//EXTI初始化函数
	hal_exti_init(EXTI9,GPIOF_GROUP,FALLING_TRI);
	hal_exti_init(EXTI7,GPIOF_GROUP,FALLING_TRI);
	hal_exti_init(EXTI8,GPIOF_GROUP,FALLING_TRI);

	//GIC初始化函数
	hal_gic_init(KEY1_ID,KEY1_PRIORITY);
	hal_gic_init(KEY2_ID,KEY2_PRIORITY);
	hal_gic_init(KEY3_ID,KEY3_PRIORITY);

	while(1)
	{

	}

	return 0;

}

4.实验现象: 

ARM开发,stm32mp157a-A7核中断实验(实现按键中断功能),ARM,arm开发,stm32,c语言

ARM开发,stm32mp157a-A7核中断实验(实现按键中断功能),ARM,arm开发,stm32,c语言文章来源地址https://www.toymoban.com/news/detail-674628.html

到了这里,关于ARM开发,stm32mp157a-A7核中断实验(实现按键中断功能)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • STM32MP157驱动开发——按键驱动(tasklet)

    阅读Linux 系统中异常与中断可知,Linux 系统对中断处理的演进过程中,实现了中断的扩展:硬件中断、软件中断 硬件中断有:GPIO,网络中断(net),系统滴答中断(tick)等 软件中断有:定时器,tasklet等 内核中的软中断: 该数组里面有个action成员,该成员是个函数,函数会调

    2024年02月14日
    浏览(43)
  • STM32MP157驱动开发——按键驱动(工作队列)

    定时器、下半部 tasklet,它们都是在中断上下文中执行,它们无法休眠。当要处理更复杂的事情时,往往更耗时。这些更耗时的工作放在定时器或是下半部中,会使得系统很卡;并且循环等待某件事情完成也太浪费CPU 资源了。如果使用线程来处理这些耗时的工作,那就可以解

    2024年02月15日
    浏览(39)
  • STM32MP157驱动开发——按键驱动(异步通知)

    Linux 系统中也有很多信号,在 Linux 内核源文件 includeuapiasm-genericsignal.h 中,有很多信号的宏定义: 就 APP 而言,你想处理 SIGIO 信息,那么需要提供信号处理函数,并且要跟 SIGIO 挂钩。这可以通过一个 signal 函数 来“给某个信号注册处理函数”,用法如下: 重点从②开始:

    2024年02月15日
    浏览(53)
  • STM32MP157驱动开发——按键驱动(休眠与唤醒)

    当应用程序必须等待某个事件发生,比如必须等待按键被按下时,可以使用“休眠-唤醒”机制: ① APP 调用 read 等函数试图读取数据,比如读取按键; ② APP 进入内核态,也就是调用驱动中的对应函数,发现有数据则复制到用户空间并马上返回; ③ 如果 APP 在内核态,也就

    2024年02月16日
    浏览(42)
  • STM32MP157驱动开发——按键驱动(POLL 机制)

    使用休眠-唤醒的方式等待某个事件发生时,有一个缺点:等待的时间可能很久。我们可以加上一个超时时间,这时就可以使用 poll 机制。 ① APP 不知道驱动程序中是否有数据,可以先调用 poll 函数查询一下,poll 函数可以传入超时时间; ② APP 进入内核态, 调用到驱动程序的

    2024年02月15日
    浏览(38)
  • STM32MP157驱动开发——按键驱动(线程化处理)

    工作队列是在内核的线程的上下文中执行的 工作队列中有多个 work,前一个 work 没处理完会影响后面的 work。解决方法有如下2种: 比如自己创建一个内核线程,不跟别的 work 在一块。例如存储设备比如 SD/TF采用的就是单独一个线程。 使用线程化的中断处理。中断的处理仍然

    2024年02月16日
    浏览(43)
  • STM32MP157驱动开发——按键驱动(定时器)

    定时器涉及函数参考内核源码:includelinuxtimer.h 给定时器的各个参数赋值: 设置定时器 :主要是初始化 timer_list 结构体,设置其中的函数、参数。 a) 向内核添加定时器。timer-expires 表示超时时间。 b) 当超时时间到达,内核就会调用这个函数:timer-function(timer-data)。 修改定时

    2024年02月15日
    浏览(53)
  • SQLite3移植STM32MP157 ARM开发板

    移植首先就得有源码,从SQLite官网下载最新版源码 下载地址 这里使用的环境为Ubuntu16 所以直接在Ubuntu下下载的。 下载完成后解压文件 进入解压后的目录 进入后可以看到解压出的源码文件如下 配置生成Makefile 在源码个目录下执行如下命令 –host为指定交叉编译器为arm-linux-

    2024年02月07日
    浏览(38)
  • 驱动开发,stm32mp157a开发板的led灯控制实验

            编写LED灯的驱动,在应用程序中编写控制LED灯亮灭的代码逻辑实现LED灯功能的控制; LED1-PE10 LED1亮灭: RCC寄存器[4]-1 0X50000A28 GPIOE_MODER[21:20]-01 (输出) 0X50006000 GPIOE_ODR[10]-1(输出高电平) 0(输出低电平)0X50006014 LED2-PF10 LED2亮灭: RCC寄存器[5]-1 0X50000A28 GPIOE_MODER[21:20]

    2024年02月09日
    浏览(44)
  • 【STM32】外部中断实现按键实验

    🐱作者:一只大喵咪1201 🐱专栏:《STM32学习》 🔥格言: 你只管努力,剩下的交给时间! 在前面的文章控制LED和蜂鸣器的按键实验中详细的讲解了怎样通过GPIO的输入模式来控制LED灯和蜂鸣器的状态。这篇文章同样是实现上诉的功能,但是方式是采用外部中断的方式实现的

    2024年02月05日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包