基于STM32的stm32f4xx_it.c的中断分析

一、前提

学习了STM32CubeMX,但是网上教程很多都是只是过程,没有太多细致的东西,所以自己写一下,有啥错误,请各位大佬指教,互相学习。

二、工具:

1、芯片:STM32F4ZET6系列
2、软件:MDK-Keil、STM32CubeMx

三、分析函数

void NMI_Handler(void);
void HardFault_Handler(void);
void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);

1、void NMI_Handler(void)
不可屏蔽的中断:
2、void HardFault_Handler(void)
处理硬故障中断
以下异常处理被关闭,而又发生了异常,则触发
• 执行异常处理时,发生了异常,则触发
• 复位时默认使能
传说中的段错误。主要原因两方面:(1)中断问题,例如中断嵌套太多,中断优先级问题,中断标志位没清楚等;(2)堆栈不够或者溢出,例如:当你需要大数组去存取数据,数组就会设置的太大,就会跑飞进入这个中断,这时候你可以把栈堆分配多一点
3、void MemManage_Handler(void)
内存管理类故障处理功能
• 违反MPU设定的存储器访问规则
• 复位时默认未使能
在内核的MCU上写程序时,稍不留神,就可能出现内存溢出的情况。即,数组、指针变量溢出,导致MCU访问内部禁止访问的地址上。这样MCU就会跳转到 错误或者硬件错误中断上去,造成设备死机。也可以在这两个中断中加入强制CPU复位重启,但不能完全解决问题,其实发生存储管理错误中断(MemManage_Handler)后,都发现程序是跳到硬件错误中断(HardFault_Handler)里,说白了又是内存布局问题
4、void BusFault_Handler(void);
处理预取故障、内存访问故障。
• 总线错误(Bus Fault)
• 取指令、数据读写、堆栈操作
• 复位时默认未使能
5、void UsageFault_Handler(void);
函数处理未定义指令或非法状态
• 用法错误(Usage Fault)
• 执行未定义指令、非对齐操作、除零
• 复位时默认未使能
6、void SVC_Handler(void);
通过SWI指令处理系统服务调用
7、void DebugMon_Handler(void);
调试监视器(断点, 数据观察点, 或外部调试请求),大部分debug的时候就是调试的时候遇到
8、void PendSV_Handler(void);
PendSV是为系统级服务提供的中断驱动。在一个操作系统环境中,当没有其他异常正在执行时,可以使用PendSV来进行上下文的切换。
在进入PendSV处理函数时:
(1)xPSR、PC、LR、R12、R0~R3已经在处理栈中被保存。
(2)处理模式切换到线程模式。
(3)栈是主堆栈。
由于PendSV在系统中被设置为最低优先级,因此只有当没有其他异常或者中断在执行时才会被执行。

9、void SysTick_Handler(void);
看到这个大家肯定会想到滴答定时器,就是系统定时器 , 以后再分享个系统定时器的内容,在参考手册中, 有这样说法, 当systic为计数为0 则成1外部参考时钟源 21mhz bit[2]为0 内核时钟168MHZ bit[2] 为1 ,使能定时器中断为1,当计数产生为0产生中断,或者将bit[1]0使能位(0关闭,1打开, 系统定时器中断 一般用在操作系统的延时 。

原文链接:https://blog.csdn.net/hyk687/article/details/126695965

  • 14
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值