今天在看stm32的中断,一时间不理解stm32主函数是如何进入中断函数的,按C编程的理解,会有个特定的入口之类的,但是看demo过程中没有发现入口。
以串口中断服务函数void USART1_IRQHandler(void) 为例,首先用到串口中断,需要先设定串口中断初始化以及串口初始化,另外void USART1_IRQHandler(void) 中断服务函数也应该写好。
发现在stm32的启动文件startup_stm32f10x_md.s中写到
DCD USART1_IRQHandler
其中DCD是一条数据定义伪指令,用于分配一片连续的字存储单元并用指定的数据初始化。
库里定义 #define USART1 ((USART_TypeDef *) USART1_BASE)
同时 #define USART1_BASE (APB2PERIPH_BASE + 0x3800)
当配置好USART1的控制寄存器中断使能时,当发生中断(异常)时,该异常被Cortex-M3内核接受,对应的异常Handler就会执行。而这个响应过程都是硬件来完成的,当然为了决定Handler的入口地址,Cortex-M3使用了“向量表查表机制”。startup_stm32f10x_md.s启动文件已经为USART1_IRQHandler赋予了该地址。所以在异常发生后,CPU进入异常模式,同时程序计数器PC自动指向异常入口地址,也就是USART1_IRQHandler,进而执行中断服务函数中的应用。执行完之后再回到主函数继续执行。
关键字:STM32 中断服务函数 xxx_IRQHandler
引用地址:
STM32是如何进入中断服务函数xxx_IRQHandler的
推荐阅读最新更新时间:2024-11-11 10:59
stm32 环形缓冲区
/*========================ringbuff.H========================================*/ #ifndef __RingBuff__H #define USER_RINGBUFF 1 //使用环形缓冲区形式接收数据 #if USER_RINGBUFF /**如果使用环形缓冲形式接收串口数据***/ #define RINGBUFF_LEN 200 /*最好是2^N,此时就可以进行用取模运算 https://www.cnblogs.com/rechen/p/5143841.html*/ #define FLASE 1 #define TRUE 0 #define TI
[单片机]
STM32高级开发(11)-使用GDB调试你的工程
在GNU编译器中,GDB无疑起着无足轻重的位置,常言有道:写工程3分靠写,7分靠调。GDB作为GNU编译器下的标准调试工具,在我们的项目编写即调试过程中会被平凡的使用到。而由于我们在IDE环境下娇生惯养出来的习惯,我们可能不太容易上手一个用命令行为主要操作和显示形式的调试器。所以在这篇中我们会为大家详细的讲解GDB工具的使用,来让大家快速的入门。 怎样启动arm-none-eabi-gdb 之前我们在安装和介绍调试器驱动的时候,曾举过例子,来使用指令开启一个操作接口,用以为gdb程序提供连接。这就是嵌入式GDB的工作方式,详细来说就是,使用调试器的驱动软件指令将调试器连接目标板,并将驱动软件的GDB指令接口开启在一个设定的计算
[单片机]
STM32之模拟I2C读取加速度传感器
前言:由于之前学会了SPI,软硬件SPI都会了,发现只要读懂时序图,其他都是小菜一碟,I2C也是如此,不过本少爷还是花了1天时间去理解了I2C的一些知识,发现模拟比硬件更能理解其中的工作原理,虽然速度慢点。 废话:时间有限,暂时写一点核心内容,该内容本人从MMA8451Q加速度传感器的手册上读的。坑爹的新浪居然不支持我上传图片,很无奈 正文: ------------------------------------------------模拟I2C---------------------------------------------------- 1.start 2.写入7位device地址+1位写W 3.等待从设备握
[单片机]
STM32中断函数名
和普通的ARm裸板开发不同。使用stm32库函数编程时,中断函数名是固定死的。 具体函数名可以在启动文件startup_stm32fxxx_xd.s的Vector Table Mapped(中断函数向量表)中查看。 启动文件 startup_stm32fxxx_xd.s里面都是汇编代码 ; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY EXPORT __Vectors EXPORT __Vectors_End EXPORT __Vectors_Size __V
[单片机]
STM32单片机(3) 串口中断通信
注:使用普中科技开发板测试时,需要拔掉Boot1短接帽 两根下载线也要拿掉,重启 /******************************************************************************* * * 软件功能: 串口实验(软件延时方式) * *******************************************************************************/ #include stm32f10x.h #include string.h #include delay.h u8 uart1_
[单片机]
【实验一】跑马灯实验
一、实验目的 通过控制战舰STM32开发板上的两个LED灯:DS0和DS1交替闪烁,实现类似跑马灯的效果。 二、STM32 IO简介 STM32 的每个 IO 端口都有 7 个寄存器来控制。他们分别是:配置模式的 2 个 32 位的端口配置寄存器 CRL 和 CRH; 2 个 32 位的数据寄存器 IDR 和 ODR; 1 个 32 位的置位/复位寄存器BSRR;一个 16 位的复位寄存器 BRR; 1 个 32 位的锁存寄存器 LCKR。 8种模式: 1、 输入浮空 2、 输入上拉 3、 输入下拉 4、 模拟输入 5、 开漏输出 6、 推挽输出 7、 推挽式复用功能 8、 开漏复用功能 IO 操作步骤:
[单片机]
STM32HAL库DMA模式串口收发
一.简单了解 串口模式实现有三种 1.普通模式:在主函数中接收函数 2.中断模式:产生的不影响主程序运行 3. DMA模式:与主函数互不影响,独立运行 本文记录第一种普通模式。 学习目标是:实现DMA串口的数据收发,发送数据时LED灯电平翻转。 二.步骤 1-在原来工程基础上,在stm32cubemx中增加dma,usart1中的DMA Settings,ADD USART1_RX循环接收和USART1_TX单次发送 2-添加MDA宏定义代码 #define UART1_DMA uint8_t TdataDMA ={ welcome to uart DMA!rn }; uint8_t Rdata; 3-在主函数添加
[单片机]
Stm32固件库中关于NART的误解
Stm32 固件库中关于NART的误解 禁止自动重传模式(NART) 该模式主要用于满足CAN标准中,时间触发通信选项的需求。通过对CAN_MCR寄存器的NART位置’1’,来让硬件工作在该模式。 在该模式下,发送操作只会执行一次。如果发送操作失败了,不管是由于仲裁丢失或出错,硬件都不会再自动发送该报文。 网上有很多can的程序在注释的时候有这样的错误: 将 CAN_InitStructure.CAN_NART=DISABLE理解成为失能自动重传 但是NART的英文全称应该是no automatic retransmission,也就是没有自动重传。 那么CAN_InitStructure.CAN_NART=DISABLE的
[单片机]