10.4 中断实验(A7核和M4核)
文章目录
- 中断实验
- 分析
- 原理图
- 芯片手册
- RCC章节
- GPIO章节
- EXTI章节
- GICD章节
- GICC章节
- 实现代码
- A7核
- key.h
- key.c
- main.c
- do_irq.c
- M4核
- fputc函数
- HAL_GPIO_EXTI_Falling_Callback函数
- HAL_GPIO_EXTI_Rising_Callback函数
- 运行结果
- A7核
- M4核
中断实验
分析
原理图
分析三个按键对应的GPIO接口:
KEY1----->PF9
KEY2----->PF7
KEY3----->PF8

芯片手册
RCC章节
GPIO控制器使能

GPIO章节
通过GPIOF_MODER设置PF9/PF7/PF8引脚设置为输入模式

下面以PF9为例
EXTI章节
GPIO控制器和EXTI控制器进行连接

EXTI7/EXTI8/EXTI9对应设置EXTI_FTSR1位数:
key1------>PF9------>EXTI9—>对应事件9—>EXTI_FTSR1[9] = 0x1
key2------>PF7------>EXTI7—>对应事件7—>EXTI_FTSR1[7] = 0x1
key3------>PF8------>EXTI8—>对应事件8—>EXTI_FTSR1[8] = 0x1

EXTI7/EXTI8/EXTI9对应设置EXTI_IMR1位数:
key1------>PF9------>EXTI9—>对应事件9—>EXTI_IMR1[9] = 0x1—>中断不屏蔽
key2------>PF7------>EXTI7—>对应事件7—>EXTI_IMR1[7] = 0x1—>中断不屏蔽
key3------>PF8------>EXTI8—>对应事件8—>EXTI_IMR1[8] = 0x1—>中断不屏蔽

EXTI7/EXTI8/EXTI9对应设置EXTI_FPR1位数:
key1------>PF9------>EXTI9—>对应事件9—>EXTI_FPR1[9] = 0x1—>清除中断挂起标志位
key2------>PF7------>EXTI7—>对应事件7—>EXTI_FPR1[7] = 0x1—>清除中断挂起标志位
key3------>PF8------>EXTI8—>对应事件8—>EXTI_FPR1[8] = 0x1—>清除中断挂起标志位

GICD章节
设置GICD层CPU0组使能

中断设置使能寄存器
key1/key2/key3对应的中断号设置GICD_ISENABLERx寄存器的位位数
key1------>PF9------>EXTI9—>对应事件9—>中断号99—>GICD_ISENABLER3[3] = 1
key2------>PF7------>EXTI7—>对应事件7—>中断号97—>GICD_ISENABLER3[1] = 1
key3------>PF8------>EXTI8—>对应事件8—>中断号98—>GICD_ISENABLER3[2] = 1

中断优先级设置
key1------>PF9------>EXTI9—>对应事件9—>中断号99—> 99 / 4 = 24 … 3—>GICD_IPRIORITYR24[31:27]
key2------>PF7------>EXTI7—>对应事件7—>中断号97—> 97 / 4 = 24 … 1—>GICD_IPRIORITYR24[15:11]
key3------>PF8------>EXTI8—>对应事件8—>中断号98—> 98 / 4 = 24 … 2—>GICD_IPRIORITYR24[23:19]

中断优先级设置
key1------>PF9------>EXTI9—>对应事件9—>中断号99—> 99 / 4 = 24 … 3—>GGICD_ITARGETSR24[25:24] = 0bx1
key2------>PF7------>EXTI7—>对应事件7—>中断号97—> 97 / 4 = 24 … 1—>GICD_ITARGETSR24[9:8] = 0bx1
key3------>PF8------>EXTI8—>对应事件8—>中断号98—> 98 / 4 = 24 … 2—>GICD_ITARGETSR24[17:16] = 0bx1
0bx1----->分配给CPU0
0b1x----->分配给CPU1
0b11----->分配给CPU0和CPU1

GICC章节
CTRL[0] = 1 cpu组0使能

GICC_PMR:中断优先级寄存器

GICC_IAR作用:获取中断号
GICC_IAR[9:0]:获取按键的中断号

GICC_EOIR作用:清除中断号
GICC_EOIR[9:0]:清除按键的中断号

实现代码
A7核
需要实现KEY1/KEY2/KEY3三个按键按下
key.h
#ifndef __KEY_H__
#define __KEY_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"//KEY--->PF9
//初始化EXti层
void pf9_exti_init();//初始化GICD层
void pf9_gicd_init();//初始化GICC层
void gicc_init();//KEY--->PF7
//初始化EXti层
void pf7_exti_init();//初始化GICD层
void pf7_gicd_init();//KEY--->PF8
//初始化EXti层
void pf8_exti_init();//初始化GICD层
void pf8_gicd_init();#endif
key.c
#include "key.h"//KEY--->PF9
//初始化EXti层
void pf9_exti_init()
{//RCC章节初始化//设置GPIOF组时钟使能RCC->MP_AHB4ENSETR |= (0x1<<5);//GPIO章节初始化//设置PF9引脚为输入模式GPIOF->MODER &=(~(0x3<<18));//EXTI章节初始化//1.设置PF9引脚和EXTI9控制器进行连接EXTI->EXTICR3 &=(~(0xff<<8));EXTI->EXTICR3 |=(0x5<<8);//2.设置PF9引脚监测方式下降沿EXTI->FTSR1 |= (0x1<<9);//3.设置PF9引脚中断不屏蔽EXTI->C1IMR1 |= (0x1<<9);}//初始化GICD层
void pf9_gicd_init()
{//1.设置GICD层全局中断使能寄存器GICD->CTLR |= 0x1;//2.设置GICD层中断使能寄存器GICD->ISENABLER[3] |= 0x1<<3;//3.设置GICD层中断优先级寄存器GICD->IPRIORITYR[24] &= (~(0x1f<<27));GICD->IPRIORITYR[24] |=(0x1<<27);//4.设置GICD层中断目标分配寄存器GICD->ITARGETSR[24] |=0x1<<24;GICD->ITARGETSR[24] &=(~(0x1<<25));}//初始化GICC层
void gicc_init()
{//1.设置GICC层全局中断使能寄存器GICC->CTLR |= 0x1;//2.设置GICC层中断优先级寄存器GICC->PMR &=(~(0x1f<<3));GICC->PMR |=0x5<<3;
}//KEY--->PF7
//初始化EXti层
void pf7_exti_init()
{//GPIO章节初始化//设置PF9引脚为输入模式GPIOF->MODER &=(~(0x3<<14));//EXTI章节初始化//1.设置PF7引脚和EXTI7控制器进行连接EXTI->EXTICR2 &=(~(0xff<<24));EXTI->EXTICR2 |=(0x5<<24);//2.设置PF7引脚监测方式下降沿EXTI->FTSR1 |= (0x1<<7);//3.设置PF7引脚中断不屏蔽EXTI->C1IMR1 |= (0x1<<7);}//初始化GICD层
void pf7_gicd_init()
{//GPIO章节初始化//设置PF9引脚为输入模式GPIOF->MODER &=(~(0x3<<16));//1.设置GICD层全局中断使能寄存器GICD->CTLR |= 0x1;//2.设置GICD层中断使能寄存器GICD->ISENABLER[3] |= 0x1<<1;//3.设置GICD层中断优先级寄存器GICD->IPRIORITYR[24] &= (~(0x1f<<11));GICD->IPRIORITYR[24] |=(0x2<<11);//4.设置GICD层中断目标分配寄存器GICD->ITARGETSR[24] |=0x1<<8;GICD->ITARGETSR[24] &=(~(0x1<<9));
}//KEY--->PF8
//初始化EXti层
void pf8_exti_init()
{//EXTI章节初始化//1.设置PF8引脚和EXTI8控制器进行连接EXTI->EXTICR3 &=(~(0xff));EXTI->EXTICR3 |=(0x5);//2.设置PF8引脚监测方式下降沿EXTI->FTSR1 |= (0x1<<8);//3.设置PF8引脚中断不屏蔽EXTI->C1IMR1 |= (0x1<<8);}//初始化GICD层
void pf8_gicd_init()
{ //1.设置GICD层全局中断使能寄存器GICD->CTLR |= 0x1;//2.设置GICD层中断使能寄存器GICD->ISENABLER[3] |= 0x1<<2;//3.设置GICD层中断优先级寄存器GICD->IPRIORITYR[24] &= (~(0x1f<<19));GICD->IPRIORITYR[24] |=(0x3<<19);//4.设置GICD层中断目标分配寄存器GICD->ITARGETSR[24] |=0x1<<16;GICD->ITARGETSR[24] &=(~(0x1<<17));
}
main.c
#include "key.h"void delay_ms(int ms)
{int i,j;for(i = 0; i < ms;i++)for (j = 0; j < 1800; j++);
}int main()
{//EXTI初始化pf9_exti_init();//GICD初始化pf9_gicd_init();pf8_exti_init();pf8_gicd_init();pf7_exti_init();pf7_gicd_init();//GICC初始化gicc_init();while(1){//put_string(get_string());//put_char(get_char()+1);}return 0;
}
do_irq.c
#include "key.h"
extern void printf(const char *fmt, ...);
extern void delay_ms(int ms);
unsigned int i = 0;
void do_irq(void)
{unsigned int num=0;//获取中断号num=GICC->IAR;num &= (~(0x3fffff<<10));switch(num){case 97:delay_ms(500);printf("key2######\n");//清除EXTI层中断挂起标志位EXTI->FPR1 |= (0x1<<7);//清除GICD层中断挂起标识位GICD->ICPENDR[3] |= 0x1<<1;break;case 98:delay_ms(500);printf("key3######\n");//清除EXTI层中断挂起标志位EXTI->FPR1 |= (0x1<<8);//清除GICD层中断挂起标识位GICD->ICPENDR[3] |= 0x1<<2;break;case 99:delay_ms(500);printf("key1######\n");//清除EXTI层中断挂起标志位EXTI->FPR1 |= (0x1<<9);//清除GICD层中断挂起标识位GICD->ICPENDR[3] |= 0x1<<3;break;}//清除中断号GICC->EOIR |= num;
}
M4核
1.中断实验(按键/光电开关/火焰传感器/人体红外)
2.使用M4核,检测到中断触发时,灯的状态(GPIO控制器)取反
3.并且检测到中断时,需要打印(串口)触发信息
fputc函数
int fputc(int ch,FILE* stream)
{//判断发送寄存器是否为空while(!(huart4.Instance->ISR & (0x1 << 7)));//将要发送的数据放入到发送寄存器中huart4.Instance->TDR = ch;//判断是否为'\n'if(ch == '\n'){//判断发送寄存器是否为空while(!(huart4.Instance->ISR & (0x1 << 7)));huart4.Instance->TDR = '\r';}return ch;
}
HAL_GPIO_EXTI_Falling_Callback函数
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{switch(GPIO_Pin){case GPIO_PIN_7:HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);printf("key2########\n");break;case GPIO_PIN_8:HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_10);printf("key3########\n");break;case GPIO_PIN_9:HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_8);printf("key1########\n");break;}
}
HAL_GPIO_EXTI_Rising_Callback函数
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
{switch(GPIO_Pin){case GPIO_PIN_12:HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);printf("U10#########\n");break;case GPIO_PIN_5:HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_10);printf("U15#########\n");break;case GPIO_PIN_15:HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_8);printf("U13#########\n");break;}
}
运行结果
A7核

M4核

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
