IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 10.4 国庆特别篇——按键中断实验(A7核、M4核) -> 正文阅读

[嵌入式]10.4 国庆特别篇——按键中断实验(A7核、M4核)

按键中断实验

原理图分析

根据丝印在扩展板原理图搜索KEY
在这里插入图片描述
在转接板上搜索找到引脚
在这里插入图片描述

RCC章节分析

在这里插入图片描述
在这里插入图片描述
设置GPIOF控制器使能
在这里插入图片描述

GPIO章节分析

将KEY1、KEY2、KEY3设置为输入模式
在这里插入图片描述

EXTI章节分析

外部中断选择寄存器 功能:GPIO控制器和EXTI控制器进行连接,key1------>PF9------>EXTI9-------->EXTI_EXTICR3[15:8] = 0x05
在这里插入图片描述
设置为下降沿检测方式
在这里插入图片描述
设置中断不屏蔽
在这里插入图片描述
清除中断挂起标志位
读0:中断没有发生
读1:中断发生
写0:表示没有清除中断挂起标志位
写1:表示清除中断挂起标志位

在这里插入图片描述

GICD章节分析

分析GICD_CTLR寄存器,设置GICD层CPU0组使能
GICD_CTLR[0] = 1

在这里插入图片描述
按键中断设置使能寄存器
在这里插入图片描述
在这里插入图片描述
设置中断优先级
中断优先级设置,数字越小代表优先级越高
在这里插入图片描述
中断处理目标寄存器
0bx1----->分配给CPU0
0b1x----->分配给CPU1
0b11----->分配给CPU0和CPU1

在这里插入图片描述
中断清除GICD层挂起标志位寄存器
在这里插入图片描述

GICC章节分析

给CPU组0使能
在这里插入图片描述
中断优先级寄存器,这个寄存器设置的值,需要比GICD层设计的中断优先级的值要大
在这里插入图片描述
GICC_IAR寄存器存储中断号,GICC_IAR[9:0]:获取按键的中断号
在这里插入图片描述
GICC_EOIR寄存器清除中断号,GICC_EOIR[9:0]:清除按键的中断号
在这里插入图片描述

A7核代码示例

key.h

#include "stm32mp1xx_exti.h"           
#include "stm32mp1xx_gpio.h"           
#include "stm32mp1xx_rcc.h"            
#include "stm32mp1xx_gic.h"            
/********PF9----KEY1***********/       
//初始化EXIT层                         
void pf9_exti_init();                  
//初始化GICD层                         
void pf9_gicd_init();                  
//初始化GICC层                         
void gicc_init();                      
                                       
//初始化EXIT层                         
void pf8_exti_init();                  
//初始化GICD层                         
void pf8_gicd_init();                  
                                       
//初始化EXIT层                         
void pf7_exti_init();                  
//初始化GICD层                         
void pf7_gicd_init();                                                                                              
#endif                                 

key.c

#include "key.h"
/********PF9----KEY1***********/
//初始化EXIT层
void pf9_exti_init()
{
	/******RCC章节初始化****/
	//1.设置GPIOF时钟使能
	RCC->MP_AHB4ENSETR |= (0X1<<5);
	/******GPIO章节初始化****/
	//1.设置PF9引脚输入模式
	GPIOF->MODER &= (~(0X3<<18));
	/******EXIT章节初始化****/
	//1.设置PF9引脚和EXTI9控制器进行连接
	EXTI->EXTICR3 |= (0X05<<8);
	//2.设置PF9引脚检测方式下降沿检测
	EXTI->FTSR1 |= (0X1<<9);
	//3.设置PF9引脚中断不屏蔽
	EXTI->C1IMR1 |= (0X1<<9);
}
void pf8_exti_init()
{
	GPIOF->MODER &= (~(0X3<<16)); 
	//1.设置PF8引脚和EXTI8控制器进行连接
	EXTI->EXTICR3 |= (0X05<<0);
	//2.设置PF8引脚检测方式下降沿检测
	EXTI->FTSR1 |= (0X1<<8);
	//3.设置PF8引脚中断不屏蔽
	EXTI->C1IMR1 |= (0X1<<8);
}
void pf7_exti_init()
{
    GPIOF->MODER &= (~(0X3<<14));        
    //1.设置PF7引脚和EXTI7控制器进行连接 
    EXTI->EXTICR2 |= (0X05<<24);          
    //2.设置PF7引脚检测方式下降沿检测    
    EXTI->FTSR1 |= (0X1<<7);             
    //3.设置PF7引脚中断不屏蔽            
    EXTI->C1IMR1 |= (0X1<<7);            
}

//初始化GCID层
void pf9_gicd_init()
{
	//1.设置GICD层全局中断使能
	GICD->CTLR |= 0X1;
	//2.设置GICD层中断使能寄存器
	GICD->ISENABLER[3] |= (0X1<<3);
	//3.设置GICD层中断优先级寄存器
	GICD->IPRIORITYR[24] |= (0X1<<27); 
	//4.设置GICD层中断目标分配
	GICD->ITARGETSR[24] |= (0X1<<24);
}
void pf8_gicd_init()
{
	//1.设置GICD层全局中断使能                                
	//2.设置GICD层中断使能寄存器          
	GICD->ISENABLER[3] |= (0X1<<2);       
	//3.设置GICD层中断优先级寄存器        
	GICD->IPRIORITYR[24] |= (0X1<<19);    
	//4.设置GICD层中断目标分配            
	GICD->ITARGETSR[24] |= (0X1<<16);     
}
void pf7_gicd_init()
{
    //1.设置GICD层全局中断使能                       
    //2.设置GICD层中断使能寄存器       
    GICD->ISENABLER[3] |= (0X1<<1);    
    //3.设置GICD层中断优先级寄存器     
    GICD->IPRIORITYR[24] |= (0X1<<11); 
    //4.设置GICD层中断目标分配         
    GICD->ITARGETSR[24] |= (0X1<<8);  
}

//初始化GICC层
void gicc_init()
{
	//1.设置GICC层全局中断使能寄存器
	GICC->CTLR |= 0X1;
	//2.设置GICC层中断优先级寄存器
	GICC->PMR |= (0X5<<3);
}

do_irq.c

#include "key.h"
extern void printf(const char *fmt, ...);
extern void delay_ms(int ms);
void do_irq(void) 
{
	unsigned int num = 0;
	//获取中断号
	num = GICC->IAR & 0X3FF;
	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 &= (~(0X3FF));
	GICC->EOIR |= num;
}

main.c

#include "key.h"
extern 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++);
}
int main()
{
	//1.EXTI初始化
	pf9_exti_init();
	//2.GICD初始化
	pf9_gicd_init();
	//初始化EXIT层         
	pf8_exti_init();  
	//初始化GICD层         
	pf8_gicd_init();  
	//初始化EXIT层        
	pf7_exti_init(); 
	//初始化GICD层        
	pf7_gicd_init(); 

	//3.GICC初始化
	gicc_init();   

	while(1)
	{
	}
	return 0;
}

测试结果

在这里插入图片描述

M4核的中断实验

1>中断实验(按键/光电开关/火焰传感器/人体红外)
2>使用M4核,检测到中断触发时,灯的状态(GPIO控制器)取反
3>并且检测到中断时,需要打印(串口)触发信息

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
导出工程到Keil

上升沿代码

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-->LED2\n");
			break;
		case GPIO_PIN_15:
			HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_10);
			printf("U13-->LED1\n");
			break;
		case GPIO_PIN_5:
			HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_8);
			printf("U15-->LED3\n");
			break;
	}
}

下降沿代码

void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
	switch(GPIO_Pin)
	{
		//KEY2--->PF10
		case GPIO_PIN_7:
			HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);
			printf("KEY2-->LED2\n");
			break;
		//KEY3--->PE10
		case GPIO_PIN_8:
			HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_10);
			printf("KEY3-->LED1\n");
			break;
		//KEY1--->PE8
		case GPIO_PIN_9:
			HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_8);
			printf("KEY1-->LED3\n");
			break;
	}
}

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;
}

测试结果

在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 20:58:04  更:2022-10-08 20:59:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:31:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码