STM32C8CT6 主控按键触发外部中断

系列文章目录

第一章 STM32F103C8T6 点亮LED灯

第二章 STM32F103C8T6 按键扫描输入


文章目录



前言

        之前我们了解了如何配置按IO口的输入参数 并用 主控按键扫描作为案例展示,今天我用 主控按键触发中断的案例 来带大家了解一下STM32C8CT6 如何配置外部中断。

        由于按键中断配置大致相同,这里我就使用KEY_1(PA0) 为大家作为案例讲解。


一、原理部分

1.中断优先级管理

        STM32C8CT6本身具有16个外部中断。我们在使用这些中断时候,为了避免多个中断同时执行导致程序崩溃。这里就要对中断的响应先后进行管理,这就是 中断优先级管理 。

        管理方法就是对中断进行分为0~4的5组。同时,对每个中断设置一个抢占优先级和一个响应优先级值。分组配置是在寄存器SCB->AIRCR中配置:

AIRCR[10:8]

IP bit[7:4]分配情况

分配结果

0

111

0:4

0位抢占优先级别,4位响应优先级别

1

110

1:3

1位抢占优先级别,3位响应优先级别

2

101

2:2

2位抢占优先级别,2位响应优先级别

3

100

3:1

3位抢占优先级别,1位响应优先级别

4

011

4:0

4位抢占优先级别,0位响应优先级别

 抢占优先级 & 响应优先级区别:

  • 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。
  • 抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
  • 抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
  • 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;

2.外部中断

        STM32的每个IO都可以作为外部中断输入,每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者 双边沿触发(就是既可以进行上升沿触发,也可以进行下降沿触发)),触发/屏蔽,专用的状态位。从图中可以看出,每个EXTIX对应着GOIOA-GPIOC的PinX。

 

二、代码部分

main.c

#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "KEY_NVIC.h"
#include "TIME.h"


void Device_Init(void)		//初始化 外设
{
	delay_init();				//初始化 延时
	
	LED_Config();				//初始化 LED
	
    KEY_NVIC_Config();          //初始化 按键中断

	delay_ms(10);
}




int main(void)
{
	Device_Init();
	
	while(1)
	{
		;
	}
}

KEY_NVIC.h

#ifndef __KEY_NVIC_H
#define __KEY_NVIC_H


#include "stm32f10x.h"
#include "delay.h"
#include "key.h"
#include "stm32f10x_exti.h"


void KEY_NVIC_Config(void);			//配置 主控按键触发


#endif

KEY_NVIC.c

#include "KEY_NVIC.h"


void KEY_NVIC_Config(void)			//配置 主控按键触发
{
	EXTI_InitTypeDef KEY_NVIC;
	NVIC_InitTypeDef key_NVIC;
	
	//开启IO口复用时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
	//GPIO初始化——部分
	key_Config();		//直接调用上一章中key.c的按键初始化部分
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);	//将PA0映射到外部中断线0
	
	//外部中断初始化——部分
	KEY_NVIC.EXTI_Line = EXTI_Line0;												// 中断线:0 
	KEY_NVIC.EXTI_LineCmd = ENABLE;													// 使能
	KEY_NVIC.EXTI_Mode = EXTI_Mode_Interrupt;								// 产生 中断
	KEY_NVIC.EXTI_Trigger = EXTI_Trigger_Falling;						// 下降沿 触发
	EXTI_Init(&KEY_NVIC);
	
	//中断优先级 初始化
	key_NVIC.NVIC_IRQChannel = EXTI0_IRQn;
	key_NVIC.NVIC_IRQChannelCmd = ENABLE;
	key_NVIC.NVIC_IRQChannelPreemptionPriority = 2;
	key_NVIC.NVIC_IRQChannelSubPriority = 2;
	NVIC_Init(&key_NVIC);
}


void EXTI0_IRQHandler(void)
{
	delay_ms(10);
	
	if(KEY_1 == 0)
		LED_2 = ~LED_2;
	
	EXTI_ClearITPendingBit(EXTI_Line0);		//清除中断 标志位
}

注意:EXTI0_IRQn 在 smt32f10x.h 文件中,EXTI0_IRQHandler 在 startup_stm32f10x_hd.s 文件中。


总结

以上就是STM32F103C8T6 按键触发外部中断 的教程,今天的分享就到这里,如有不足还望大家见谅!!!

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值