led.h:
- #ifndef __LED_H__
- #define __LED_H__
-
- // typedef struct{
- // unsigned int moder;
- // unsigned int otyper;
- // unsigned int ospeedr;
- // unsigned int pupdr;
- // unsigned int idr;
- // unsigned int odr;
- // }gpio_t;
-
- // #define GPIOE (*(gpio_t *)0X50006000)
- // #define GPIOF (*(gpio_t *)0X50007000)
- // #define RCC (*(unsigned int *)0X50000A28)
-
- #include "stm32mp1xx_gpio.h"
- #include "stm32mp1xx_rcc.h"
-
- void delay(int msc);
-
- void led_init();
-
- #endif
led.c:
- #include "led.h"
-
- void delay(int msc){
- int i,j;
- for(i = 0;i < msc;i++){
- for(j = 0;j < 3000;j++);
- }
- }
-
- void led_init(){
- // RCC |= (0X3<<4);
-
- // GPIOE.moder &= ~(0x33<<16);
- // GPIOE.moder |= (0x11<<16);
- // GPIOF.moder &= ~(0x3<<20);
- // GPIOF.moder |= (0x1<<20);
-
- // GPIOE.otyper &= ~(0x5<<8);
- // GPIOF.otyper &= ~(0x1<<10);
-
- // GPIOE.ospeedr &= ~(0x33<<16);
- // GPIOF.ospeedr &= ~(0x3<<20);
-
- // GPIOE.pupdr &= ~(0x33<<16);
- // GPIOF.pupdr &= ~(0x3<<20);
-
- //PE10
- RCC->MP_AHB4ENSETR |= (0X1<<4);
- GPIOE->MODER &= (~(0X3<<20));
- GPIOE->MODER |= (0X1<<20);
- GPIOE->OSPEEDR &= (~(0X1<<10));
- GPIOE->OSPEEDR &= (~(0X3<<20));
- GPIOE->PUPDR &= (~(0X3<<20));
- }
beep.h:
- #ifndef __BEEP_H__
- #define __BEEP_H__
-
- #include "stm32mp1xx_gpio.h"
- #include "stm32mp1xx_rcc.h"
-
- void beep_init();
-
- #endif
beep.c:
- #include "beep.h"
-
- void beep_init(){
- //PB6
- RCC->MC_AHB4ENSETR |= (0X1<<1);
- GPIOB->MODER &= (~(0X2<<12));
- GPIOB->MODER |= (0X1<<12);
- GPIOB->OTYPER &= (~(0X1<<6));
- GPIOB->OSPEEDR &= (~(0X3<<12));
- GPIOB->PUPDR &= (~(0X3<<12));
- }
fan.h:
- #ifndef __FAN_H__
- #define __FAN_H__
-
- #include "stm32mp1xx_gpio.h"
- #include "stm32mp1xx_rcc.h"
-
- void fan_init();
-
- #endif
fan.c:
- #include "fan.h"
-
- void fan_init(){
- //PE9
- RCC->MP_AHB4ENSETR |= (0X1<<4);
- GPIOE->MODER &= (~(0X3<<18));
- GPIOE->MODER |= (0X1<<18);
- GPIOE->OSPEEDR &= (~(0X1<<9));
- GPIOE->OSPEEDR &= (~(0X3<<18));
- GPIOE->PUPDR &= (~(0X3<<18));
- }
do_irq.c:
- #include "key_it.h"
- #include "led.h"
- #include "beep.h"
- #include "fan.h"
- extern void printf(const char *fmt, ...);
- unsigned int i = 0;
- unsigned int j = 0;
- unsigned int k = 0;
- void do_irq(void)
- {
- int irqno; // 保存中断号
- irqno = GICC->IAR & 0X3FF;
- switch (irqno)
- {
- case 99: // key1
- // 按键1中断处理
- if(0 == i){
- GPIOE->ODR |= (0X1<<10);
- i = 1;
- }else if(1 == i){
- GPIOE->ODR &= (~(0X1<<10));
- i = 0;
- }
- // 清除挂起中断标志位GICD_ICPENDRx
- GICD->ICPENDR[3] |= (0x1 << 3);
- // 清除中断触发标志位EXTI_FPR1
- EXTI->FPR1 |= (0x1 << 9);
- break;
- case 97: // key2
- // 按键2中断处理
- //PB6
- if(0 == j){
- GPIOB->ODR |= (0X1<<6);
- j = 1;
- }else if(1 == j){
- GPIOB->ODR &= (~(0X1<<6));
- j = 0;
- }
- // 清除挂起中断标志位GICD_ICPENDRx
- GICD->ICPENDR[3] |= (0x1 << 1);
- // 清除中断触发标志位EXTI_FPR1
- EXTI->FPR1 |= (0x1 << 7);
- break;
- case 98: // key3
- // 按键3中断处理
- //PE9
- if(0 == k){
- GPIOE->ODR |= (0X1<<9);
- k = 1;
- }else if(1 == k){
- GPIOE->ODR &= (~(0X1<<9));
- k = 0;
- }
- // 清除挂起中断标志位GICD_ICPENDRx
- GICD->ICPENDR[3] |= (0x1 << 2);
- // 清除中断触发标志位EXTI_FPR1
- EXTI->FPR1 |= (0x1 << 8);
- break;
- }
- // 清除处理完的中断号GICC_EOIR
- GICC->EOIR = irqno;
- }
main.c:
- #include "key_it.h"
- #include "led.h"
- #include "beep.h"
- #include "fan.h"
-
- int main()
- {
- key_it_config();
- key3_it_config();
- led_init();
- beep_init();
- fan_init();
- while(1){
-
- }
- return 0;
- }
效果图:
按键中断