搜索
查看: 7632|回复: 8

[讨论] Arduino Due是如何进入串口中断的呢?

[复制链接]

该用户从未签到

77

主题

2004

帖子

5

蝴蝶豆

论坛元老

最后登录
2021-1-6
发表于 2014-12-16 11:33:09 | 显示全部楼层 |阅读模式
今天在移植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;
  }
}

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

使用道具 举报

该用户从未签到

77

主题

2004

帖子

5

蝴蝶豆

论坛元老

最后登录
2021-1-6
 楼主| 发表于 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++的函数呢?
回复 支持 反对

使用道具 举报

该用户从未签到

15

主题

232

帖子

0

蝴蝶豆

金牌会员

最后登录
2019-11-11
发表于 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();
   }



回复 支持 反对

使用道具 举报

该用户从未签到

133

主题

4688

帖子

239

蝴蝶豆

版主

最后登录
2021-4-10
发表于 2014-12-16 14:22:13 | 显示全部楼层
STM32中断向量在START.S中可以查到,在工程中搜索对应的中断函数就可以查到代码了。
回复 支持 反对

使用道具 举报

该用户从未签到

77

主题

2004

帖子

5

蝴蝶豆

论坛元老

最后登录
2021-1-6
 楼主| 发表于 2014-12-16 14:25:39 | 显示全部楼层
奔跑小蜗牛 发表于 2014-12-16 14:18
噗。。你这自问自答解决的还蛮快的。。哈。。。
可以c调c++,得注意两点:
(1)中断函数单独做成xxx.c文件 ...

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

使用道具 举报

该用户从未签到

10

主题

206

帖子

0

蝴蝶豆

金牌会员

最后登录
2020-7-18
发表于 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 的库函数!
回复 支持 反对

使用道具 举报

该用户从未签到

93

主题

2542

帖子

4

蝴蝶豆

论坛元老

最后登录
2021-5-9
发表于 2014-12-16 22:17:00 | 显示全部楼层
STM32可以用C语言,C++是C的超级,肯定可以用,兼容性等待你去探索了
回复 支持 反对

使用道具 举报

该用户从未签到

28

主题

171

帖子

3

蝴蝶豆

中级会员

最后登录
2018-7-31
发表于 2014-12-16 22:18:56 | 显示全部楼层
启动代码是汇编的
例如Default_Handler PROC

                EXPORT  WWDG_IRQHandler                [WEAK] //这一句就是连接到了外部你编写的函数名了
回复 支持 反对

使用道具 举报

该用户从未签到

77

主题

2004

帖子

5

蝴蝶豆

论坛元老

最后登录
2021-1-6
 楼主| 发表于 2014-12-17 10:40:27 | 显示全部楼层
小贾-370388 发表于 2014-12-16 22:18
启动代码是汇编的
例如Default_Handler PROC

这个外部函数是C语言的还是C++得呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-5-14 12:46 , Processed in 0.224187 second(s), 41 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表