ARM 中断实验

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

ARM 中断实验,linux,运维,服务器

key.h

#ifndef _H_
#define _H_
//KEY1-->PF9
#include "stm32mp1xx_exti.h" 
#include "stm32mp1xx_gic.h"  
#include "stm32mp1xx_rcc.h" 
#include "stm32mp1xx_gpio.h"

void key_rcc_gpio_init();

void led_gpio_init(gpio_t *gpiox,unsigned int pin);

void hal_exit_pf9_init(unsigned int pin);

void hal_gic_pf9_init(unsigned int id);

#endif

key.c

#include "key.h"
void key_rcc_gpio_init()
{
	//RCC章节初始化 GPIOF组控制器使能[5]=1
	RCC->MP_AHB4ENSETR |=(0x1<<5);

	//GPIO章节初始化 PF9[19,18],8[15,14],7[17,16]输入模式=00
	GPIOF->MODER &= (~(0x3 << 18));
	GPIOF->MODER &= (~(0x3 << 14));
	GPIOF->MODER &= (~(0x3 << 16));

}

void led_gpio_init(gpio_t *gpiox,unsigned int pin)
{
	//GPIO的led章节初始化
	//MODER设置为输出模式01
	gpiox->MODER &= (~(0x3 << 2*pin));
	gpiox->MODER |= (0X1 << 2*pin);

	//OTYPER设置为推挽输出类型0 
	gpiox->OTYPER &=(~(0X1 << pin));

	//OSPEEDR设置为输出低速 00
	gpiox->OSPEEDR &= (~(0X3 << 2*pin));

	//PUPDR设置为禁止上下拉电阻 00
	gpiox->PUPDR &= (~(0x3 << 2*pin));

	//ODR设置为开关
	//gpiox->ODR &= (~(0X1 << pin));熄灭
	//gpiox->ODR |= (0x1 << pin);点亮
	
}

//RCC/GPIO/EXTI章节初始化
void hal_exit_pf9_init(unsigned int pin)
{	
	//EXTI章节初始化	
	//EXTICR3 外部中断选择寄存器 按键与引脚连接 [15:8][31:24][7:0]=0x05
	if((pin/4)+1==3)
	{
	EXTI->EXTICR3 &= (~(0xff << (pin%4)*8));
	EXTI->EXTICR3 |= (0x5 << (pin%4)*8);
	}
	else if((pin/4)+1==2)
	{
	EXTI->EXTICR2 &= (~(0xff <<(pin%4)*8));
	EXTI->EXTICR2 |= (0x5 <<(pin%4)*8);
	}

	//FTSR1 [9:7]=0x7 设置触发为下降沿
	EXTI->FTSR1 |= (0x1 << pin);

	//IMR1 [9:7]=0X7 中断屏蔽器
	EXTI->C1IMR1 |= (0X1 << pin);
	
}
//GIC章节初始化
void hal_gic_pf9_init(unsigned int id)
{

	//GPCD章节初始化
	//CTLR [0]=0X0
	GICD->CTRL |= (0x1 <<0);

	//ISENABLER3 [3:1]=0X1
	GICD->ISENABLER[3] |= (0x1 << (id%32));

	//IPRIORITYR4 [31:27][15:11][23:19]=0B00000
	GICD->IPRIORITYR[24] &= (~(0x1f << (id%4*8+3)));
	 
	//ITARGETSR4 [25:24][9:8][17:16]=0B01
	GICD->ITARGETSR[24] &= (~(0X3 << (id%4*8)));
	GICD->ITARGETSR[24] |= (0X1 << (id%4*8));


	//GPCC章节初始化
	//CTLR[0]=1
	GICC->CTRL |= (0X1);

	//PMR[7:3]=0B11111
	GICC->PMR |= (0X1F <<3);
	
}

do_irq.c

#include "key.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
//中断处理函数
void do_irq(void) 
{
	//1.获取中断号
	i=GICC->IAR &(0x3ff);
	//2.判断中断号,并且打印一句话
	switch(i)
	{
	case 99:
		printf("I am key1\n");
	//3.清除EXTI层中断挂起标志位
	EXTI->FPR1 |= (0X1 <<9);
	//4.清除GICD层中断挂起标志位 ICPENDR[3]第三位
	GICD->ICPENDR[3] |= (0X1 <<3);	
	
	GPIOE->ODR ^=(0X1<<10);
	break;
	case 98:
		printf("I am key3\n");
	//3.清除EXTI层中断挂起标志位
	EXTI->FPR1 |= (0X1 <<8);
	//4.清除GICD层中断挂起标志位 ICPENDR[3]第三位
	GICD->ICPENDR[3] |= (0X1 <<2);
	GPIOE->ODR ^=(0X1<<8);
	break;
	case 97:
		printf("I am key2\n");
	//3.清除EXTI层中断挂起标志位
	EXTI->FPR1 |= (0X1 <<7);
	//4.清除GICD层中断挂起标志位 ICPENDR[3]第三位
	GICD->ICPENDR[3] |= (0X1 <<1);
	GPIOF->ODR ^=(0X1<<10);
	break;
	}
	//5.清除获取到中断号
	GICC->EOIR = i;

}

 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++);
}


int main()
{
	key_rcc_gpio_init();	
	led_gpio_init(GPIOE,10);
	led_gpio_init(GPIOF,10);
	led_gpio_init(GPIOE,8);

	hal_exit_pf9_init(7);
	hal_exit_pf9_init(8);
	hal_exit_pf9_init(9);

	hal_gic_pf9_init(97);
	hal_gic_pf9_init(98);
	hal_gic_pf9_init(99);


	while(1);
	return 0;
}

 ARM 中断实验,linux,运维,服务器文章来源地址https://www.toymoban.com/news/detail-673624.html

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

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

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

相关文章

  • Linux本地部署1Panel服务器运维管理面板并实现公网访问

    1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器,包括主机监控、文件管理、数据库管理、容器管理等 下面我们介绍在Linux 本地安装1Panel 并结合cpolar 内网穿透工具实现远程访问1Panel 管理界面 执行如下命令一键安装 1Panel: 安

    2024年02月04日
    浏览(58)
  • [1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

    本期测评试用一下1Panel这款面板。1Panel是国内飞致云旗下开源产品。整个界面简洁清爽,后端使用GO开发,前端使用VUE的Element-Plus作为UI框架,整个面板的管理都是基于docker的,想法很先进。官方还提供了视频的使用教程,本期为大家按照本专栏的基本内容进行多方面的测评。

    2024年02月07日
    浏览(73)
  • linux:http服务器搭建及实验案例

    1,安装http服务 2,将 /etc/selinux/config 文件下面的 SELINUX值 改为 disabled 或者 permissive 。 3,关闭防火墙 systemctl stop firewalld 做上面的工作是为了http在提供服务时让其不会阻止读取一些文件。 /etc/httpd/ 里面是http的主要的配置文件 tree /etc/httpd/ 可以看到这个文件的结构一目了然

    2024年02月09日
    浏览(31)
  • Linux服务器常见运维性能测试(3)CPU测试super_pi、sysbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月02日
    浏览(39)
  • 华为云云耀云服务器L实例评测 | Linux系统宝塔运维部署H5游戏

    本章节内容,我们主要介绍华为云耀服务器L实例,从云服务的优势讲起,然后讲解华为云耀服务器L实例资源面板如何操作,如何使用宝塔运维服务,如何使用运维工具可视化安装nginx,最后部署一个自研的H5的小游戏(6岁的小朋友玩的很开心😁)。 前端的同学如果想把自己

    2024年02月07日
    浏览(46)
  • 【Linux实验】将个人主页上传到服务器

    l 网页制作; l 熟悉 Linux FTP or scp 拷贝; l 熟悉 apache 权限配置。 l 创建个人主页; l 用 FTP 或 scp 上传服务器; l chmod 设置目录权限; l Web 访问。 略。 在个人目录下创建public_html文件夹: mkdir public_html 连接服务器: psftp open 172.27.85.106 输入账号密码: login as: stu2394 stu2394@17

    2024年02月12日
    浏览(27)
  • 头歌实验10-3:Linux 远程联机服务(三)- SSH服务器

    上答案 还是下载 上答案 上答案 我是改的判定文件 键盘输入ggdG 键盘输入i 点击[Esc] 键盘输入 :wq

    2024年02月03日
    浏览(34)
  • 头歌实验10-1:Linux 远程联机服务(一)- Telnet服务器

    任务: 1,安装Telnet客户端 2,安装Telnet服务器 上答案: 按以下输入便是: 补充说明: 如果出现了这种情况, 直接输入y 任务 打开Telnet服务 上答案: 如果你退出了头歌,那么你需要再次执行 然后 就好了。 任务 新创建一个用户testUser; 为用户testUser设置密码; 使用telnet去

    2024年02月04日
    浏览(48)
  • 【Linux】(七)实验室服务器外网访问

    两项内容需要向管理员获取: 私有域名 白名单密码 进入 http://私有域名:10087/ipList ,输入密码登录后,点击添加IP,将会跳转网页,并会自动填充当前所处的IP,填写好备注信息,点击保存将添加自己当前的所处的公网IP添加到白名单中 2. VS code 中打开自己电脑的 ssh 配置文件

    2024年02月11日
    浏览(42)
  • Linux 第三章:实验案例:MySQL服务器的构建与维护

    实验环境 某公司因业务范围臼益扩大.最近订购了---套基于B/S架构的电子商务系统.在正式部署之前,要求对现有的httpd服务器进行改造,首先需要增加MySQL数据库服务。 需求描述 1,为MySOL数据库的root 用户设置密码.删除用户名.密码为空的用户记录。 2,新建名为“bdqn”

    2024年02月05日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包