绍兴网站建站模板,百度企业,网站建设选亿企网络,华为云服务器怎么做网站.设置按键中断#xff0c;按键1按下#xff0c;LED亮#xff0c;再按一次#xff0c;灭
按键2按下#xff0c;蜂鸣器响。再按一次#xff0c;不响
按键3按下#xff0c;风扇转#xff0c;再按一次#xff0c;风扇停
头文件key_it.h
#ifndef __KEY_IT_H__
#define ….设置按键中断按键1按下LED亮再按一次灭
按键2按下蜂鸣器响。再按一次不响
按键3按下风扇转再按一次风扇停
头文件key_it.h
#ifndef __KEY_IT_H__
#define __KEY_IT_H__
#include stm32mp1xx_rcc.h
#include stm32mp1xx_gpio.h
#include stm32mp1xx_exti.h
#include stm32mp1xx_gic.h
void key_it_config();
void key3_it_config();
void all_led_init();
void buzzer_init();
void fan_init();
#endif源文件key_it.c
#includekey_it.hvoid key3_it_config()
{//RCC使能GPIOF时钟RCC-MP_AHB4ENSETR | (0x15);GPIOF-MODER (~(0x316));EXTI-EXTICR3 (~(0xFF0));EXTI-EXTICR3 | (0x50);EXTI-FTSR1 | (0x18);EXTI-C1IMR1 | (0x18);GICD-ISENABLER[3] | (0X12); GICD-IPRIORITYR[24] (~(0X1F19)); GICD-ITARGETSR[24] (~(0X316));GICD-ITARGETSR[24] | (0X116);
}
void key_it_config()
{//RCC使能GPIOF时钟RCC-MP_AHB4ENSETR | (0x15);//设置PF9 PF7 PF8GPIO输入//PF9GPIOF-MODER (~(0x318));//PF8// GPIOF-MODER (~(0x316));//pf7GPIOF-MODER (~(0x314));//设置PF9 PF7 PF8产生EXTI事件 EXTI_EXTICRx//pf7EXTI-EXTICR2 (~(0xFF24));EXTI-EXTICR2 | (0x524);//pf8// EXTI-EXTICR3 (~(0xFF0));// EXTI-EXTICR3 | (0x50);//pf9EXTI-EXTICR3 (~(0xFF8));EXTI-EXTICR3 | (0x58);//设置事件触发方式为下降沿触发EXTI_FTSR1//pf7EXTI-FTSR1 | (0x17);//pf8// EXTI-FTSR1 | (0x18);//pf9EXTI-FTSR1 | (0x19);//设置EXTI事件触发不屏蔽EXTI_IMR1//PF7EXTI-C1IMR1 | (0x17);//PF8// EXTI-C1IMR1 | (0x18);//PF9EXTI-C1IMR1 | (0x19);//使能中断能转发到特定的CPU接口层GICD_ISENABLERx//PF7 97号中断GICD-ISENABLER[3] | (0X11); //PF78 98号中断// GICD-ISENABLER[3] | (0X12); //PF9 99号中断GICD-ISENABLER[3] | (0X13); // GICD_ISENABLERx设置中断优先级//PF7GICD-IPRIORITYR[24] (~(0X1F11)); //PF8// GICD-IPRIORITYR[24] (~(0X1F19)); //PF9GICD-IPRIORITYR[24] (~(0X1F27)); //设置当前中断被转发到哪一个CPU处理GICD_ITARGETSRx//pf7 97中断GICD-ITARGETSR[24] (~(0X38));GICD-ITARGETSR[24] | (0X18);//pf8 98中断// GICD-ITARGETSR[24] (~(0X316));// GICD-ITARGETSR[24] | (0X116);//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 all_led_init()
{//RCC使能RCC-MP_AHB4ENSETR | (0x34);//设置PE10 PF10 PE8为输出GPIOE-MODER (~(0X320));GPIOE-MODER | (0X120);//设置推挽输出GPIOE-OTYPER (~(0X110));//设置三个管脚低速输出GPIOE-OSPEEDR (~(0X320));//设置三个管脚输出时无上拉电阻和下拉电阻GPIOE-PUPDR (~(0X320));
}
void buzzer_init()
{//RCC使能RCC-MP_AHB4ENSETR | (0x11);//设置PE10 PF10 PE8为输出GPIOB-MODER (~(0X312));GPIOB-MODER | (0X112);//设置推挽输出GPIOB-OTYPER (~(0X16));//设置三个管脚低速输出GPIOB-OSPEEDR (~(0X312));//设置三个管脚输出时无上拉电阻和下拉电阻GPIOB-PUPDR (~(0X312));
}
void fan_init(){//RCC使能RCC-MP_AHB4ENSETR | (0x14);//设置PE9为输出GPIOE-MODER (~(0X318));GPIOE-MODER | (0X118);//设置推挽输出GPIOE-OTYPER (~(0X19));//设置三个管脚低速输出GPIOE-OSPEEDR (~(0X318));//设置三个管脚输出时无上拉电阻和下拉电阻 GPIOE-PUPDR (~(0X318));
}
do_irq.c
#include key_it.h
extern void printf(const char *fmt, ...);
unsigned int i 0;
void do_irq(void)
{int irqno;//保存中断号irqnoGICC-IAR 0X3FF;switch(irqno){case 99://key1//按键1中断处理printf(KEY1 INT\n);GPIOE-ODR ^(0X110);//清除挂起中断标志位GICD_ICPENDRxGICD-ICPENDR[3] | (0x13);//清除中断触发标志位EXTI_FPR1EXTI-FPR1 | (0x19);break;case 97://key2//按键2中断处理printf(KEY2 INT\n);GPIOB-ODR ^(0x16);//清除挂起中断标志位GICD_ICPENDRxGICD-ICPENDR[3] | (0x11);//清除中断触发标志位EXTI_FPR1EXTI-FPR1 | (0x17);break;case 98://key3//按键3中断处理printf(KEY3 INT\n);GPIOE-ODR ^(0x19);//清除挂起中断标志位GICD_ICPENDRxGICD-ICPENDR[3] | (0x12);//清除中断触发标志位EXTI_FPR1EXTI-FPR1 | (0x18);break;}//清除处理完的中断号GICC_EOIRGICC-EOIR irqno;
}main.c
#include uart.h
#include key_it.h
int main()
{all_led_init();uart4_init();//串口初始化//中断初始化key_it_config();key3_it_config();buzzer_init();fan_init();while(1){//保证主程序不结束}return 0;
}
现象