您的位置:首页 > 其它

第十二章:STM32是如何进入中断函数xxx_IRQHandler的

2018-01-06 19:37 302 查看
STM32是如何进入中断函数xxx_IRQHandler的,如:void USART1_IRQHandler(void) 

前段时间开始接触STM32的时候遇到这样一个问题,程序里面配置好中断设置时,程序运行的时候是怎么进入中断函数的(当然这里所说的中断都是硬件中断),因为跑C程序的时候,本人的理解是,你总得有个“接力棒”或者一个“入口”吧,它才能进入到下一个函数中去。 

以uart1配置作为例子, 

//中断初始化 

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); 

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; 

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

NVIC_Init(&NVIC_InitStructure);

/串口初始化 

USART_StructInit(&USART_InitStructure); //串口一用默认配置 

USART_Init(USART1, &USART_InitStructure); //初始化串口 

USART_Cmd(USART1, ENABLE); //使能串口

USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //关闭发送缓冲区空中断 

USART_ITConfig(USART1, USART_IT_TC , ENABLE); //发送完成中断 

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //接收中断 

USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); //接收空闲中断

当中断发生时,程序响应stm32f10x_it.c中的中断服务函数 

void USART1_IRQHandler(void) 

{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR  cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
OSIntEnter();
OS_EXIT_CRITICAL();

UartISR(U1ART);
OSIntExit();
1
2
3
4
5
6
7
8
9
10



那么程序是如何找到它的呢?在启动文件startup_stm32f10x_md.s中有这样一段代码,汇编 

DCD USART1_IRQHandler 

其中DCD是一条数据定义伪指令,用于分配一片连续的字存储单元并用指定的数据初始化。 

还有一些如PUBWEAK USART1_IRQHandler等,具体意思不是很清楚。 

库里定义 #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,进而执行中断服务函数中的应用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐