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;
}
相关推荐
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
Lester_11014 天前
STM32霍尔传感器输入口设置为复用功能输入口时,还能用GPIO函数直接读取IO的状态吗
stm32·单片机·嵌入式硬件·电机控制
LCG元4 天前
低功耗显示方案:STM32L0驱动OLED,动态波形绘制与优化
stm32·嵌入式硬件·信息可视化
三佛科技-187366133974 天前
120W小体积碳化硅电源方案(LP8841SC极简方案12V10A/24V5A输出)
单片机·嵌入式硬件
z20348315204 天前
STM32F103系列单片机定时器介绍(二)
stm32·单片机·嵌入式硬件
Alaso_shuang4 天前
STM32 核心输入、输出模式
stm32·单片机·嵌入式硬件
脚后跟4 天前
AI助力嵌入式物联网项目全栈开发
嵌入式硬件·物联网·ai编程
2501_918126914 天前
stm32死锁是怎么实现的
stm32·单片机·嵌入式硬件·学习·个人开发
z20348315205 天前
STM32F103系列单片机定时器介绍(一)
stm32·单片机
星马梦缘5 天前
驱动层开发——蜂鸣器驱动
stm32·单片机·嵌入式硬件·hal·驱动