在stm32单片机的编程时,中断函数的名称都是“xxx_Handler()”格式。这是固定的格式吗?编译的时候是怎么知道这是一个中断函数?哪里有注明?
我们知道,每个中断都是有入口地址的。程序在执行过程中遇到中断的时候,会先判断这个中断的类型,根据类型再到中断向量表中查找,找到之后,根据表中指明的地址,程序就跳到该地址开始执行代码。
ST提供的旧版本固件库(V3.0.0及以前),有提供一个stm32f10x_it.c文件,打开之后会发现里面放的都是些空函数,但是名字都是“xxx_Handler()”格式,需要使用某个中断的时候,在代码中使能该中断,并到这个文件中将中断服务函数添加上,就OK了。但是较新版本的库里没有了这个文件,用户要使用中断服务函数的时候,得自己在文件中声明然后实现它,并且函数名还是得用那种格式。
为什么呢?
因为这些名字就是一个个的中断函数入口地址。在哪里定义了这些名字呢?答案是:启动代码中。
打开启动代码文件,能看到以下信息:
可以看到,定义了一个个名称,这些名称就是中断函数入口的地址,用这些名称来代替具体的地址值,有两个好处:一是编程时简化了,二是由于不同芯片的入口初始地址可能不同,用名字代替,可移植性较强。
所以要使用中断的话,中断函数就要用上面说的那种格式。当然你觉得不爽的话,可以到启动代码里把这些名字给改了J
关键字:STM32 中断入口地址 中断服务函数
引用地址:
STM32中断入口地址与中断服务函数的关系
推荐阅读最新更新时间:2024-03-16 15:38
STM32单片机看门狗:独立看门狗和窗口看门狗有什么区别
早期的MCU没有看门狗,就容易引起有些产品死机了不能重启工作。为了避免这个问题,后期的MCU在内部集成了看门狗的功能。 为了满足更多使用场景,现在很多MCU都集成了两个看门狗:独立看门狗与窗口看门狗。 拿现在大家熟悉的STM32来说,都集成了独立看门狗和窗口看门狗,下面就展开来讲讲这个两个看门狗以及它们的区别。 独立看门狗 独立看门狗,顾名思义,就是独立的一个看门狗,由其专用低速时钟 (LSI) 驱动,因此,即便在主时钟发生故障时仍然保持工作状态。 IWDG 最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。 独立看门狗特性: 自由运行递减计数器 时钟由独立 RC
[单片机]
stm32_文件组织结构
以前给出完整程序时,是为了方便初学者看。将main函数用到的所有函数都放到main函数后,在main函数前加上函数声明,这样会显得main.c文件没有层次,所有函数在main.c中冲淡了功能代码。 一般项目中的文件组织结构是这样的:main.c文件只包含体现功能的代码。 main.c头文件只包含两个 #include stm32f0xx.h #include hw_config.h 接下是用户自定义的宏,这些宏也要是跟功能息息相关的,说白了就是main函数用到的,如果跟功能不直接相关,可以放到hw_config.h定义,如GPIO管脚的定义 #define OE GPIO_Pin_5
[单片机]
STM32 串口调试UART1,调试笔记1
Usart1重新初始化之后,再次发送数据的时候,就会死在 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); 解决方法:注释掉原程序中的 // USART_ClearFlag(USART1, USART_FLAG_TC);
[单片机]
stm32的PWM实现过程
stm32的PWM实现过程 PWM是定时器扩展出来的一个功能(本质上是使用一个比较计数器的功能),配置过程一般为选定定时器、复用GPIO口、选择通道(传入比较值)、使能相应系统时钟、设定相应的预分频、计数周期、PWM模式(有两种)、电平极性等。具体介绍如下: 一、定时器的特点归类 STM32中一共有11个定时器,即 2个看门狗定时器、1个系统嘀嗒定时器(SysTick)及8个Timer定时器,详情如下表所示。 二、定时器所在时钟线路 三、PWM波形产生的原理 通用定时器可以利用GPIO引脚进行脉冲输出,在配置为比较输出、PWM输出功能时,捕获/比较寄存器TIMx_CCR被用作比较功能,下
[单片机]
STM32学习记录——printf函数重定位
功能: 重定位printf函数,使printf作为串口打印输出函数。代替usart_send_string()函数 步骤: usart.c中包含USART初始化函数 1、USART初始化(使能时钟、使能GPIO、GPIO和USART初始化) 2、打开USART 3、在usart.c中加入如下代码 #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker- Libraries- Small printf set to 'Yes') calls __io_putchar() */ #define PUT
[单片机]
STM32之BKP例程
#include stm32f10x.h /* RCC时钟配置 */ void RCC_config(void) { ErrorStatus HSEStartUpStatus; /* RCC寄存器设置为默认配置 */ RCC_DeInit(); /* 打开外部高速时钟 */ RCC_HSEConfig(RCC_HSE_ON); /* 等待外部高速时钟稳定 */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { /* 设置HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SY
[单片机]
STM32的GPIO在实际开发设计的使用配置和技巧
一、前言 本篇开始对STM32的GPIO在实际开发设计中的使用配置和技巧进行探讨,可以先去回顾下之前介绍的GPIO的相关理论基础知识包括基本结构,工作模式和寄存器原理。 了解过STM32的GPIO相关的理论知识,这样在应用GPIO开发过程中,能更好的理解GPIO的特点,应用起来会更加的得心应手。 后续将从以下图1中所示的几个方面对GPIO应用设计中的步骤展开介绍。本篇先介绍GPIO的基本API函数定义,配置初始化的流程,以及使用技巧;针对将GPIO的引脚用于外部中断的功能将作为单独的一篇进行详细的讨论介绍。 图1 GPIO应用设计 二、API函数 STM32有多种类型的库,本节所介绍的STM32的GPIO函数接口是ST
[单片机]
STM32硬件IIC操作解析
IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司在八十年代初设计出来的一种简单、双向、二线制、同步串行总线,主要是用来连接整体电路(ICS) ,IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。这种方式简化了信号传输总线接口。 I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。 为了避免总线信号的混乱,要求各设备连接到总线的输出端时必须是漏极开路(OD)输出或
[单片机]