你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
QianFan 提问时间:2014-12-16 11:33 /
今天在移植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;
  }
}

这个代码到时不难,能看懂,但是不知道这个中断是如何进入的。
希望了解的能够给点提示。
收藏 评论8 发布时间:2014-12-16 11:33

举报

8个回答
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的超级,肯定可以用,兼容性等待你去探索了
小贾-370388 回答时间:2014-12-16 22:18:56
启动代码是汇编的
例如Default_Handler PROC

                EXPORT  WWDG_IRQHandler                [WEAK] //这一句就是连接到了外部你编写的函数名了
QianFan 回答时间:2014-12-17 10:40:27
小贾-370388 发表于 2014-12-16 22:18
启动代码是汇编的
例如Default_Handler PROC

这个外部函数是C语言的还是C++得呢?

所属标签

相似问题

关于 意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版