单片机学习小组
登录
直播中
刘慧
7年用户
1706经验值
私信
关注
怎样去编写外部中断的服务函数呢
开启该帖子的消息推送
外部中断
GPIO
NVIC
如何对GPIO进行初始化呢?
怎样去调用NVIC初始化函数呢?
怎样去编写外部中断的服务函数呢?
回帖
(1)
王明
2022-3-1 09:45:10
①初始化GPIO;
②初始化NVIC;;
③初始化EXTI
④编写中断服务函数。
①初始化GPIO
开启所有外部中断源管脚对应的GPIO时钟和AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx|RCC_APB2Periph_AFIO, ENABLE)
定义GPIO初始化结构变量,
GPIO_InitTypeDef GPIO_InitStructure;
赋值结构变量各成员
GPIO_InitStructure.GPIO_Pin=管脚号0~15 ; .mode= GPIO_Mode_IN_FLOATING(浮空输入);
调用GPIO初始化函数:GPIO_Init(& GPIO_InitStructure);
如果有多个中断源,重复步骤3~4。
②初始化NVIC;
设置优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_n);
定义NVIC初始化结构变量,并赋值结构变量各成员
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel =中断号;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =抢占优先级;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =子优先级;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
调用NVIC初始化函数。
NVIC_Init(&NVIC_InitStructure);
如果有多个中断源,重复步骤2~3
③初始化EXTI
定义EXTI初始化结构变量 EXTI_InitTypeDef EXTI_InitStructure;
选择EXTI的信号源,设置外部中断配置寄存器AFIO_EXTICR相关位
GPIO_EXTILineConfig()
赋值结构变量各成员
EXTI_InitStructure.EXTI_Line =信号源
EXTI_InitStructure.EXTI_Mode =中断模式
EXTI_InitStructure.EXTI_Trigger =触发方式
调用EXTI初始化函数
EXTI_Init(&EXTI_InitStructure);
如果有多个外部中断源,重复步骤2~4.
④编写中断服务函数。
• 在启动文件startup_stm32f10x_hd.s 中我们预先为每个中断都写了一个中断服务函数,只是这些中断函数都是为空,为的只是初始化中断向量表。实际的中断服务函数都需要我们重新编写,为了方便管理,可以把中断服务函数统一写在stm32f10x_it.c 这个库文件中。
• 关于中断服务函数的函数名必须跟启动文件里面预先设置的一样,如果写错,系统就在中断向量表中找不到中断服务函数的入口,直接跳转到启动文件里面预先写好的空函数,并且在里面无限循环,实现不了中断。
• 对每个中断号编写中断服务函数,对于EXTI9-5 和EXTI15-10,多个中断源公用同一个中断号时,可以在中断服务函数中判断具体是哪一个中断源被触发,然后根据中断源编制相应的响应程序。
void EXTIx_IRQHandler(void); void EXTI9_5_IRQHandler(void)
• 重要提醒,中断服务函数中,为确保确实产生了中断请求,通常需要检查一下状态标识位确认确实产生了该中断。同时,为避免一次中断请求执行多次中断服务程序,中断服务程序最后需要清除该中断标识位。例如:
if(EXTI_GetITStatus(KEY3_INT_EXTI_LINE) != RESET) //确保是否产生了EXTI Line中断
{…
EXTI_ClearITPendingBit(KEY3_INT_EXTI_LINE); //清除中断标志位
}
①初始化GPIO;
②初始化NVIC;;
③初始化EXTI
④编写中断服务函数。
①初始化GPIO
开启所有外部中断源管脚对应的GPIO时钟和AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx|RCC_APB2Periph_AFIO, ENABLE)
定义GPIO初始化结构变量,
GPIO_InitTypeDef GPIO_InitStructure;
赋值结构变量各成员
GPIO_InitStructure.GPIO_Pin=管脚号0~15 ; .mode= GPIO_Mode_IN_FLOATING(浮空输入);
调用GPIO初始化函数:GPIO_Init(& GPIO_InitStructure);
如果有多个中断源,重复步骤3~4。
②初始化NVIC;
设置优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_n);
定义NVIC初始化结构变量,并赋值结构变量各成员
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel =中断号;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =抢占优先级;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =子优先级;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
调用NVIC初始化函数。
NVIC_Init(&NVIC_InitStructure);
如果有多个中断源,重复步骤2~3
③初始化EXTI
定义EXTI初始化结构变量 EXTI_InitTypeDef EXTI_InitStructure;
选择EXTI的信号源,设置外部中断配置寄存器AFIO_EXTICR相关位
GPIO_EXTILineConfig()
赋值结构变量各成员
EXTI_InitStructure.EXTI_Line =信号源
EXTI_InitStructure.EXTI_Mode =中断模式
EXTI_InitStructure.EXTI_Trigger =触发方式
调用EXTI初始化函数
EXTI_Init(&EXTI_InitStructure);
如果有多个外部中断源,重复步骤2~4.
④编写中断服务函数。
• 在启动文件startup_stm32f10x_hd.s 中我们预先为每个中断都写了一个中断服务函数,只是这些中断函数都是为空,为的只是初始化中断向量表。实际的中断服务函数都需要我们重新编写,为了方便管理,可以把中断服务函数统一写在stm32f10x_it.c 这个库文件中。
• 关于中断服务函数的函数名必须跟启动文件里面预先设置的一样,如果写错,系统就在中断向量表中找不到中断服务函数的入口,直接跳转到启动文件里面预先写好的空函数,并且在里面无限循环,实现不了中断。
• 对每个中断号编写中断服务函数,对于EXTI9-5 和EXTI15-10,多个中断源公用同一个中断号时,可以在中断服务函数中判断具体是哪一个中断源被触发,然后根据中断源编制相应的响应程序。
void EXTIx_IRQHandler(void); void EXTI9_5_IRQHandler(void)
• 重要提醒,中断服务函数中,为确保确实产生了中断请求,通常需要检查一下状态标识位确认确实产生了该中断。同时,为避免一次中断请求执行多次中断服务程序,中断服务程序最后需要清除该中断标识位。例如:
if(EXTI_GetITStatus(KEY3_INT_EXTI_LINE) != RESET) //确保是否产生了EXTI Line中断
{…
EXTI_ClearITPendingBit(KEY3_INT_EXTI_LINE); //清除中断标志位
}
举报
更多回帖
rotate(-90deg);
回复
相关问答
外部中断
GPIO
NVIC
如何在STM32
中断
服务
函数
中去
编写
usart
函数
呢
2021-12-08
1032
怎样
去
操作STM32的
外部
中断
呢
2021-11-16
644
单片机的
中断
是指什么?
怎样
去
编写
中断
服务
子程序?
2021-07-01
926
怎样
去
编写
usart.c串口
中断
处理
函数
呢
2021-12-09
1419
如何
去
实现STM32
外部
中断
的设计
呢
2021-11-24
600
怎样
去
编写
定时器的初始化与
服务
函数
程序
呢
2022-02-23
1070
STM32F103的
外部
中断
要
怎样
去
使用
呢
2022-03-01
1395
STM32
外部
中断
函数
如何
编写
?
2021-11-17
534
怎样
去
采用
外部
中断
测频和定时器输入捕获
去
测占空比
呢
2021-11-19
1001
如何对
中断
处理
函数
进行配置
呢
2021-12-23
1071
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分