day7arm

main.c

cpp 复制代码
#include "led.h"
#include "uart4.h"
#include "mykey.h"
//char a;
char rx_data[20]="";
extern unsigned char led1_flag = 0;
extern unsigned char led3_flag = 0;
extern unsigned char beep_flag = 0;
void delay_ms(int ms)
{
	int i,j;
	for(i=0;i<ms;i++)
	{
		for(j=0;j<2000;j++);
	}
}


int main()
{
	uart4_config();
	led_init();
	key1_int_config();
	key2_int_config();
	key3_int_config();
	while(1)
	{

		if(led1_flag)LED1_CTRL(1);//guan
		else LED1_CTRL(0);
		if(led3_flag)LED3_CTRL(1);//guan
		else LED3_CTRL(0);
		if(beep_flag)BEEP_CTRL(1);//guan
		else BEEP_CTRL(0);

	}
	return 0;

}

mykey.c

cpp 复制代码
#include"mykey.h"

void key1_int_config()
{
    
    // 使能GPIOF外设时钟
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    // 设置PF9为输入
    GPIOF->MODER &= (~(0X3<<18));
    // 设置PF9产生EXTI9事件
    EXTI->EXTICR3 &= (~(0xff<<8));
    EXTI->EXTICR3 |= (0x5<<8);
    // 设置下降沿检测EXTI9事件
    EXTI->FTSR1 |= (0x1<<9);
    // 取消EXTI9事件的屏蔽
    EXTI->C1IMR1 |= (0x1<<9);
    // 全局使能99号中断
    GICD->ISENABLER[3] |= (0x1<<3);
    // 设置99号中断的优先级
    GICD->IPRIORITYR[24] &= (~(0x1f<<27));//最高优先级
    // 设置99号中断的目标处理器
    GICD->ITARGETSR[24] |= (0x1<<24);
    // 允许组0中断被转发到GICC层
    GICD->CTRL |= 0x1;
    // 设置中断优先级掩码
    GICC->PMR |= (0x1f<<3);
    // 允许组0中断被转发给处理器
    GICC->CTRL |= 0x1;
   

}
void key2_int_config()
{
    // 使能GPIOF外设时钟
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    // 设置PF8为输入
    GPIOF->MODER &= (~(0X3<<16));
    // 设置PF8产生EXTI8事件
    EXTI->EXTICR3 &= (~(0xff));
    EXTI->EXTICR3 |= (0x5);
    // 设置下降沿检测EXTI8事件
    EXTI->FTSR1 |= (0x1<<8);
    // 取消EXTI8事件的屏蔽
    EXTI->C1IMR1 |= (0x1<<8);
    // 全局使能98号中断
    GICD->ISENABLER[3] |= (0x1<<2);//
    // 设置98号中断的优先级
    GICD->IPRIORITYR[24] &= (~(0x1f<<19));//最高优先级
    // 设置98号中断的目标处理器
    GICD->ITARGETSR[24] |= (0x1<<16);//
    // 允许组0中断被转发到GICC层
    GICD->CTRL |= 0x1;
    // 设置中断优先级掩码
    GICC->PMR |= (0x1f<<3);
    // 允许组0中断被转发给处理器
    GICC->CTRL |= 0x1;
    
}
void key3_int_config()
{
    // 使能GPIOF外设时钟
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    // 设置PF7为输入
    GPIOF->MODER &= (~(0X3<<14));
    // 设置PF7产生EXTI7事件
    EXTI->EXTICR3 &= (~(0xff<<24));
    EXTI->EXTICR3 |= (0x5<<24);
    // 设置下降沿检测EXTI7事件
    EXTI->FTSR1 |= (0x1<<7);
    // 取消EXTI7事件的屏蔽
    EXTI->C1IMR1 |= (0x1<<7);
    // 全局使能97号中断
    GICD->ISENABLER[3] |= (0x1<<1);
    // 设置97号中断的优先级
    GICD->IPRIORITYR[24] &= (~(0x1f<<11));//最高优先级
    // 设置97号中断的目标处理器
    GICD->ITARGETSR[24] |= (0x1<<8);
    // 允许组0中断被转发到GICC层
    GICD->CTRL |= 0x1;
    // 设置中断优先级掩码
    GICC->PMR |= (0x1f<<3);
    // 允许组0中断被转发给处理器
    GICC->CTRL |= 0x1;
}

doirq.c

cpp 复制代码
#include"mykey.h"
extern void printf(const char *fmt, ...);
unsigned char led1_flag;
unsigned char led3_flag;
unsigned char beep_flag;
unsigned int i = 0;
void do_irq(void) 
{
    //获取中断号
    unsigned int irqno=(GICC->IAR&0x3ff);
    switch(irqno)
    {
        case 99:
            //中断处理逻辑
            led1_flag = ~led1_flag;
            printf("111");
            //清除GICD的中断标志
            GICD->ICPENDR[3] |= (0X1<<3);
            //清除EXTI中的中断触发标志
            EXTI->FPR1 |= (0x1<<9);
            break;
        case 98:
            //中断处理逻辑
            beep_flag = ~beep_flag; 
            printf("222");    
            //清除GICD的中断标志
            GICD->ICPENDR[3] |= (0X1<<2);
            //清除EXTI中的中断触发标志
            EXTI->FPR1 |= (0x1<<8);
            break;
        case 97:
            //中断处理逻辑
            led3_flag = ~led3_flag;
            printf("333");
            //清除GICD的中断标志
            GICD->ICPENDR[3] |= (0X1<<1);
            //清除EXTI中的中断触发标志
            EXTI->FPR1 |= (0x1<<7);
            break;
    }
    //清除IAR寄存器中保存的中断号
    GICC->EOIR=irqno;
}
相关推荐
极客小张6 分钟前
基于STM32MP157与OpenCV的嵌入式Linux人脸识别系统开发设计流程
linux·stm32·单片机·opencv·物联网
OH五星上将40 分钟前
OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【扩展组件】上
linux·嵌入式硬件·harmonyos·openharmony·鸿蒙开发·liteos-a·鸿蒙内核
浅陌pa1 小时前
24:RTC实时时钟
c语言·stm32·单片机·嵌入式硬件
敲上瘾1 小时前
多态的使用和原理(c++详解)
开发语言·数据结构·c++·单片机·aigc·多态·模拟
小熊在忙fpga1 小时前
STM32如何修改外部晶振频率和主频
stm32·单片机·嵌入式硬件
我命由我123452 小时前
GPIO 理解(基本功能、模拟案例)
linux·运维·服务器·c语言·c++·嵌入式硬件·c#
学习日记hhh2 小时前
STM32G431RBT6(蓝桥杯)串口(发送)
stm32·单片机·嵌入式硬件
老李的森林2 小时前
嵌入式开发--STM32延时函数重构
stm32·单片机·嵌入式硬件·重构·延时
OH五星上将5 小时前
OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【内核通信机制】上
linux·嵌入式硬件·harmonyos·openharmony·鸿蒙开发·liteos-a·鸿蒙内核
爱桥代码的程序媛5 小时前
鸿蒙OpenHarmony【轻量系统内核通信机制(互斥锁)】子系统开发
嵌入式硬件·harmonyos·鸿蒙·openharmony··鸿蒙开发·子系统开发