ARM-day9作业
- 开源代码
- 2025-08-17 07:21:02

main.c:
#include "uart.h" #include "key_it.h" int main() { char c; char *s; uart4_init(); //串口初始化 //中断初始化 key_it_config(); key3_it_config(); //完成GPIO相关初始化 all_led_init(); //风扇初始化 fs_init(); //蜂鸣器初始化 fmq_init(); while(1) { //保证主程序不结束 } return 0; }key_it.c:
#include"key_it.h" void key3_it_config() { RCC->MP_AHB4ENSETR |= (0x1<<5); GPIOF->MODER &= (~(0x3<<16)); EXTI->EXTICR3 &= (~(0xFF)<<0); EXTI->EXTICR3 |= (0x5<<0); EXTI->FTSR1 |= (0x1<<8); EXTI->C1IMR1 |= (0x1<<8); GICD->ISENABLER[3] |= (0x1<<2); GICD->IPRIORITYR[24] &= (~(0x1F<<19)); GICD->ITARGETSR[24] &= (~(0x3<<16)); GICD->ITARGETSR[24] |= (0x1<<16); } void key_it_config() { //RCC使能GPIOF时钟 RCC->MP_AHB4ENSETR |= (0x1<<5); //设置PF9、PF7、PF8 GPIO输入 //PF9 GPIOF->MODER &= (~(0x3<<18)); //PF8 GPIOF->MODER &= (~(0x3<<16)); //PF7 GPIOF->MODER &= (~(0x3<<14)); //设置PF9、PF7、PF8产生EXIT事件 EXTI_EXTICRx //PF7 EXTI->EXTICR2 &= (~(0xFF)<<24); EXTI->EXTICR2 |= (0x5<<24); //PF8 EXTI->EXTICR3 &= (~(0xFF)<<0); EXTI->EXTICR3 |= (0x5<<0); //PF7 EXTI->EXTICR3 &= (~(0xFF)<<8); EXTI->EXTICR3 |= (0x5<<8); //设置事件触发方式为下降沿触发EXTI_FTSR1 //PF7 EXTI->FTSR1 |= (0x1<<7); //PF8 EXTI->FTSR1 |= (0x1<<8); //PF9 EXTI->FTSR1 |= (0x1<<9); //设置EXTI事件触发不屏蔽EXTI_IMR1 //PF7 EXTI->C1IMR1 |= (0x1<<7); //PF8 EXTI->C1IMR1 |= (0x1<<8); //PF9 EXTI->C1IMR1 |= (0x1<<9); //使能中断能转发到特定的CPU接口层GICD_ISENABLERx //PF7 97号中断 GICD->ISENABLER[3] |= (0x1<<1); //PF8 98号中断 GICD->ISENABLER[3] |= (0x1<<2); //PF9 99号中断 GICD->ISENABLER[3] |= (0x1<<3); //GICD_ISENABLERx设置中断优先级 //PF7 GICD->IPRIORITYR[24] &= (~(0x1F<<11)); //PF8 GICD->IPRIORITYR[24] &= (~(0x1F<<19)); //PF7 GICD->IPRIORITYR[24] &= (~(0x1F<<27)); //设置当前中断被转发到那一个cpu处理GICD_ITARGETSRx //PF7 97中断 GICD->ITARGETSR[24] &= (~(0x3<<8)); GICD->ITARGETSR[24] |= (0x1<<8); //PF8 98中断 GICD->ITARGETSR[24] &= (~(0x3<<16)); GICD->ITARGETSR[24] |= (0x1<<16); //PF9 99中断 GICD->ITARGETSR[24] &= (~(0x3<<24)); GICD->ITARGETSR[24] |= (0x1<<24); //使能组0转发中断GICD_CTLR GICD->CTRL |= 0x1; //设置中断优先级掩码GICC_CTLR GICC->PMR |= (0x1F<<3); //使能CPU可以处理组0转发的中断GICC_CTLR GICC->CTRL |= 0x1; } //延时函数 void deley(int ms) { int i,j; for(i=0;i<ms;i++) { for(j=0;j<2000;j++); } } //GPIO初始化 void all_led_init() { //RCC使能 RCC->MP_AHB4ENSETR |= (0x3<<4); //设置PE10、PF10、PE8为输出 GPIOE->MODER &= (~(0x3<<20)); GPIOE->MODER |= (0x1<<20); GPIOF->MODER &= (~(0x3<<20)); GPIOF->MODER |= (0x1<<20); GPIOE->MODER &= (~(0x3<<16)); GPIOE->MODER |= (0x1<<16); //设置推挽输出 GPIOE->OTYPER &= (~(0x1<<10)); GPIOF->OTYPER &= (~(0x1<<10)); GPIOE->OTYPER &= (~(0x1<<8)); //设置三个管脚低速输出 GPIOE->OSPEEDR &= (~(0x3<<20)); GPIOF->OSPEEDR &= (~(0x3<<20)); GPIOE->OSPEEDR &= (~(0x3<<16)); //设置三个管脚输出时无上拉电阻和下拉电阻 GPIOE->PUPDR &=(~(0x3<<20)); GPIOF->PUPDR &=(~(0x3<<20)); GPIOE->PUPDR &=(~(0x3<<16)); } //风扇初始化 void fs_init() { //RCC使能 RCC->MP_AHB4ENSETR |= (0x1<<4); //设置PE9为输出 GPIOE->MODER &= (~(0x3<<18)); GPIOE->MODER |= (0x1<<18); //设置推挽输出 GPIOE->OTYPER &= (~(0x1<<9)); //设置管脚低速输出 GPIOE->OSPEEDR &= (~(0x3<<18)); //设置管脚输出时无上拉电阻和下拉电阻 GPIOE->PUPDR &=(~(0x3<<18)); } //蜂鸣器初始化 void fmq_init() { //RCC使能 RCC->MP_AHB4ENSETR |= (0x1<<1); //设置PB6为输出 GPIOB->MODER &= (~(0x3<<12)); GPIOB->MODER |= (0x1<<12); //设置推挽输出 GPIOB->OTYPER &= (~(0x1<<6)); //设置管脚低速输出 GPIOB->OSPEEDR &= (~(0x3<<12)); //设置管脚输出时无上拉电阻和下拉电阻 GPIOB->PUPDR &=(~(0x3<<12)); }do_irq.c:
#include"key_it.h" extern void printf(const char *fmt, ...); unsigned int i=0; void do_irq(void) { int irqno; //保存中断号 irqno=GICC->IAR & 0x3FF; switch(irqno) { case 99://key1 { //按键1中断处理 printf("KEY1 INT\n"); if((GPIOE->ODR==(GPIOE->ODR&(~(0x1<<10))))&&(GPIOF->ODR==(GPIOF->ODR&(~(0x1<<10))))&&(GPIOE->ODR==(GPIOE->ODR&(~(0x1<<8))))) { GPIOE->ODR |= (0x1<<10); GPIOF->ODR |= (0x1<<10); GPIOE->ODR |= (0x1<<8); } else if((GPIOE->ODR==(GPIOE->ODR|(0x1<<10)))&&(GPIOF->ODR==(GPIOF->ODR|(0x1<<10)))&&(GPIOE->ODR==(GPIOE->ODR|(0x1<<8)))) { GPIOE->ODR &= (~(0x1<<10)); GPIOF->ODR &= (~(0x1<<10)); GPIOE->ODR &= (~(0x1<<8)); } //清除挂起中断标志位GICD_ICPENDRx GICD->ICPENDR[3] |= (0x1<<3); //清除中断触发标志位EXTI_FPR1 EXTI->FPR1 |= (0x1<<9); break; } case 97://key2 { //按键2中断处理 printf("KEY2 INT\n"); if(GPIOB->ODR==(GPIOB->ODR&(~(0x1<<6)))) { GPIOB->ODR |= (0x1<<6); } else if(GPIOB->ODR==(GPIOB->ODR|(0x1<<6))) { GPIOB->ODR &= (~(0x1<<6)); } //清除挂起中断标志位GICD_ICPENDRx GICD->ICPENDR[3] |= (0x1<<1); //清除中断触发标志位EXTI_FPR1 EXTI->FPR1 |= (0x1<<7); break; } case 98://key3 { //按键3中断处理 printf("KEY3 INT\n"); if(GPIOE->ODR==(GPIOE->ODR&(~(0x1<<9)))) { GPIOE->ODR |= (0x1<<9); } else if(GPIOE->ODR==(GPIOE->ODR|(0x1<<9))) { GPIOE->ODR &= (~(0x1<<9)); } //清除挂起中断标志位GICD_ICPENDRx GICD->ICPENDR[3] |= (0x1<<2); //清除中断触发标志位EXTI_FPR1 EXTI->FPR1 |= (0x1<<8); break; } } //清除处理完的中断号GICC_EOIR GICC->EOIR=irqno; }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 deley(int ms); void all_led_init(); void fs_init(); void fmq_init(); #endif现象:
ARM-day9作业由讯客互联开源代码栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“ARM-day9作业”