茂名企业建站模板,阿里云是不是做网站的,一个人做企业网站要多少天,沈阳网站建站公司1.实验目的#xff1a;实现KEY1/LEY2/KE3三个按键#xff0c;中断触发打印一句话#xff0c;并且灯的状态取反#xff1b;
key1 ---- LED3灯状态取反#xff1b;
key2 ---- LED2灯状态取反#xff1b;
key3 ---- LED1灯状态取反#xff1b; 2.分析框图: …1.实验目的实现KEY1/LEY2/KE3三个按键中断触发打印一句话并且灯的状态取反
key1 ---- LED3灯状态取反
key2 ---- LED2灯状态取反
key3 ---- LED1灯状态取反 2.分析框图: 3.代码
---key.h头文件---
#ifndef __KEY_H__
#define __KEY_H__#include stm32mp1xx_rcc.h
#include stm32mp1xx_gpio.h
#include stm32mp1xx_gic.h
#include stm32mp1xx_exti.htypedef enum
{FALLING_TRI, //下降沿触发方式RISING_TRI, //上升沿触发方式
}trigger_t;//中断RCC章节初始化 PF9 7 8
void hal_interrupt_rcc_init();//EXTI初始化函数
//EXTI编号 GPIO组号 触发方式
void hal_exti_init(unsigned int extix,unsigned int groupx,trigger_t trix);//GIC初始化函数
//中断号中断优先级
void hal_gic_init(unsigned int interruptx,unsigned int priority);//led初始化函数
void led_init(gpio_t* gpiox,unsigned int pin);#endif
---key.c函数实现---
#include key.h//中断RCC章节初始化 PF9 7 8
void hal_interrupt_rcc_init()
{//RCC章节初始化 PF9 [5]1RCC-MP_AHB4ENSETR | (0x1 5);}//EXTI初始化函数
//EXTI编号 GPIO组号 触发方式
void hal_exti_init(unsigned int extix,unsigned int groupx,trigger_t trix)
{//GPIO章节初始化 设置三个按键为输入模式GPIOF-MODER (~(0x3 2*extix));//EXTI章节初始化,引脚信号与EXTI连接//1.EXIT_EXTICR组 0x05EXTI-EXTICR[extix/4] (~(0xff ((extix%4)*8)));EXTI-EXTICR[extix/4] | (groupx ((extix%4)*8));//2.EXTI_FTSR1 设置下降沿触发方式if(trix FALLING_TRI)EXTI-FTSR1 | (0x1 extix);elseEXTI-RTSR1 | (0x1 extix);//3.EXTI_IMR1 设置中断不屏蔽 1EXTI-C1IMR1 | (0x1 extix);}//GIC初始化函数
//中断号中断优先级
void hal_gic_init(unsigned int interruptx,unsigned int priority)
{//GICD初始化//1.GICD_CTRL 使能组0 [0]1GICD-CTRL | (0x1 0);//2.GICD_ISENABLER组 设置GICD层中断使能GICD-ISENABLER[interruptx/32] | (0x1 (interruptx % 32));//3.GICD_IPRIORITYR组 设置中断优先级 操作高5位GICD-IPRIORITYR[interruptx/4] (~(0x1f (interruptx % 4 * 8 3)));GICD-IPRIORITYR[interruptx/4] | (priority (interruptx % 4 * 8 3));//4.GICD_ITARGETSR组 设置中断目标分配给CPU0GICD-ITARGETSR[interruptx/4] (~(0x3 (interruptx % 4 * 8)));GICD-ITARGETSR[interruptx/4] | (0x1 (interruptx % 4 * 8));//GICC初始化//1.GICC_CTRL 设置GICC层组0使能 [0]1GICC-CTRL | (0x1 0);//2.GICC_PMR 设置GICC层中断优先级 GICC-PMR | ((priority1) 3);
}//led灯初始化
//参数1GPIO组号
//参数2引脚编号
void led_init(gpio_t* gpiox,unsigned int pin)
{//1输出模式 gpiox-MODER ~(0x3 (pin*2));gpiox-MODER | (0x1 (pin*2));//2输出类型gpiox-OTYPER (~(0x1 pin));//3输出速率gpiox-OSPEEDR ~(0x3 (pin*2));//4拉电阻gpiox-PUPDR ~(0x3 (pin*2));
}
---do_irq.c终端处理函数---
#include key.hextern void printf(const char *fmt, ...);//中断处理函数
void do_irq(void)
{//1获取中断号 IAR[9:0]unsigned int num 0;num GICC-IAR 0x3ff;//2判断中断号并且打印一句话switch(num){case 99:printf(KEY1按键中断,LED3灯取反\n);//led3灯状态取反GPIOE-ODR ^ (0x1 8);//3清除EXTI层中断挂起标志位 [9]1//EXTI_FDR1 [9]1EXTI-FPR1 | (0x1 9);//4清除GICD层中断挂起标志位//GICD_ICPENDR3 [3]1GICD-ICPENDR[3] | (0x1 3);break;case 97:printf(KEY2按键中断LED2灯取反\n);//led2灯状态取反GPIOF-ODR ^ (0x1 10);//清除EXTI层中断挂起标志位 [9]1EXTI-FPR1 | (0x1 7);GICD-ICPENDR[3] | (0x1 1);break;case 98:printf(KEY3按键中断LED1灯取反\n); //led1灯状态取反GPIOE-ODR ^ (0x1 10);EXTI-FPR1 | (0x1 8);GICD-ICPENDR[3] | (0x1 2);break;}//5清楚获取到的中断号GICC-EOIR num;}
---main.c测试文件---
#include key.hextern void printf(const char *fmt, ...);void delay_ms(int ms){int i,j;for(i 0; i ms;i)for (j 0; j 1800; j);
}#define GPIO_PIN10 10 //引脚编号
#define GPIO_PIN8 8
#define EXTI9 9 //EXTI编号
#define EXTI7 7
#define EXTI8 8
#define GPIOF_GROUP 0x05 //GPIOF组号
#define KEY1_ID 99 //中断号
#define KEY2_ID 97
#define KEY3_ID 98
#define KEY1_PRIORITY 9 //中断优先级
#define KEY2_PRIORITY 7
#define KEY3_PRIORITY 8int main()
{//使能三盏灯PE10 PF10 PE8RCC-MP_AHB4ENSETR | (0x3 4);//led初始化函数led_init(GPIOE,GPIO_PIN10);led_init(GPIOF,GPIO_PIN10);led_init(GPIOE,GPIO_PIN8);//中断RCC章节初始化 PF9 7 8hal_interrupt_rcc_init();//EXTI初始化函数hal_exti_init(EXTI9,GPIOF_GROUP,FALLING_TRI);hal_exti_init(EXTI7,GPIOF_GROUP,FALLING_TRI);hal_exti_init(EXTI8,GPIOF_GROUP,FALLING_TRI);//GIC初始化函数hal_gic_init(KEY1_ID,KEY1_PRIORITY);hal_gic_init(KEY2_ID,KEY2_PRIORITY);hal_gic_init(KEY3_ID,KEY3_PRIORITY);while(1){}return 0;}
4.实验现象