欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

STM32学习笔记整理之(2)外部中断

程序员文章站 2022-06-01 11:35:41
...

学习STM32也快一年了,现在工作的内容跟用的是STM32平台的,趁着年前工作量比较小,总结一下STM32的基础知识,不出意外的话将会连续发布完整的笔记整理,学习的时候主要是跟着野火教程学的,然后在整理出适合自己的笔记。 2.1NVIC 配置 1 、中断分组 在配置

学习STM32也快一年了,现在工作的内容跟用的是STM32平台的,趁着年前工作量比较小,总结一下STM32的基础知识,不出意外的话将会连续发布完整的笔记整理,学习的时候主要是跟着野火教程学的,然后在整理出适合自己的笔记。

2.1 NVIC配置

1、中断分组

在配置优先级的时候,NVIC 只可以配置 16 种中断向量的优先级,抢占优先级和响应优先级的数量由一个 4 位的数字来决定,把这个 4 位数字的位数分配成抢占优先级部分和响应优先级部分。

5 组分配方式:

0组:所有4位用来配置响应优先级。

1组:最高1位配抢占优先级,低3位配响应优先级。2^1=2 种抢占优先级(01)2^3=8 种响应优先级,

2组:2位配抢占优先级,2位配响应优先级。4种抢占优先级,4种响应优先级。

3组:高3位配抢占优先级,1位配响应优先级。8 种抢占优先级,2种响应优先级。

4组:所有4位配抢占优先级,16 种中断向量都是抢占属性,没有响应属性。

2、中断优先级

1STM32中断向量有抢占属性和响应属性,编号越小,级别越高。

2、抢占,是指打断其他中断的属性,即因为具有这个属性会出现嵌套中断

3、响应,当两个中断向量的抢占优先级相同时,如两个中断同时到达,则先处理响应优先级高的中断

3、中断通道

中断服务函数的名字必须要与启动文件startup_stm32f10x_hd.s 中的中断向量表定义一致(以下是相对应的表)

中断通道 中断服务函数 中断线路 中断引脚

EXTI0_IRQn EXTI0_IRQHandler ; EXTI Line 0 PA0~PG0

EXTI1_IRQn EXTI1_IRQHandler; EXTI Line 1 PA1~PG1

EXTI2_IRQn EXTI2_IRQHandler ; EXTI Line 2 PA2~PG2

EXTI3_IRQn EXTI3_IRQHandler ; EXTI Line 3 PA3~PG3

EXTI4_IRQn EXTI4_IRQHandler ; EXTI Line 4 PA4~PG4

EXTI9_5_IRQn EXTI9_5_IRQHandler ; EXTI Line 9..5

EXTI15_10_IRQn EXTI15_10_IRQHandler ; EXTI Line 15..10

4、代码

static void NVIC_A11exti_inti(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //选择中断分组1

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //选择中断通道0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占式中断优先级设置
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //响应式中断优先级设置
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure);
}

2.1 外部中断配置

1、使能 EXTIx 线的时钟和第二功能 AFIO 时钟

2、配置 EXTIx 线的中断优先级(NVIC

3、配置GPIO引脚

4、配置为 EXTI模式和中断线路


void EXTI_PA0_inti(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO宏操作的结构体
EXTI_InitTypeDef EXTI_InitStructure;//定义EXTI宏操作的结构体
EXTI_ClearITPendingBit(EXTI_Line0);//清空中断标志

/*config the exitline clock and AFIO clock*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);//使能GPIO时钟


/*config the NVIC*/
NVIC_A11exti_inti();//配置中断


/*EXTI line gpio config*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //选定引脚号
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//配置输出

/*EXYI line mode config*/
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);//选择中断引脚
EXTI_InitStructure.EXTI_Line = EXTI_Line0;//选择中断线路0
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//设置为中断请求,非事件请求
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿中断

EXTI_InitStructure.EXTI_LineCmd = ENABLE;//外部中断使能
EXTI_Init(&EXTI_InitStructure);
}


2.1 服务函数

void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
//uart_sendStr(USART1,"q ");
EXTI_ClearITPendingBit(EXTI_Line0);
}
}