当前位置: 首页 > news >正文

arm (exti中断)

src/key_it.c

  1 #include "key_it.h"2 3 //按键1中断配置4 void key1_config()5 {6     //RCC章节7     //1:使能gpio f8     RCC->MP_AHB4ENSETR |= (0x1<<5);9     //因为exti和gic属于芯片内部 所以无需使能10 11     //GPIO章节12     //1:将key1对应的pf9引脚模式设置为输入13     RCC->MODER &= (~(0x3<<18));14 15     //EXTI章节16     //1:设置PF9生成exti9事件17     //EXTI_EXTICR3:外部中断选择寄存器,选择和哪一个EXTI编号进行连接18     //EXTI编号 / 4 = 商...余数        9/4=2...119     //商+1:表示操作哪一个寄存器      编号3寄存器20     //余数*8:操作寄存器8位中的最低位 821     //每8位管理一个寄存器编号,所以长度为8位->[15:8]22     //pf9对应值为0x05 [15:8]->0x0523     EXTI->EXTICR3 &= (~(0xFF<<8));24     EXTI->EXTICR3 |= (0x05<<8);25 26     //2:设置下降沿检测EXTI9事件27     //EXTI_FTSR1:下降沿事件选择寄存器28     //设置EXTI编号为下降沿触发29     //每一位检测一个事件 写1使能30     EXTI->FTSR1 |= (0x1<<9);31 32     //3:取消exti的事件屏蔽33     //EXTI_IMR1:中断屏蔽寄存器 设置EXTI层中断是否屏蔽34     //设置1不屏蔽35     EXTI->C1IMR1 |= (0x1<<9);36 37     //4:EXTI_FPR1:下降沿挂起寄存器 清除EXTI层中断挂起标志位38     //置1清除39     //EXTI->FPR1 |= (0x1<<9);40                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             41     //GIC章节42     //GICD_CTLR:设置GICD层组0使能43     GICD->cTRL |= 0x1;44 45     //GICD_ISENABLERx(0 ~ 8):中断设置使能寄存器46     //设置对应的中断号使能47     //GIC层一共管理288个中断号48     //一个寄存器32位,每一位管理一个中断号,所以一个寄存器最多管理32个中断号49     //288 / 32 = 9 个中断设置使能寄存器GICD_ISENABLERx(0 ~ 8)50     //根据中断号,可以直接计算出操作哪一个寄存器,以及寄存器的位数51     //中断号 / 32 = 商........余数 99/32=3...352     //商:表示操作哪一个寄存器     3号寄存器53     //余数:操作寄存器位数         54     //KEY1==>PF9==>EXTI9编号=>事件9=>99中断号=99/32=3...3=>GICD_ISENABLER3[3]=155     GICD->ISENABLER[3] |= (0x1<<3);56 57     //GICD_IPRIORITYRx(0 ~ 71):中断优先级寄存器58     //设置GICD层中99号中断优先级59     //GIC层一共管理288个中断号(16个PPI,16个SGI,256个SPI)60     //寄存器32位,每八位管理一个中断号,所以一个寄存器最多管理4个中断号61     //288/4=72个寄存器62     //中断号 / 4 = 商........余数 99/4=24...363     //商:表示操作哪一个寄存器    第24个寄存器64     //余数*8+3:操作寄存器位数中五位中最低位  27  [31,27](8位空三位)65     GICD->IPRIORITYR[24] &= (~(0x1F<<27));//设置为0 数值越小表示优先级越高66 67     //GICD_ITARGETSRx(0 ~ 71):中断目标分配寄存器 设置GICD层中断分配给哪一个cpu68     //288个中断号69     //寄存器32位,每八位管理一个中断号,所以一个寄存器最多管理4个中断号70     //288/4=72 个中断优先级寄存器GICD_ITARGETSRx(0 ~ 71)71     //中断号 / 4 = 商........余数          99/4=26...372     //商:表示操作哪一个寄存器             2673     //余数*8:操作寄存器位数中五位中最低位 24 [25,24] 6位置空74     GICD->ITARGETSR[26] &= (~(0x3<<24));75     GICD->ITARGETSR[26] |= (0x1<<24); // 0b01 =====> 分配给cpu076 77     //GICD_ICPENDRx(0 ~ 8):清除GICD层中断挂起标志位78     //288个中断号,寄存器32位每一位管理一个中断号,一个寄存器最多管理32个中断号79     //288 / 32 = 980     //中断号 / 32 = 商........余数 99/32=3...381     //商:表示操作哪一个寄存器     382     //余数:操作寄存器位数         383     //GICD->ICPENDR[3] |= (0x1<<3);84 85     //GICC_CTLR:设置GICC层组0使能86     //GICC_CTLR[0] = 1 =======> 设置GICC层组0使能87     GICC->CTLR |= 0x1;88 89     //GICC_PMR:GICC层中断优先级屏蔽寄存器90     //GICC_PMR[7:3] = 设置优先级值91     //1)GICD层的优先级需要比GICC层优先级高92    // 2)数值越小表示优先级越高93     GICC->PMR |= (0x1F<<3);94 }
~         

include/key_it.h

  1 #ifndef wwe2 #define wwe3 4 #include "stm32mp1xx_gpio.h"5 #include "stm32mp1xx_rcc.h"6 #include "stm32mp1xx_exti.h"7 #include "stm32mp1xx_gic.h"8 9 void key1_config();10 void key2_config();11 void key3_config();12 13 #endif  

do.c

  1 #include "key_it.h"2 //中断处理函数3 extern void printf(const char *fmt,...);4 void do_irp(void)5 {6     //先获取中断号7     //GICC_IAR:获取中断号的值 将GICC_IAR[9:0]的值读出来8     unsigned int irpno=(GICC->IAR &= (~(0x3FF)));9     switch(irpno)10     {11         case 99://key1中断12             //中断处理13             printf("key1触发\n");14             //清除gicd中的中断排队标志15     //GICD_ICPENDRx(0 ~ 8):清除GICD层中断挂起标志位16     //288个中断号,寄存器32位每一位管理一个中断号,一个寄存器最多管理32个中断号17     //288 / 32 = 918     //中断号 / 32 = 商........余数 99/32=3...319     //商:表示操作哪一个寄存器     320     //余数:操作寄存器位数         321     GICD->ICPENDR[3] |= (0x1<<3);22     //清除exit中的事件挂起标志23     //EXTI_FPR1:下降沿挂起寄存器 清除EXTI层中断挂起标志位24     //置1清除25     EXTI->FPR1 |= (0x1<<9);26     break;27 28     }29     //清除iar保存的中断号30     //GICC_EOIR:GICC end of interrupt register 寄存器作用:清除中断号31     //将获取到的中断号(IAR)进行清除32     GICC->EOIR = irqno;33 }  

main.c

  1 #include "key_it.h"2 extern void printf(const char *fmt,...);3 4 //封装延时函数5 void delay(int ms)6 {7     int i,j;8     for(i=0,i<ms,i++)9     {10         for(j=0,j<2000,j++)11         {}12     }13 }14 int main()15 {                                                                                                                                                                                                       16     key1_config();17     while(1)18     {19     printf("main.c\n");20     delay(1000);21 22 23     }24     return 0;25 }

http://www.lryc.cn/news/395592.html

相关文章:

  • 触摸屏虚拟键盘组件 jQuery Virtual Keyboard使用 自定义键盘
  • 面试题07-09
  • MySQL之binlog日志
  • 【大数据】什么是数据湖?一文揭示数据湖的本质
  • CSS【详解】文本相关样式(含 font 系列,文本排版,文本装饰,分散对齐,渐变色文本等)
  • 加油卡APP系统开发,优惠加油收益
  • el-scrollbar实现自动滚动到底部(AI聊天)
  • 开源去除背景的项目:rembg 安装和部署
  • Docker 使用基础(1)—镜像仓库
  • Git详细安装和使用教程
  • LeetCode题练习与总结:反转字符串中的单词--151
  • 2.pwn的linux基础(计算机内部数据结构存储形式)
  • 67.SAP FICO-凭证类型学习
  • 井字游戏00
  • GEE代码实例教程详解:地表温度与土地覆盖类型分析
  • RK3568------Openharmony 4.0-Release 浏览器部署安装
  • 【kafka】可视化工具cmak(原kafka-manager)安装问题解决
  • 【转载】目标检测mAP的含义
  • 智慧校园行政办公-红头文件功能概述
  • 汽车IVI中控开发入门及进阶(三十三):i.MX linux开发之开发板
  • Redis基础教程(十八):Redis管道技术
  • 深度学习(笔记内容)
  • 阿里云登陆Centos7
  • 探索C嘎嘎的奇妙世界:第十九关---STL(list的模拟实现)
  • 【分布式系统三】监控平台Zabbix对接grafana(截图详细版)
  • SAPUI5基础知识11 - 组件配置(Component)
  • Spring最早的源码
  • 热烈祝贺!全视通多家客户上榜全球自然指数TOP100!
  • 常用接口避免频繁请求
  • C++入门基础