在STM32单片机的编程当中,中断函数的名称都是xxx_IRQHandler格式的。那当编译程序的时候是怎么知道这是一个中断函数的呢?
每个中断都是有入口地址的。程序在执行过程中遇到中断的时候,会先判断这个中断的类型,根据类型再到中断向量表中查找,找到之后,根据表中指明的地址,程序就跳到该地址开始执行代码。
ST提供的固件库当中,有提供一个stm32f10x_it.c文件,打开之后会发现里面放的都是些空函数,但是名字都是“xxx_Handler()”格式,需要使用某个中断的时候,在代码中使能该中断,并到这个文件中将中断服务函数添加上,就可以了。
而这些名字就是一个个的中断函数入口地址。在启动代码中便有这些定义。如下图所示:
可以看到,里面定义了一个个名称,这些名称就是中断函数入口的地址,用这些名称来代替了具体的地址值。
其中DCD是一条数据定义伪指令,用于分配一片连续的字存储单元并用指定的数据初始化。 当配置好相应外设的控制寄存器中断使能时,当发生中断(异常)时,该异常被Cortex-M3内核接受,对应的异常Handler就会执行。而这个响应过程都是硬件来完成的,当然为了决定Handler的入口地址,Cortex-M3使用了“向量表查表机制”。startup_stm32f10x_hd.s启动文件已经为相应外设的中断服务函数赋予了相应的地址。所以在异常发生后,CPU进入异常模式,同时程序计数器PC自动指向异常入口地址,进而执行中断服务函数中的应用。
关键字:stm32 中断函数
引用地址:
STM32是怎样进入执行中断函数xxx_IRQHandler(void)的
推荐阅读最新更新时间:2024-03-16 15:42
向STM32串口发送数据的标准函数
例子:1 void UART_Send_Message(u8 *Data,u8 lenth) { while(lenth--) { USART_SendData(USART2, *Data); while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); Data++; } } void main() { u8 Sendbuf ; Sendbuf =0xA0; Sendbuf =0xA0; Sendbuf =0xA0; UART_Send_Message(Sendbuf,3); } 例子2:
[单片机]
【STM32】HAL库-电源控制(低功耗模式)
电源框图 ADC单独供电 为了提高转换的精确度,ADC使用一个独立的电源供电,过滤和屏蔽来自印刷电路板上的毛刺干扰。 ADC的电源引脚为VDDA 独立的电源地VSSA 电池备份区域 当VDD断电时,可以保存备份寄存器的内容和维持RTC的功能。 VBAT为RTC、LSE(低速外部时钟)振荡器、备份寄存器和PC13至PC15供电。 当备份区域由VDD(内部模拟开关连到VDD)供电时,下述功能可用: PC14和PC15可以用于GPIO或LSE引脚 PC13可以作为通用I/O口、TAMPER引脚、RTC校准时钟、RTC闹钟或秒输出 当后备区域由VBAT供电时(VDD消失后模拟开关连到VBAT),可以使用下述功能:
[单片机]
STM32开发笔记25:STM32L0低功耗设计-使用Keil和ST-Link下载程序
单片机型号:STM32L053R8T6 继续项目的开发工作,突然发现,程序不能够正常下载到单片机中了,提示如下图所示的错误,我使用的是keil和ST-Link。 这个问题在我第1次调试的时候发生过1次,我认为是我误操作将芯片烧坏了,因为当时又反复的焊接了一下芯片,也没有修好,就把这件事情放下了。 今天再次出现,自己感觉可能和低功耗有关,仔细查看刚刚下载的程序,里面上来程序就进入低功耗,没有任何退出语句,所以应该是CPU不响应下载命令了。 按照这种思路,先将单片机的复位引脚接地,然后点击下载按钮的同时,放开复位引脚,居然成功了。 再仔细想不应该呀,ST-Link控制着复位引脚了,应该在下
[单片机]
初学者如何处理STM32创建工程时stm32_eval.h的问题
环境:win10-MDK:5.15-固件库:3.5.0 1.先说对初学者来讲的解决办法 删除main.c中的所有定义和函数。只写上main(){},其他的什么都不用加。并在最后另起一行。(不另起一行会提示“without a newline”的警告。)不知道和Linux里用GCC编译程序的no newline是不是一个原因。因为文件最后表示连接下一行,而如果文件最后一行行尾有,被包含的下一个源文件会被连接。但要是最后一行用的是空行,就可以避免这种情况了。 C99原文: Each instance of a backslash character ()immediately followed by a new-line
[单片机]
stm32,ov7670识别二值化并识别黑色物体,串口返回坐标值
自己网上找的代码,根据要求修改可二值化,识别黑色物体,用红色框框框起来,串口返回坐标值 单片机源程序如下: #include led.h #include delay.h #include key.h #include sys.h #include lcd.h #include usart.h #include string.h #include ov7670.h #include tpad.h #include timer.h #include exti.h #include usmart.h #include EasyTracered.h const u8*LMODE_TBL ={
[单片机]
STM32基础9--串口通信(UART)
UART传输方式 UART(Universal Asynchronous Receiver Transmitter),异步串口没有时钟信号,也没有硬件控制流信号。只有Tx(串行输出信号)与Rx(串行输入信号)。 在STM32F407中,串口数据传输有两种方式:阻塞与非阻塞。 1)阻塞:轮询的方式,就是发送缓冲器的数据,直到数据传输完成或者超时后,函数才返回; 2)非阻塞:启动发送缓冲区数据后,立即返回,传输完成后可以触发中断。 注:在51单片机中的UART通方式类似,也是通常使用阻塞发送数据, 而非阻塞通常用来接收数据。 PC端与STM32进行串口通讯 在当前的PC(个人电脑),基本上已将不支持串口了。因此需
[单片机]
【STM32】串口相关配置寄存器、库函数(UART一般步骤)
STM32F1xx官方资料: 《STM32中文参考手册V10》-第25章通用同步异步收发器(USART) 串口相关配置寄存器 状态寄存器(USART_SR) 状态寄存器适用于检测串口此时所处的状态。它能够检测到的状态有:发送寄存器空位、发送完成位、读数据寄存器非空位、检测到主线空闲位、过载错误为等等。 这边主要关注两个位:RXNE和TC(第5、6两位)。 RXNE(读数据寄存器非空):当该位被置1的时候,就是提示已经有数据被接收到了,并且可以读出来了(即RDR移位寄存器中的数据被转移到USART_DR寄存器中)。这时候要做的就是尽快读取USART_DR,从而将该位清零,也可以向该位写0,直接清除。
[单片机]
基于STM32物联网开发板(4)--LCD屏
1.概述 屏幕尺寸为1.3寸,分辨率240*240,颜色格式RGB565,驱动IC:ST7789VW; 超大可视角度:大于160°(显示屏中可视角度最大的一种屏幕); 宽电压供电(3V~5V),兼容3.3V和5V电平逻辑,无需电平转换芯片; 采用7线制SPI接口; 工作温度范围为工业级(-20℃~60℃); 军工级工艺标准,长期稳定工作; 硬件接口: 引脚 说明 LEDK PB0背光 CS PA4片选 SCL PA5时钟 SDA PA7主机输出 RES PB1复位脚(电平复位) D/C PC4数据命令选择脚 2.通讯协议 ST7789VW是一款用于262K彩色图形型TFT-LCD的单片
[单片机]