最近老板要我去做控制方面的内容,所以买了一块正点原子的开发板,现在是研究了一下usart.c,函数的代码如下:

void USART1_IRQHandler(void) 
        {
        u8 Res;
        #ifdef OS_TICKS_PER_SEC //串口 1 中断服务程序//如果时钟节拍数定义了,说明要使用 ucosII 了.OSIntEnter();
        #endif
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        //接收中断(接收到的数据必须是 0x0d 0x0a 结尾)
        {
        Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
        if((USART_RX_STA&0x8000)==0)//接收未完成
        {
        if(USART_RX_STA&0x4000)//接收到了 0x0d 
        {
        if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
        else USART_RX_STA|=0x8000; //接收完成了 
        
        }
        else //还没收到 0X0D
        {
        if(Res==0x0d)USART_RX_STA|=0x4000;
        else
        { 
        
        USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
        USART_RX_STA++;
        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
        //接收数据错误,重新开始接收
        }
        }
        }
        }
        #ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用 ucosII 了.
        OSIntExit(
    
    );
    #e

ndif
}

  这里我生出了一个疑惑——中断函数是如何进入的,当初学习51系列单片机的时候我们知道,我们是特别设定了一个中断入口的,但是在stm32的编程中,我们并没有使用多线程之类的手段。因此,我翻看了原子哥串口部分的主函数代码,以及串口通信实验的各种文件,希望能找到关于中断链接之类的代码(与主要内容无关这里便不列出),但是并没有。之后我再网上各种平台翻看了一下,同时想到了我们在编写stm32代码前会先导入一个与芯片相关的.s汇编文件,因此最终我在汇编文件中找到如下内容:

           DCD     I2C1_EV_IRQHandler         ; I2C1 Event
                DCD     I2C1_ER_IRQHandler         ; I2C1 Error
                DCD     I2C2_EV_IRQHandler         ; I2C2 Event
                DCD     I2C2_ER_IRQHandler         ; I2C2 Error
                DCD     SPI1_IRQHandler            ; SPI1
                DCD     SPI2_IRQHandler            ; SPI2
                DCD     USART1_IRQHandler          ; USART1
                DCD     USART2_IRQHandler          ; USART2
                DCD     USART3_IRQHandler          ; USART3    

  其中DCD是一条数据定义伪指令,用于分配一片连续的字存储单元并用指定的数据初始化。USART1_IRQHandler就是我们所定义的中断函数,因此我个人猜测这里是定义了一个异常的入口,发生对应的异常时会进入对应的入口。也就是说.s文件中便将这些定义了。