ARM day9 (按键中断控制led亮灭)

key.h

#ifndef __KEY_H__
#define __KEY_H__#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"//事件号
#define EXTI_7 7
#define EXTI_8 8
#define EXTI_9 9//中断号
#define EXTI7 97
#define EXTI8 98
#define EXTI9 99//key_exit初始化
void hal_key_exti_init(volatile unsigned int exti,gpio_t* gpiox,volatile unsigned int* style);//key_gic初始化
void hal_key_gic_init(unsigned int extid);/********LED*章节*********/
//寄存器的模型
typedef enum{INPUT,  	//输入 0OUTPUT,   	//输出 1 ALT, 		//2ANALOG, 	//3
}gpio_moder_t;
//寄存器输出类型
typedef enum{PP, 	//推挽 0OD, 	//开漏 1
}gpio_otyper_t;
//寄存器数据输出速率
typedef enum{LOW, 	//低速 00MED, 	//中速 01HIGH, 	//高速 10HIGHEST,//超高速 11
}gpio_ospeedr_t;
//上下拉电阻寄存器
typedef enum{NO_PUPDR, 	//禁止 0PU,  		//上拉 1PD, 		//下拉 2
}gpio_pupdr_t;//高低电平
typedef enum{GPIO_RESET_T,  	//低电平 0GPIO_SET_T, 	//高电平 1
}gpio_odr_t;typedef struct{gpio_moder_t moder; 	//引脚模式gpio_otyper_t otyper; 	//输出类型gpio_ospeedr_t ospeedr; //输出速度gpio_pupdr_t pupdr; 	//是否上下拉
}gpio_init_t;//LED_GPIO初始化
void hal_led_gpio_init(gpio_t* gpiox,unsigned int pin,gpio_init_t* init);//LED_操作
void operate_led(gpio_t* gpiox,unsigned int pin);//LED_ON
void turn_on(gpio_t* gpiox,unsigned int pin);//LED_OFF
void turn_off(gpio_t* gpiox,unsigned int pin);#endif

key.c

#include "key.h"
extern void delay_ms(int ms);//key_exit初始化
void hal_key_exti_init(unsigned int exti,gpio_t* gpiox,volatile unsigned int* style)
{//   RCC章节初始化//  1.GPIO使能////unsigned int a = (unsigned int)(gpiox - GPIOA)/256;RCC->MP_AHB4ENSETR |= (0x1 << 5);//    GPIO章节初始化GPIOF_MODERgpiox->MODER &= (~(0x3 << exti*2));//   EXTI章节初始化 //2.设置EXTI选择寄存器 EXTI_EXITCRx*(&(EXTI->EXTICR1) + (exti/4)) &= (~(0xff << (exti%4)*8)); *(&(EXTI->EXTICR1) + (exti/4)) |= (5 << (exti%4)*8);/*	switch(exti/4){case 1:EXTI->EXTICR2 &= (~(0xff << (exti%4)*8));EXTI->EXTICR2 |= (0x5 << (exti%4)*8);break;case 2:EXTI->EXTICR3 &= (~(0xff << (exti%4)*8));EXTI->EXTICR3 |= (0x5 << (exti%4)*8);break;case 3:EXTI->EXTICR4 &= (~(0xff << (exti%4)*8));EXTI->EXTICR4 |= (0x5 << (exti%4)*8);break;}*///2.设置中断通信为下降沿触发EXTI_FTSR1*style |= (0x1 << exti);//3.设置中断不屏蔽EXTI_C1IMR1EXTI->C1IMR1 |= (0x1 << exti);
}//key_gic初始化
void hal_key_gic_init(unsigned int extid)
{//       GICD章节初始化//1.设置GICD层组控制器使能GICD->CTRL |= 0x1;//2.设置GICD层中断设置使能寄存器GICD->ISENABLER[extid/32] |= (0x1 << extid%32);//3.设置GICD层中断优先级寄存器GICD->IPRIORITYR[extid/4] &= (~(0x1f << ((extid%4)*8+3)));//4.设置GICD层中断目标分配寄存器GICD->ITARGETSR[extid/4] &= (~(0x3 << (extid%4)*8));GICD->ITARGETSR[extid/4] |= (0x1 << (extid%4)*8);//       GICC章节初始化//1.设置GICC层控制使能寄存器GICC->CTRL |= (0x1 << 0);//2.设置GICC层中断优先级寄存器GICC->PMR |= (0x1f << 3);}/********LED*章节*********/
//LED_GPIO初始化
void hal_led_gpio_init(gpio_t* gpiox,unsigned int pin,gpio_init_t* init)
{// moder; 	//引脚模式gpiox->MODER &= (~(0x3  << pin*2));gpiox->MODER |= (init->moder << pin*2);// otyper; 	//输出类型gpiox->OTYPER &= (~(0x1 << pin));gpiox->OTYPER |= (init->otyper << pin);// ospeedr; //输出速度gpiox->OSPEEDR &= (~(0x3 << pin));gpiox->OSPEEDR |= (init->ospeedr << pin*2 );// pupdr; 	//是否上下拉gpiox->PUPDR &= (~(0x3 << pin*2));gpiox->PUPDR |= (init->pupdr << pin*2);}//LED_操作
void operate_led(gpio_t* gpiox,unsigned int pin)
{if((gpiox->ODR & (0x1 << pin)) == 0){turn_on(gpiox,pin);}else{turn_off(gpiox,pin);}
}//LED_ON
void turn_on(gpio_t* gpiox,unsigned int pin)
{gpiox->ODR |= (0x1 << pin);
}//LED_OFF
void turn_off(gpio_t* gpiox,unsigned int pin)
{gpiox->ODR &= (~(0x1 << pin));
}

do_irq.c

#include "key.h"extern void printf(const char *fmt, ...);
void do_irq(void) 
{unsigned int num;//获取中断号 IAR[9:0]num = GICC->IAR & (0x3ff);//判断中断号//99--->KEY1//98--->KEY3//97--->KEY2switch(num){case 97:printf("key2 pressed!!!!!!\n");//LED2operate_led(GPIOF,10);//1.消除EXTI层中断挂起标志位 FPR1 [9] = 1EXTI->FPR1 |= (0x1 << 7);//2.消除GICD层中断挂起标志位 ICPENDR[3] |= (0x1 << 3) GICD->ICPENDR[num/32] |= (0x1 << (num%32));break;case 98:printf("key3 pressed!!!!!!\n");//LED1operate_led(GPIOE,10);//1.消除EXTI层中断挂起标志位 FPR1 [9] = 1EXTI->FPR1 |= (0x1 << 8);//2.消除GICD层中断挂起标志位 ICPENDR[3] |= (0x1 << 3) GICD->ICPENDR[num/32] |= (0x1 << (num%32));break;case 99:printf("key1 pressed!!!!!!\n");//LED3operate_led(GPIOE,8);//1.消除EXTI层中断挂起标志位 FPR1 [9] = 1EXTI->FPR1 |= (0x1 << 9);//2.消除GICD层中断挂起标志位 ICPENDR[3] |= (0x1 << 3) GICD->ICPENDR[num/32] |= (0x1 << (num%32));break;}//3.消除GICC层挂起标志位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++);
}void hal_exti_init()
{hal_key_exti_init(EXTI_7,GPIOF,&EXTI->FTSR1);hal_key_exti_init(EXTI_8,GPIOF,&EXTI->FTSR1);hal_key_exti_init(EXTI_9,GPIOF,&EXTI->FTSR1);
}void hal_gic_init()
{hal_key_gic_init(EXTI7);hal_key_gic_init(EXTI8);hal_key_gic_init(EXTI9);
}
void hal_led_init()
{//RCC使能RCC->MP_AHB4ENSETR |= (0x3 << 4);//设定initgpio_init_t init = {OUTPUT,PP,LOW,NO_PUPDR};//LED1 PE10hal_led_gpio_init(GPIOE,10,&init);//LED2 PF10hal_led_gpio_init(GPIOF,10,&init);//LED3 PE8hal_led_gpio_init(GPIOE,8,&init);
}int main()
{//exti初始化hal_exti_init();//gic初始化hal_gic_init();//led初始化hal_led_init();hal_put_string("KEY TEXT READY\n");while(1){}return 0;
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/18822.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学无止境·MySQL④(多表查询)

多表查询试题 试题一1、创建表2、表中添加数据3、查询每个部门的所属员工4、查询研发部门的所属员工5、查询研发部和销售部的所属员工6、查询每个部门的员工数,并升序排序7、查询人数大于等于3的部门&#xff0c;并按照人数降序排序 试题一 1、创建表 use mydb3; – 创建部门…

NAT介绍

目录 NAT NAT的配置——配置位置都是在边界路由器的出接口上进行配置 静态NAT 动态NAT——多对多的NAT NAPT——easy IP 多对多的NAPT 端口映射——高级用法 NAT——网络地址转换 IPV4地址不够用 NAT ABC——三类地址中截取了一部分地址&#xff08;并且让这一部分地址可以重复…

MySQL-分库分表详解(一)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

【数据结构】24王道考研笔记——串

四、串 串的定义 串&#xff08;字符串&#xff09;是由零个或多个字符组成的有限序列。 子串&#xff1a;串中任意个连续的字符组成的子序列主串&#xff1a;包含子串的串字符在主串中的位置&#xff1a;字符在串中的序号子串在主串中的位置&#xff1a;子串的第一个字符在…

docker 里面各种 command not found 总结

一、ip&#xff1a;command not found 执行命令&#xff1a; apt-get update & apt-get install -y iproute2 二、yum&#xff1a;command not found 执行命令&#xff1a; apt-get update & apt-get install -y yum 三、ping&#xff1a;command not found 执行命…

一、简易搭建本地CAS服务端

CAS服务端war包下载 https://repo1.maven.org/maven2/org/apereo/cas/cas-server-webapp-tomcat/5.3.14/ 可使用迅雷下载cas-server-webapp-tomcat-5.3.14.war &#xff0c;速度很快 将wab包放到本地tomcat的webapps下D:\tomcat\apache-tomcat-8.5.63\webapps\cas\WEB-INF\clas…

解决Anaconda第三方库下载慢

1.打开Anconda Prompt&#xff0c;进入后台 2.执行命令第一个是添加一个清华镜像&#xff0c;第二个设置在 conda 显示通道的 URL。 &#xff08;1&#xff09;conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ &#xff08;2&#xff0…

RocketMQ5.0消息存储<四>_刷盘机制

RocketMQ5.0消息存储<四>_刷盘机制 一、刷盘概览 RocketMQ存储与读写是基于JDK NIO的内存映射机制(MappedByteBuffer),消息存储时首先将消息追加到文件内存映射(commit操作),再根据配置的刷盘策略在不同时间进行刷写到磁盘(flush操作)。同步刷盘,消息提交到文件内…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第二十二天 22/50

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

C#核心知识回顾——12.lambda表达式、List排序、协变和逆变

1.Lambda表达式 可以将lambad表达式理解为匿名函数的简写 它除了写法不同外&#xff0c;使用上和匿名函数一模一样 都是和委托或者事件配合使用的 //匿名函数 //delegate&#xff08;参数列表&#xff09; //{ //} //lambda表达式 //(参数列表) > //{ //函数体 //…

【Maven】类或者包提示找不到,报红

背景 使用IDEA&#xff0c;类或者包提示找不到&#xff0c;报红 解决方法 1. maven reload 2. 检查profiles是否对 3. 不要选中offline模式 4. 检查本地仓库位置 5. 清掉idea缓存 6. 到本地maven仓库删掉出错的包然后重新maven reload 7. update本地仓库 8. 排查是不是别人没…

Seata 分布式事务的中间件Seata设计和实现方案

文章目录 分布式事务的中间件SeataSeata AT 模式-默认模式前提整体机制写隔离读隔离 Seata XA 模式前提整体机制工作机制 Seata TCC 模式Seata Saga 模式概述缺点&#xff1a; Saga的实现外传 分布式事务的中间件Seata Seata 是一款开源的分布式事务解决方案&#xff0c;致力于…