QianFan 发表于 2014-12-16 11:33:09

Arduino Due是如何进入串口中断的呢?

今天在移植Arduino的时候,一直不明白Due是如何进入串口中断的。Due是在串口中断中接收字符,并将其存储。有下面的代码:
void USARTClass::IrqHandler( void )
{
uint32_t status = _pUsart->US_CSR;

// Did we receive data ?
if ((status & US_CSR_RXRDY) == US_CSR_RXRDY)
    _rx_buffer->store_char( _pUsart->US_RHR ) ;

// Acknowledge errors
if ((status & US_CSR_OVRE) == US_CSR_OVRE ||
                  (status & US_CSR_FRAME) == US_CSR_FRAME)
{
        // TODO: error reporting outside ISR
    _pUsart->US_CR |= US_CR_RSTSTA;
}
}

这个代码到时不难,能看懂,但是不知道这个中断是如何进入的。
希望了解的能够给点提示。

QianFan 发表于 2014-12-16 11:38:36

哈哈哈,问题应经找到:
// IT handlers
void USART0_Handler(void)
{
Serial1.IrqHandler();
}

void USART1_Handler(void)
{
Serial2.IrqHandler();
}

void USART3_Handler(void)
{
Serial3.IrqHandler();
}
但是不明白的是,在启动代码中,写的那些中断处理函数,能不能调用C++的函数呢?

奔跑小蜗牛 发表于 2014-12-16 14:18:07

噗。。你这自问自答解决的还蛮快的。。哈。。。
可以c调c++,得注意两点:
(1)中断函数单独做成xxx.c文件,并重命名为xxx.cpp,让编译器用C++的方式进行编译,从而include C++            的头文件不会报错。
(2)加 extern "C" 功能,告诉编译器不对根据形参类型重新命令函数名,使之与C函数名一致。

extern "C"{

   // IT handlers
    void USART0_Handler(void)
   {
   Serial1.IrqHandler();
    }

   void USART1_Handler(void)
   {
      Serial2.IrqHandler();
    }
    void USART3_Handler(void)
   {
      Serial3.IrqHandler();
   }



发表于 2014-12-16 14:22:13

STM32中断向量在START.S中可以查到,在工程中搜索对应的中断函数就可以查到代码了。

QianFan 发表于 2014-12-16 14:25:39

奔跑小蜗牛 发表于 2014-12-16 14:18
噗。。你这自问自答解决的还蛮快的。。哈。。。
可以c调c++,得注意两点:
(1)中断函数单独做成xxx.c文件 ...

不明白的地方就在这里,之前都是C++调用C,这次是C调用C++,感觉有点奇葩。在汇编的启动文件中,那些函数是C的还是C++的呢?我觉得是C的。。。

晓枫VS枯叶 发表于 2014-12-16 21:22:54

#include "mbed.h"

DigitalOut led1(LED1);
DigitalOut led2(LED2);

Serial pc(USBTX, USBRX);

void callback() {
    // Note: you need to actually read from the serial to clear the RX interrupt
    printf("%c\n", pc.getc());
    led2 = !led2;
}

int main() {
    pc.attach(&callback);
   
    while (1) {
      led1 = !led1;
      wait(0.5);
    }
}
看这个例子,这是一个串口中断的,主函数使能中断   pc.attach(&callback);   
callback就是中断服务函数,这是直接调用mbed API操作。 pc.getc()可以直接截取接收到的内容十分方便,建议去看看mbed 的库函数!

wambob 发表于 2014-12-16 22:17:00

STM32可以用C语言,C++是C的超级,肯定可以用,兼容性等待你去探索了:D

小贾-370388 发表于 2014-12-16 22:18:56

启动代码是汇编的
例如Default_Handler PROC

                EXPORTWWDG_IRQHandler                //这一句就是连接到了外部你编写的函数名了

QianFan 发表于 2014-12-17 10:40:27

小贾-370388 发表于 2014-12-16 22:18
启动代码是汇编的
例如Default_Handler PROC



这个外部函数是C语言的还是C++得呢?
页: [1]
查看完整版本: Arduino Due是如何进入串口中断的呢?