STM32学习笔记——中断

EXTI(External interrupt/event controller) —外部中断/事件控制器
NVIC 是嵌套向量中断控制器
在这里插入图片描述
在这里插入图片描述

编程思路

1)初始化用来产生中断的GPIO 口。
2)开启 AFIO 时钟
3)初始化EXTI。
4)NVIC配置。
5)编写中断服务函数。

1)初始化IO及EXTI配置

  • 注意开启AFIO时钟

  • EXTI配置时要选择输入线(把相应的要发生中断的GPIO连接到EXTILine)GPIO_EXTILineConfig(KEY1_EXTI_PortSource,KEY1_EXTI_PinSource);

void EXIT_KEY_Config(void)
{
	 //NVIC_config();!!!!此句要放在函数声明下面
	/* 第一步.初始化要连接到EXTI的GPIO*/
	GPIO_InitTypeDef GPIO_InitStruct; //变量定义必须放在函数可执行语句前
	EXTI_InitTypeDef EXTI_InitStruct;
	NVIC_config();
	/*1.打开外设的时钟*/
	RCC_APB2PeriphClockCmd(KEY1_EXTI_CLK|KEY2_EXTI_CLK,ENABLE);
	/*2.设置相应结构体 */
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
	GPIO_InitStruct.GPIO_Pin  = KEY1_EXTI_PIN;
	//设置为输入模式就不用设置GPIO_Speed参数了	
	/* 3.调用外设初始化函数,把配置好的结构体成员写到寄存器里边 */
	GPIO_Init(KEY1_EXTI_PORT,&GPIO_InitStruct);	
	//KEY2初始化
	GPIO_InitStruct.GPIO_Pin  = KEY2_EXTI_PIN;
	GPIO_Init(KEY2_EXTI_PORT,&GPIO_InitStruct);
	
	/* 第二步.初始化EXTI外设*/	
	/*需要用到AFIO,先打开AFIO时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //AFIO
	/*1.选择输入线(PA0,PC13)*/
	GPIO_EXTILineConfig(KEY1_EXTI_PortSource,KEY1_EXTI_PinSource);
	GPIO_EXTILineConfig(KEY2_EXTI_PortSource,KEY2_EXTI_PinSource);
	/*2.配置EXTI的初始化结构体*/
	EXTI_InitStruct.EXTI_Line	= KEY1_EXTI_Line;
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
	/*3.调用EXTI初始化函数,把配置好的结构体成员写到寄存器里边*/
	EXTI_Init(&EXTI_InitStruct);	
	
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
	EXTI_InitStruct.EXTI_Line	= KEY2_EXTI_Line;
	EXTI_Init(&EXTI_InitStruct);		
}

2)NVIC配置

  • NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//配置为组1
    ------这个函数的作用是对中断的优先级进行分组,这个函数在系统中只能被调用一次

在这里插入图片描述

  • 抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。

  • 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;

  • 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。

static	void NVIC_config(void)
{
	NVIC_InitTypeDef	NVIC_InitStruct;
	/*第一步.配置中断优先级分组*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//配置为组1
	/*第二步.配置NVIC的初始化结构体*/
	NVIC_InitStruct.NVIC_IRQChannel = KEY1_EXTI_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;//子优先级
  /*第三步.调用NVIC初始化函数,把配置好的结构体成员写到寄存器里边*/
	NVIC_Init(&NVIC_InitStruct);
	
	NVIC_InitStruct.NVIC_IRQChannel = KEY2_EXTI_IRQn; //中断源
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;//子优先级
	NVIC_Init(&NVIC_InitStruct);
}

3)中断服务函数

  • 中断服务函数可以写在stm32f10x_it.c文件中
    在这里插入图片描述

  • 中断服务函数的函数名需要引用库函数中固定的匹配名称 如PC13 IO口的的中断服务函数名为EXTI15_10_IRQHandler 下边demo中函数名用了宏定义

在这里插入图片描述

  • EXTI_GetITStatus( ) 中断检测函数
  • EXTI_ClearITPendingBit( )标志位清除
void KEY1_EXTI_Handler(void)
{
	if(EXTI_GetITStatus(KEY1_EXTI_Line) != RESET)
	{
		LEDG_Toggle;
	}
	EXTI_ClearITPendingBit(KEY1_EXTI_Line);
}
void KEY2_EXTI_Handler(void)
{
	if(EXTI_GetITStatus(KEY2_EXTI_Line) != RESET)
	{
		LEDR_Toggle;
	}
	EXTI_ClearITPendingBit(KEY2_EXTI_Line);
}
根据引用内容,STM32C8T6是一款通用增强型的48脚单片机,具有64K闪存和LQFP封装。它适用于工业级温度范围-40~85度。下面是一些关于STM32C8T6学习笔记: 1. 学习资料:可以从ST官方网站下载STM32C8T6的数据手册和参考手册,这些手册包含了该单片机的详细信息和使用方法。 2. 开发环境:为了开始学习STM32C8T6,你需要安装相应的开发环境。ST官方提供了一款免费的集成开发环境(IDE)——STM32CubeIDE,它可以帮助你进行代码编写、调试和下载。 3. 编程语言:STM32C8T6可以使用多种编程语言进行开发,包括C语言和汇编语言。C语言是最常用的编程语言,它可以通过STM32CubeIDE进行编写和调试。 4. 引脚配置:在使用STM32C8T6之前,你需要了解每个引脚的功能和配置。数据手册中有一张引脚功能表,可以帮助你了解每个引脚的用途和配置方法。 5. 时钟配置:STM32C8T6具有多个时钟源和时钟分频器,你需要根据自己的需求配置正确的时钟。时钟配置对于外设的正常工作非常重要。 6. 中断和定时器:STM32C8T6支持中断和定时器功能,这些功能可以帮助你实现各种任务和功能。你可以通过配置中断和定时器来实现外设的响应和定时操作。 7. 外设驱动:STM32C8T6具有丰富的外设,包括GPIO、UART、SPI、I2C等。你可以根据自己的需求选择合适的外设,并学习如何配置和驱动这些外设。 8. 调试和下载:在开发过程中,你可以使用STM32CubeIDE提供的调试功能来调试你的代码。一旦代码调试完成,你可以使用ST-Link或其他下载器将代码下载到STM32C8T6上运行。 希望以上笔记对你学习STM32C8T6有所帮助!如果你有任何进一步的问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值