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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版