定制化网站建设公司,长沙企业网站建设,静态网页效果图,基于php网站开发设置按键中断#xff0c;按键1按下#xff0c;LED亮#xff0c;再按一次#xff0c;灭
按键2按下#xff0c;蜂鸣器响。再按一次#xff0c;不响
按键3按下#xff0c;风扇转#xff0c;再按一次#xff0c;风扇停 src/key.c
#includekey.h//按键3的配…设置按键中断按键1按下LED亮再按一次灭
按键2按下蜂鸣器响。再按一次不响
按键3按下风扇转再按一次风扇停 src/key.c
#includekey.h//按键3的配置
void key3_config()
{//RCC使能GPIOF时钟RCC-MP_AHB4ENSETR | (0x15);//设置PF8 GPIO输入GPIOF-MODER (~(0x316));//设置PF8产生EXTI事件 EXTI_EXTICRxEXTI-EXTICR3 (~(0xFF0));EXTI-EXTICR3 | (0x50);//设置事件触发方式为下降沿触发EXTI_FTSR1EXTI-FTSR1 | (0x18);//设置EXTI事件触发不屏蔽EXTI_IMR1EXTI-C1IMR1 | (0x18);//使能中断能转发到特定的CPU接口层GICD_ISENABLERxGICD-ISENABLER[3] | (0X12); // GICD_ISENABLERx设置中断优先级GICD-IPRIORITYR[24] (~(0X1F19)); //设置当前中断被转发到哪一个CPU处理GICD_ITARGETSRxGICD-ITARGETSR[24] (~(0X316));GICD-ITARGETSR[24] | (0X116);//设置中断优先级掩码GICC_PMRGICC-PMR | (0x1F3);//使能CPU可以处理组0转发的中断GICC_CTLRGICC-CTRL | 0X1;
}
//按键1 按键2以及GICC层的配置
void key_config()
{//RCC使能GPIOF时钟RCC-MP_AHB4ENSETR | (0x15);//设置PF9 PF7GPIO输入//PF9GPIOF-MODER (~(0x318));//pf7GPIOF-MODER (~(0x314));//设置PF9 PF7 产生EXTI事件 EXTI_EXTICRx//pf7EXTI-EXTICR2 (~(0xFF24));EXTI-EXTICR2 | (0x524);//pf9EXTI-EXTICR3 (~(0xFF8));EXTI-EXTICR3 | (0x58);//设置事件触发方式为下降沿触发EXTI_FTSR1//pf7EXTI-FTSR1 | (0x17);//pf9EXTI-FTSR1 | (0x19);//设置EXTI事件触发不屏蔽EXTI_IMR1//PF7EXTI-C1IMR1 | (0x17);//PF9EXTI-C1IMR1 | (0x19);//使能中断能转发到特定的CPU接口层GICD_ISENABLERx//PF7 97号中断GICD-ISENABLER[3] | (0X11); //PF9 99号中断GICD-ISENABLER[3] | (0X13); // GICD_ISENABLERx设置中断优先级//PF7GICD-IPRIORITYR[24] (~(0X1F11)); //PF9GICD-IPRIORITYR[24] (~(0X1F27)); //设置当前中断被转发到哪一个CPU处理GICD_ITARGETSRx//pf7 97中断GICD-ITARGETSR[24] (~(0X38));GICD-ITARGETSR[24] | (0X18);//pf9 99中断GICD-ITARGETSR[24] (~(0X324));GICD-ITARGETSR[24] | (0X124);//使能组0转发中断GICD_CTLRGICD-CTRL | 0X1;//设置中断优先级掩码GICC_PMRGICC-PMR | (0x1F3);//使能CPU可以处理组0转发的中断GICC_CTLRGICC-CTRL | 0X1;}
//延时
void delay(int ms)
{int i,j;for(i 0;i ms;i){for(j 0;j 2000;j);}
}
//给RCC使能
void rcc_start()
{RCC-MP_AHB4LPENSETR | (0x34);
}
//GPIO初始化
void gpio_start()
{//PE10 PE9 PE8设置为输出模式GPIOE-MODER (~(0x3f16));GPIOE-MODER | (0x1516);//PF10设置为输出模式GPIOF-MODER (~(0x320));GPIOF-MODER | (0x120);//PB6设置为输出模式GPIOB-MODER (~(0x312));GPIOB-MODER | (0x112);//PE10 PE9 PE8设置为推挽输出GPIOE-OTYPER (~(0x78));//PF10设置为推挽输出GPIOF-OTYPER (~(0x110));//PB6设置为推挽输出GPIOB-OTYPER (~(0x16));//PE10 PE9 PE8设置为低速输出GPIOE-OSPEEDR (~(0x3f16));//PF10设置为低速输出GPIOF-OSPEEDR (~(0x320));//PB6设置为低速输出GPIOB-OSPEEDR (~(0x312));//PE10 PE9 PE8设置为无上拉下拉电阻GPIOE-PUPDR (~(0x3f16));//PF10设置为无上拉下拉电阻GPIOF-PUPDR (~(0x320));//PB6设置为无上拉下拉电阻GPIOB-PUPDR (~(0x316));
}src/do_irq.c
#include key.h
extern void printf(const char *fmt, ...);
unsigned int i 0;
unsigned int num1 0, num2 0,num3 0; //用于记录按键按下次数
void do_irq(void)
{int irqno;//保存中断号irqnoGICC-IAR 0X3FF;switch(irqno){case 99://key1//按键1中断处理printf(KEY1 INT\n);//灯亮if(num1 0){//PF10GPIOF-ODR | (0x110);//PE10 PE8GPIOE-ODR | (0x58);num1;}//灯灭else if(num1 0){//PF10GPIOF-ODR ~(0x110);//PE10 PE8GPIOE-ODR ~(0x58);num1 0;}//清除挂起中断标志位GICD_ICPENDRxGICD-ICPENDR[3] | (0x13);//清除中断触发标志位EXTI_FPR1EXTI-FPR1 | (0x19);break;case 97://key2//按键2中断处理printf(KEY2 INT\n);//蜂鸣器转if(num2 0){//PB6GPIOB-ODR | (0x16);num2;}//蜂鸣器停else if(num2 0){//PB6GPIOB-ODR ~(0x16);num2 0;}//清除挂起中断标志位GICD_ICPENDRxGICD-ICPENDR[3] | (0x11);//清除中断触发标志位EXTI_FPR1EXTI-FPR1 | (0x17);break;case 98://key3//按键3中断处理printf(KEY3 INT\n);//风扇转if(num3 0){//PE9GPIOE-ODR | (0x19);num3;}//风扇停else if(num3 0){//PE9GPIOE-ODR ~(0x19);num3 0;}//清除挂起中断标志位GICD_ICPENDRxGICD-ICPENDR[3] | (0x12);//清除中断触发标志位EXTI_FPR1EXTI-FPR1 | (0x18);break;}//清除处理完的中断号GICC_EOIRGICC-EOIR irqno;
}include/key.h
#ifndef __KEY_H__
#define __KEY_H__
#include ../common/include/stm32mp1xx_exti.h
#include ../common/include/stm32mp1xx_gpio.h
#include ../common/include/stm32mp1xx_rcc.h
#include ../common/include/stm32mp1xx_gic.h
void key_config();
void key3_config();
//延时
void delay(int ms);
//给RCC使能
void rcc_start();
//GPIO初始化
void gpio_start();#endifmain.c
#include key.hint main()
{//中断初始化key_config();key3_config();//GPIO串口初始化gpio_start();while(1){//保证主程序不结束}return 0;
}